You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by jo...@apache.org on 2017/03/21 23:11:24 UTC

[47/50] git commit: [flex-falcon] [refs/heads/master] - compiler-jx: source maps for fx:Script blocks

compiler-jx: source maps for fx:Script blocks


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/3ab47113
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/3ab47113
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/3ab47113

Branch: refs/heads/master
Commit: 3ab4711313c4a48d5c2dd01be6213e5cc4b3647a
Parents: 7a83126
Author: Josh Tynjala <jo...@apache.org>
Authored: Mon Mar 20 16:24:19 2017 -0700
Committer: Josh Tynjala <jo...@apache.org>
Committed: Tue Mar 21 16:07:16 2017 -0700

----------------------------------------------------------------------
 .../flex/compiler/codegen/INestingEmitter.java  |  26 +++
 .../flex/compiler/codegen/as/IASEmitter.java    |   3 +-
 .../flex/compiler/codegen/js/IJSEmitter.java    |  38 +---
 .../compiler/codegen/js/IMappingEmitter.java    |  66 +++++++
 .../flex/compiler/driver/js/IJSBackend.java     |   4 +-
 .../flex/compiler/internal/codegen/Emitter.java |  28 +++
 .../compiler/internal/codegen/as/ASEmitter.java |  31 +++-
 .../compiler/internal/codegen/js/JSEmitter.java |  16 ++
 .../internal/codegen/js/JSSourceMapEmitter.java |  10 +-
 .../compiler/internal/codegen/js/JSWriter.java  |   7 +-
 .../internal/codegen/mxml/MXMLWriter.java       |  25 ++-
 .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java  | 179 ++++++++++++++++++-
 .../mxml/flexjs/MXMLFlexJSPublisher.java        |  34 ----
 .../compiler/internal/driver/js/JSBackend.java  |   3 +-
 .../internal/test/SourceMapTestBase.java        |   5 +-
 15 files changed, 374 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/INestingEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/INestingEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/INestingEmitter.java
new file mode 100644
index 0000000..36889c5
--- /dev/null
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/INestingEmitter.java
@@ -0,0 +1,26 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.flex.compiler.codegen;
+
+public interface INestingEmitter extends IEmitter
+{
+    IEmitter getParentEmitter();
+    void setParentEmitter(IEmitter emitter);
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java
index 928259b..3716aba 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/as/IASEmitter.java
@@ -23,6 +23,7 @@ import java.io.Writer;
 
 import org.apache.flex.compiler.codegen.IDocEmitter;
 import org.apache.flex.compiler.codegen.IEmitter;
+import org.apache.flex.compiler.codegen.INestingEmitter;
 import org.apache.flex.compiler.definitions.IPackageDefinition;
 import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
 import org.apache.flex.compiler.tree.as.IASNode;
@@ -76,7 +77,7 @@ import org.apache.flex.compiler.visitor.IBlockWalker;
  * 
  * @author Michael Schmalle
  */
-public interface IASEmitter extends IEmitter
+public interface IASEmitter extends INestingEmitter
 {
     IBlockWalker getWalker();
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java
index b686a3a..f71eb90 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IJSEmitter.java
@@ -20,11 +20,8 @@
 package org.apache.flex.compiler.codegen.js;
 
 import java.io.Writer;
-import java.util.List;
 
-import com.google.debugging.sourcemap.FilePosition;
 import org.apache.flex.compiler.codegen.as.IASEmitter;
-import org.apache.flex.compiler.common.ISourceLocation;
 import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.internal.codegen.js.JSSessionModel;
 import org.apache.flex.compiler.tree.as.IASNode;
@@ -37,47 +34,14 @@ import org.apache.flex.compiler.visitor.IASNodeStrategy;
  * 
  * @author Michael Schmalle
  */
-public interface IJSEmitter extends IASEmitter
+public interface IJSEmitter extends IASEmitter, IMappingEmitter
 {
     JSSessionModel getModel();
-    List<SourceMapMapping> getSourceMapMappings();
     
     String formatQualifiedName(String name);
-
-    /**
-     * Adds a node to the source map.
-     */
-    void startMapping(ISourceLocation node);
-
-    /**
-     * Adds a node to the source map using custom line and column values,
-     * instead of the node's own line and column. Useful for starting a mapping
-     * in the middle of the node.
-     */
-    void startMapping(ISourceLocation node, int line, int column);
-
-    /**
-     * Adds a node to the source map after a particular node instead using the
-     * node's own line and column.
-     */
-    void startMapping(ISourceLocation node, ISourceLocation afterNode);
-
-    /**
-     * Commits a mapping to the source map.
-     */
-    void endMapping(ISourceLocation node);
     
     void emitSourceMapDirective(ITypeNode node);
     
     void emitClosureStart();
     void emitClosureEnd(IASNode node, IDefinition nodeDef);
-    
-    class SourceMapMapping
-    {
-        public String sourcePath;
-        public String name;
-        public FilePosition sourceStartPosition;
-        public FilePosition destStartPosition;
-        public FilePosition destEndPosition;
-    }
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IMappingEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IMappingEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IMappingEmitter.java
new file mode 100644
index 0000000..dc4bb6b
--- /dev/null
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/codegen/js/IMappingEmitter.java
@@ -0,0 +1,66 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.flex.compiler.codegen.js;
+
+import java.util.List;
+
+import org.apache.flex.compiler.common.ISourceLocation;
+
+import com.google.debugging.sourcemap.FilePosition;
+
+/**
+ * Tracks mappings to generate source maps while it emits code.
+ */
+public interface IMappingEmitter
+{
+    List<SourceMapMapping> getSourceMapMappings();
+
+    /**
+     * Adds a node to the source map.
+     */
+    void startMapping(ISourceLocation node);
+
+    /**
+     * Adds a node to the source map using custom line and column values,
+     * instead of the node's own line and column. Useful for starting a mapping
+     * in the middle of the node.
+     */
+    void startMapping(ISourceLocation node, int line, int column);
+
+    /**
+     * Adds a node to the source map after a particular node instead using the
+     * node's own line and column.
+     */
+    void startMapping(ISourceLocation node, ISourceLocation afterNode);
+
+    /**
+     * Commits a mapping to the source map.
+     */
+    void endMapping(ISourceLocation node);
+
+    class SourceMapMapping
+    {
+        public String sourcePath;
+        public String name;
+        public FilePosition sourceStartPosition;
+        public FilePosition destStartPosition;
+        public FilePosition destEndPosition;
+    }
+}

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/driver/js/IJSBackend.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/driver/js/IJSBackend.java b/compiler-jx/src/main/java/org/apache/flex/compiler/driver/js/IJSBackend.java
index eb0f4e2..80099b6 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/driver/js/IJSBackend.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/driver/js/IJSBackend.java
@@ -20,10 +20,10 @@
 package org.apache.flex.compiler.driver.js;
 
 import org.apache.flex.compiler.codegen.ISourceMapEmitter;
-import org.apache.flex.compiler.codegen.js.IJSEmitter;
+import org.apache.flex.compiler.codegen.js.IMappingEmitter;
 import org.apache.flex.compiler.driver.IBackend;
 
 public interface IJSBackend extends IBackend
 {
-    ISourceMapEmitter createSourceMapEmitter(IJSEmitter emitter);
+    ISourceMapEmitter createSourceMapEmitter(IMappingEmitter emitter);
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/Emitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/Emitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/Emitter.java
index c399d73..d559058 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/Emitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/Emitter.java
@@ -108,6 +108,20 @@ public class Emitter implements IEmitter
         walker = value;
     }
 
+    private int currentLine = 0;
+
+    protected int getCurrentLine()
+    {
+        return currentLine;
+    }
+
+    private int currentColumn = 0;
+
+    protected int getCurrentColumn()
+    {
+        return currentColumn;
+    }
+
     public Emitter(FilterWriter out)
     {
         this.out = out;
@@ -127,9 +141,23 @@ public class Emitter implements IEmitter
         try
         {
             if (!bufferWrite)
+            {
+                int newLineCount = value.length() - value.replace("\n", "").length();
+                currentLine += newLineCount;
+                if (newLineCount > 0)
+                {
+                    currentColumn = value.length() - value.lastIndexOf("\n") - 1;
+                }
+                else
+                {
+                    currentColumn += value.length();
+                }
                 out.write(value);
+            }
             else
+            {
                 builder.append(value);
+            }
         }
         catch (IOException e)
         {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java
index 0320d6a..c34eadb 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java
@@ -109,6 +109,18 @@ public class ASEmitter implements IASEmitter, IEmitter
 {
     private final FilterWriter out;
 
+    private IEmitter parentEmitter;
+
+    public IEmitter getParentEmitter()
+    {
+        return parentEmitter;
+    }
+
+    public void setParentEmitter(IEmitter value)
+    {
+        parentEmitter = value;
+    }
+
     private boolean bufferWrite;
 
     protected boolean isBufferWrite()
@@ -223,17 +235,24 @@ public class ASEmitter implements IASEmitter, IEmitter
         {
             if (!bufferWrite)
             {
-                int newLineCount = value.length() - value.replace("\n", "").length();
-                currentLine += newLineCount;
-                if (newLineCount > 0)
+                if (parentEmitter != null)
                 {
-                    currentColumn = value.length() - value.lastIndexOf("\n") - 1;
+                    parentEmitter.write(value);
                 }
                 else
                 {
-                    currentColumn += value.length();
+                    int newLineCount = value.length() - value.replace("\n", "").length();
+                    currentLine += newLineCount;
+                    if (newLineCount > 0)
+                    {
+                        currentColumn = value.length() - value.lastIndexOf("\n") - 1;
+                    }
+                    else
+                    {
+                        currentColumn += value.length();
+                    }
+                    out.write(value);
                 }
-                out.write(value);
             }
             else
             {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java
index 5b1f770..db31fa0 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java
@@ -24,8 +24,10 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Stack;
 
+import org.apache.flex.compiler.codegen.IEmitter;
 import org.apache.flex.compiler.codegen.ISubEmitter;
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
+import org.apache.flex.compiler.codegen.js.IMappingEmitter;
 import org.apache.flex.compiler.common.ASModifier;
 import org.apache.flex.compiler.common.ISourceLocation;
 import org.apache.flex.compiler.definitions.IDefinition;
@@ -391,6 +393,13 @@ public class JSEmitter extends ASEmitter implements IJSEmitter
         {
             return;
         }
+        IEmitter parentEmitter = getParentEmitter();
+        if (parentEmitter != null && parentEmitter instanceof IMappingEmitter)
+        {
+            IMappingEmitter mappingParent = (IMappingEmitter) parentEmitter;
+            mappingParent.startMapping(node, line, column);
+            return;
+        }
         if (lastMapping != null)
         {
             FilePosition sourceStartPosition = lastMapping.sourceStartPosition;
@@ -436,6 +445,13 @@ public class JSEmitter extends ASEmitter implements IJSEmitter
         {
             return;
         }
+        IEmitter parentEmitter = getParentEmitter();
+        if (parentEmitter != null && parentEmitter instanceof IMappingEmitter)
+        {
+            IMappingEmitter mappingParent = (IMappingEmitter) parentEmitter;
+            mappingParent.endMapping(node);
+            return;
+        }
         if (lastMapping == null)
         {
             throw new IllegalStateException("Cannot end mapping when a mapping has not been started");

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSourceMapEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSourceMapEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSourceMapEmitter.java
index bcdeed5..5b6c26c 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSourceMapEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSSourceMapEmitter.java
@@ -23,16 +23,16 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.flex.compiler.codegen.ISourceMapEmitter;
-import org.apache.flex.compiler.codegen.js.IJSEmitter;
+import org.apache.flex.compiler.codegen.js.IMappingEmitter;
 
 import com.google.debugging.sourcemap.SourceMapGeneratorV3;
 
 public class JSSourceMapEmitter implements ISourceMapEmitter
 {
-    private IJSEmitter emitter;
+    private IMappingEmitter emitter;
     private SourceMapGeneratorV3 sourceMapGenerator;
 
-    public JSSourceMapEmitter(IJSEmitter emitter)
+    public JSSourceMapEmitter(IMappingEmitter emitter)
     {
         this.emitter = emitter;
         sourceMapGenerator = new SourceMapGeneratorV3();
@@ -40,8 +40,8 @@ public class JSSourceMapEmitter implements ISourceMapEmitter
     
     public String emitSourceMap(String fileName, String sourceMapPath, String sourceRoot)
     {
-        List<IJSEmitter.SourceMapMapping> mappings = this.emitter.getSourceMapMappings();
-        for (IJSEmitter.SourceMapMapping mapping : mappings)
+        List<IMappingEmitter.SourceMapMapping> mappings = this.emitter.getSourceMapMappings();
+        for (IMappingEmitter.SourceMapMapping mapping : mappings)
         {
             sourceMapGenerator.addMapping(mapping.sourcePath, mapping.name,
                     mapping.sourceStartPosition,

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
index 0eb6c9b..7076009 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/JSWriter.java
@@ -31,6 +31,7 @@ import java.util.Stack;
 import org.apache.flex.compiler.codegen.ISourceMapEmitter;
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
 import org.apache.flex.compiler.codegen.js.IJSWriter;
+import org.apache.flex.compiler.codegen.js.IMappingEmitter;
 import org.apache.flex.compiler.driver.js.IJSBackend;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
 import org.apache.flex.compiler.problems.ICompilerProblem;
@@ -131,10 +132,10 @@ public class JSWriter implements IJSWriter
         }
     }
     
-    protected void convertMappingSourcePathsToRelative(IJSEmitter emitter, File relativeToFile)
+    protected void convertMappingSourcePathsToRelative(IMappingEmitter emitter, File relativeToFile)
     {
-        List<IJSEmitter.SourceMapMapping> mappings = emitter.getSourceMapMappings();
-        for (IJSEmitter.SourceMapMapping mapping : mappings)
+        List<IMappingEmitter.SourceMapMapping> mappings = emitter.getSourceMapMappings();
+        for (IMappingEmitter.SourceMapMapping mapping : mappings)
         {
             mapping.sourcePath = relativePath(mapping.sourcePath, relativeToFile.getAbsolutePath());
         }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java
index 84d9421..c127e7b 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java
@@ -19,13 +19,18 @@
 
 package org.apache.flex.compiler.internal.codegen.mxml;
 
+import java.io.BufferedOutputStream;
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.List;
 
+import org.apache.flex.compiler.codegen.ISourceMapEmitter;
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
+import org.apache.flex.compiler.codegen.js.IMappingEmitter;
 import org.apache.flex.compiler.codegen.mxml.IMXMLEmitter;
+import org.apache.flex.compiler.codegen.mxml.flexjs.IMXMLFlexJSEmitter;
 import org.apache.flex.compiler.driver.js.IJSBackend;
 import org.apache.flex.compiler.internal.codegen.js.JSFilterWriter;
 import org.apache.flex.compiler.internal.codegen.js.JSWriter;
@@ -62,6 +67,7 @@ public class MXMLWriter extends JSWriter
         IMXMLEmitter mxmlEmitter = backend.createMXMLEmitter(writer);
         IMXMLBlockWalker mxmlBlockWalker = backend.createMXMLWalker(
                 project, problems, mxmlEmitter, asEmitter, asBlockWalker);
+        asEmitter.setParentEmitter(mxmlEmitter);
 
         mxmlBlockWalker.visitCompilationUnit(compilationUnit);
 
@@ -76,8 +82,23 @@ public class MXMLWriter extends JSWriter
 
         if (sourceMapOut != null)
         {
-            String fileName = new File(compilationUnit.getAbsoluteFilename()).getName();
-            System.out.println("Source map cannot be generated for '" + fileName + "'.");
+            convertMappingSourcePathsToRelative((IMappingEmitter) mxmlEmitter, sourceMapOut);
+
+            File compilationUnitFile = new File(compilationUnit.getAbsoluteFilename());
+            ISourceMapEmitter sourceMapEmitter = backend.createSourceMapEmitter((IMappingEmitter) mxmlEmitter);
+            try
+            {
+                String fileName = compilationUnitFile.getName();
+                fileName = fileName.replace(".mxml", ".js");
+                String sourceMap = sourceMapEmitter.emitSourceMap(fileName, sourceMapOut.getAbsolutePath(), null);
+                BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(sourceMapOut));
+                outStream.write(sourceMap.getBytes());
+                outStream.flush();
+                outStream.close();
+            } catch (Exception e)
+            {
+                e.printStackTrace();
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
index 0b87cd6..207e671 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
@@ -34,8 +34,10 @@ import org.apache.flex.abc.semantics.MethodInfo;
 import org.apache.flex.abc.semantics.Name;
 import org.apache.flex.abc.semantics.Namespace;
 import org.apache.flex.compiler.codegen.as.IASEmitter;
+import org.apache.flex.compiler.codegen.js.IMappingEmitter;
 import org.apache.flex.compiler.codegen.mxml.flexjs.IMXMLFlexJSEmitter;
 import org.apache.flex.compiler.common.ASModifier;
+import org.apache.flex.compiler.common.ISourceLocation;
 import org.apache.flex.compiler.constants.IASKeywordConstants;
 import org.apache.flex.compiler.constants.IASLanguageConstants;
 import org.apache.flex.compiler.definitions.IClassDefinition;
@@ -58,6 +60,7 @@ import org.apache.flex.compiler.internal.codegen.js.jx.BindableEmitter;
 import org.apache.flex.compiler.internal.codegen.js.jx.PackageFooterEmitter;
 import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils;
 import org.apache.flex.compiler.internal.codegen.mxml.MXMLEmitter;
+import org.apache.flex.compiler.internal.driver.js.flexjs.JSCSSCompilationSession;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
 import org.apache.flex.compiler.internal.projects.FlexProject;
 import org.apache.flex.compiler.internal.scopes.ASProjectScope;
@@ -81,12 +84,13 @@ import org.apache.flex.compiler.visitor.mxml.IMXMLBlockWalker;
 import org.apache.flex.swc.ISWC;
 
 import com.google.common.base.Joiner;
+import com.google.debugging.sourcemap.FilePosition;
 
 /**
  * @author Erik de Bruin
  */
 public class MXMLFlexJSEmitter extends MXMLEmitter implements
-        IMXMLFlexJSEmitter
+        IMXMLFlexJSEmitter, IMappingEmitter
 {
 
 	// the instances in a container
@@ -130,10 +134,20 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
      *  deferred instance = local3[ nodeToIndexMap.get(an instance) ]
      */
     protected Map<IMXMLNode, Integer> nodeToIndexMap;
+
+    private SourceMapMapping lastMapping;
+
+    private List<SourceMapMapping> sourceMapMappings;
+
+    public List<SourceMapMapping> getSourceMapMappings()
+    {
+        return sourceMapMappings;
+    }
     
     public MXMLFlexJSEmitter(FilterWriter out)
     {
         super(out);
+        sourceMapMappings = new ArrayList<SourceMapMapping>();
     }
 
     @Override
@@ -163,8 +177,10 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
     	boolean stillSearching = true;
         ArrayList<String> namesToAdd = new ArrayList<String>();
         ArrayList<String> foundRequires = new ArrayList<String>();
-    	for (String line : lines)
-    	{
+        int len = lines.length;
+        for (int i = 0; i < len; i++)
+        {
+            String line = lines[i];
     		if (stillSearching)
     		{
 	            int c = line.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
@@ -179,7 +195,10 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 	    			sawRequires = true;
                     foundRequires.add(s);
 	    			if (!usedNames.contains(s))
-	    				continue;
+                    {
+                        removeLineFromMappings(i);
+                        continue;
+                    }
 	    		}
 	    		else if (sawRequires)
 	    		{
@@ -202,8 +221,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
                     }
 
                     for (String nameToAdd : namesToAdd) {
-                        //System.out.println("adding late requires:"+nameToAdd);
                         finalLines.add(createRequireLine(nameToAdd,false));
+                        addLineToMappings(i);
                     }
 
 	    			endRequires = finalLines.size();
@@ -223,7 +242,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
             appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken());
             appendString.append(ASEmitterTokens.SEMICOLON.getToken());
             finalLines.add(endRequires, appendString.toString());
-            // TODO (aharui) addLineToMappings(finalLines.size());
+            addLineToMappings(endRequires);
+            endRequires++;
         }
     	// append info() structure if main CU
         ICompilerProject project = getMXMLWalker().getProject();
@@ -265,12 +285,12 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 		                    appendString.append(ASEmitterTokens.PAREN_CLOSE.getToken());
 		                    appendString.append(ASEmitterTokens.SEMICOLON.getToken());
 	                        finalLines.add(endRequires, appendString.toString());
-	                        //addLineToMappings(finalLines.size());
+	                        addLineToMappings(endRequires);
+                            endRequires++;
 		            	}
 		            	mixinInject += "]";
 		            	infoInject += mixinInject;
 		            	sep = ",\n";
-	                    //addLineToMappings(finalLines.size());	            	
 	            	}
 	            	boolean isMX = false;
 	            	List<ISWC> swcs = flexJSProject.getLibraries();
@@ -303,11 +323,154 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
 	            	}
 	            	infoInject += "}};";
                     finalLines.add(infoInject);
+                    int newLineIndex = 0;
+                    while((newLineIndex = infoInject.indexOf('\n', newLineIndex)) != -1)
+                    {
+                        addLineToMappings(finalLines.size());
+                        newLineIndex++;
+                    }
+                    
+                    String cssInject = "\n\n" + thisDef + ".prototype.cssData = [";
+                    JSCSSCompilationSession cssSession = (JSCSSCompilationSession) flexJSProject.getCSSCompilationSession();
+                    String s = cssSession.getEncodedCSS();
+                    if (s != null)
+                    {
+                        int reqidx = s.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
+                        if (reqidx != -1)
+                        {
+                            String cssRequires = s.substring(reqidx);
+                            s = s.substring(0, reqidx - 1);
+                            String[] cssRequireLines = cssRequires.split("\n");
+                            for(String require : cssRequireLines)
+                            {
+                                finalLines.add(endRequires, require);
+                                addLineToMappings(endRequires);
+                                endRequires++;
+                            }
+                        }
+                        cssInject += s;
+                        finalLines.add(cssInject);
+                        newLineIndex = 0;
+                        while((newLineIndex = cssInject.indexOf('\n', newLineIndex)) != -1)
+                        {
+                            addLineToMappings(finalLines.size());
+                            newLineIndex++;
+                        }
+                    }
 	            }
             }
         }
+
     	return Joiner.on("\n").join(finalLines);
     }
+
+    public void startMapping(ISourceLocation node)
+    {
+        startMapping(node, node.getLine(), node.getColumn());
+    }
+
+    public void startMapping(ISourceLocation node, int line, int column)
+    {
+        if (isBufferWrite())
+        {
+            return;
+        }
+        if (lastMapping != null)
+        {
+            FilePosition sourceStartPosition = lastMapping.sourceStartPosition;
+            throw new IllegalStateException("Cannot start new mapping when another mapping is already started. "
+                    + "Previous mapping at Line " + sourceStartPosition.getLine()
+                    + " and Column " + sourceStartPosition.getColumn()
+                    + " in file " + lastMapping.sourcePath);
+        }
+
+        String sourcePath = node.getSourcePath();
+        if (sourcePath == null)
+        {
+            //if the source path is null, this node may have been generated by
+            //the compiler automatically. for example, an untyped variable will
+            //have a node for the * type.
+            if (node instanceof IASNode)
+            {
+                IASNode parentNode = ((IASNode) node).getParent();
+                if (parentNode != null)
+                {
+                    //try the parent node
+                    startMapping(parentNode, line, column);
+                    return;
+                }
+            }
+        }
+
+        SourceMapMapping mapping = new SourceMapMapping();
+        mapping.sourcePath = sourcePath;
+        mapping.sourceStartPosition = new FilePosition(line, column);
+        mapping.destStartPosition = new FilePosition(getCurrentLine(), getCurrentColumn());
+        lastMapping = mapping;
+    }
+
+    public void startMapping(ISourceLocation node, ISourceLocation afterNode)
+    {
+        startMapping(node, afterNode.getEndLine(), afterNode.getEndColumn());
+    }
+
+    public void endMapping(ISourceLocation node)
+    {
+        if (isBufferWrite())
+        {
+            return;
+        }
+        if (lastMapping == null)
+        {
+            throw new IllegalStateException("Cannot end mapping when a mapping has not been started");
+        }
+
+        lastMapping.destEndPosition = new FilePosition(getCurrentLine(), getCurrentColumn());
+        sourceMapMappings.add(lastMapping);
+        lastMapping = null;
+    }
+
+    /**
+     * Adjusts the line numbers saved in the source map when a line should be
+     * added during post processing.
+     *
+     * @param lineIndex
+     */
+    protected void addLineToMappings(int lineIndex)
+    {
+        for (SourceMapMapping mapping : sourceMapMappings)
+        {
+            FilePosition destStartPosition = mapping.destStartPosition;
+            int startLine = destStartPosition.getLine();
+            if(startLine > lineIndex)
+            {
+                mapping.destStartPosition = new FilePosition(startLine + 1, destStartPosition.getColumn());
+                FilePosition destEndPosition = mapping.destEndPosition;
+                mapping.destEndPosition = new FilePosition(destEndPosition.getLine() + 1, destEndPosition.getColumn());
+            }
+        }
+    }
+
+    /**
+     * Adjusts the line numbers saved in the source map when a line should be
+     * removed during post processing.
+     *
+     * @param lineIndex
+     */
+    protected void removeLineFromMappings(int lineIndex)
+    {
+        for (SourceMapMapping mapping : sourceMapMappings)
+        {
+            FilePosition destStartPosition = mapping.destStartPosition;
+            int startLine = destStartPosition.getLine();
+            if(startLine > lineIndex)
+            {
+                mapping.destStartPosition = new FilePosition(startLine - 1, destStartPosition.getColumn());
+                FilePosition destEndPosition = mapping.destEndPosition;
+                mapping.destEndPosition = new FilePosition(destEndPosition.getLine() - 1, destEndPosition.getColumn());
+            }
+        }
+    }
     
     @Override
     protected String getIndent(int numIndent)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
index 3b11121..a614592 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSPublisher.java
@@ -249,10 +249,6 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements IJSPublisher
         /////////////////////////////////////////////////////////////////////////////////
 
         final File projectIntermediateMainFile = new File(intermediateDir, outputFileName);
-        if (!googConfiguration.getSkipTranspile())
-        {
-            appendEncodedCSS(projectIntermediateMainFile, projectName);
-        }
 
 
         /////////////////////////////////////////////////////////////////////////////////
@@ -381,36 +377,6 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements IJSPublisher
         return true;
     }
 
-    private void appendEncodedCSS(File targetFile, String projectName) throws IOException
-    {
-        StringBuilder appendString = new StringBuilder();
-        appendString.append("\n\n");
-        appendString.append(projectName);
-        appendString.append(".prototype.cssData = [");
-        JSCSSCompilationSession cssSession = (JSCSSCompilationSession) project.getCSSCompilationSession();
-        String s = cssSession.getEncodedCSS();
-        if (s != null)
-        {
-	        int reqidx = s.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
-	        if (reqidx != -1)
-	        {
-	            String reqs = s.substring(reqidx);
-	            s = s.substring(0, reqidx - 1);
-	            String fileData = readCode(targetFile);
-	            reqidx = fileData.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken());
-	            String after = fileData.substring(reqidx);
-	            String before = fileData.substring(0, reqidx - 1);
-	            s = before + reqs + after + appendString.toString() + s;
-	            writeFile(targetFile, s, false);
-	        }
-	        else
-	        {
-	            appendString.append(s);
-	            writeFile(targetFile, appendString.toString(), true);
-	        }
-        }
-    }
-
     protected List<SourceFile> closureFilesInOrder(String path, List<SourceFile> files, String entryPoint)
     {
     	ArrayList<String> sortedFiles = new ArrayList<String>();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/JSBackend.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/JSBackend.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/JSBackend.java
index 9d6eb66..502609d 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/JSBackend.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/driver/js/JSBackend.java
@@ -29,6 +29,7 @@ import org.apache.flex.compiler.codegen.ISourceMapEmitter;
 import org.apache.flex.compiler.codegen.as.IASEmitter;
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
 import org.apache.flex.compiler.codegen.js.IJSWriter;
+import org.apache.flex.compiler.codegen.js.IMappingEmitter;
 import org.apache.flex.compiler.codegen.mxml.IMXMLEmitter;
 import org.apache.flex.compiler.config.Configuration;
 import org.apache.flex.compiler.config.Configurator;
@@ -139,7 +140,7 @@ public class JSBackend implements IJSBackend
     }
 
     @Override
-    public ISourceMapEmitter createSourceMapEmitter(IJSEmitter emitter)
+    public ISourceMapEmitter createSourceMapEmitter(IMappingEmitter emitter)
     {
         return new JSSourceMapEmitter(emitter);
     }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/3ab47113/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/SourceMapTestBase.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/SourceMapTestBase.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/SourceMapTestBase.java
index 783a340..c8a6cb7 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/SourceMapTestBase.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/test/SourceMapTestBase.java
@@ -21,6 +21,7 @@ package org.apache.flex.compiler.internal.test;
 import java.util.List;
 
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
+import org.apache.flex.compiler.codegen.js.IMappingEmitter;
 import org.apache.flex.compiler.tree.as.IASNode;
 
 import com.google.debugging.sourcemap.FilePosition;
@@ -48,8 +49,8 @@ public class SourceMapTestBase extends ASTestBase
             sourceStartColumn += node.getColumn();
         }
         boolean foundMapping = false;
-        List<IJSEmitter.SourceMapMapping> mappings = jsEmitter.getSourceMapMappings();
-        for (IJSEmitter.SourceMapMapping mapping : mappings)
+        List<IMappingEmitter.SourceMapMapping> mappings = jsEmitter.getSourceMapMappings();
+        for (IMappingEmitter.SourceMapMapping mapping : mappings)
         {
             FilePosition sourcePosition = mapping.sourceStartPosition;
             FilePosition startPosition = mapping.destStartPosition;