Repository: flex-falcon Updated Branches: refs/heads/develop 0c69c38ad -> f3f082fa3
changes to generate the set of requires based on actual usage instead of the dependencies requires by AS. AS dependencies may also include types of variables which don't really matter to JS. Doing this eliminates the need for circular dependency checking in our code. But it also seems to have caused new warnings to show up which will require more investigation and a future commit Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/15b170f8 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/15b170f8 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/15b170f8 Branch: refs/heads/develop Commit: 15b170f8d133dc03580a47ac95c4624b81bcb28a Parents: 9d605f2 Author: Alex Harui <[email protected]> Authored: Thu Jan 7 10:28:25 2016 -0800 Committer: Alex Harui <[email protected]> Committed: Thu Jan 7 10:28:25 2016 -0800 ---------------------------------------------------------------------- .../flex/compiler/codegen/as/IASEmitter.java | 2 + .../compiler/codegen/mxml/IMXMLEmitter.java | 2 + .../compiler/internal/codegen/as/ASEmitter.java | 6 +++ .../compiler/internal/codegen/js/JSWriter.java | 2 +- .../codegen/js/flexjs/JSFlexJSDocEmitter.java | 2 +- .../codegen/js/flexjs/JSFlexJSEmitter.java | 46 +++++++++++++++++++- .../codegen/js/jx/IdentifierEmitter.java | 5 ++- .../codegen/js/jx/PackageFooterEmitter.java | 4 +- .../internal/codegen/mxml/MXMLEmitter.java | 6 +++ .../internal/codegen/mxml/MXMLWriter.java | 2 +- .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java | 35 +++++++++++++++ .../compiler/internal/graph/GoogDepsWriter.java | 4 +- 12 files changed, 109 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java b/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java index df9bbcc..1a666f1 100644 --- a/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java @@ -85,6 +85,8 @@ public interface IASEmitter extends IEmitter void setDocEmitter(IDocEmitter value); + String postProcess(String output); + void emitImport(IImportNode node); void emitPackageHeader(IPackageDefinition definition); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/codegen/mxml/IMXMLEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/codegen/mxml/IMXMLEmitter.java b/compiler.jx/src/org/apache/flex/compiler/codegen/mxml/IMXMLEmitter.java index 53461b4..a8dc6dc 100644 --- a/compiler.jx/src/org/apache/flex/compiler/codegen/mxml/IMXMLEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/codegen/mxml/IMXMLEmitter.java @@ -60,6 +60,8 @@ public interface IMXMLEmitter extends IEmitter IBlockWalker getMXMLWalker(); + String postProcess(String output); + void setMXMLWalker(IBlockWalker mxmlBlockWalker); //-------------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java index 8223ee9..ca21571 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java @@ -190,6 +190,12 @@ public class ASEmitter implements IASEmitter, IEmitter } @Override + public String postProcess(String output) + { + return output; + } + + @Override public void write(IEmitterTokens value) { write(value.getToken()); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSWriter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSWriter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSWriter.java index 9d2c5c1..16a4d4d 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSWriter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSWriter.java @@ -77,7 +77,7 @@ public class JSWriter implements IJSWriter try { - out.write(writer.toString().getBytes()); + out.write(emitter.postProcess(writer.toString()).getBytes()); } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java index 85a9aca..11a6518 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java @@ -88,7 +88,7 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter @Override protected String formatQualifiedName(String name) { - return ((JSFlexJSEmitter)emitter).formatQualifiedName(name); + return ((JSFlexJSEmitter)emitter).formatQualifiedName(name, true); } @Override http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java index a101a4c..d439da9 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java @@ -20,6 +20,7 @@ package org.apache.flex.compiler.internal.codegen.js.flexjs; import java.io.FilterWriter; +import java.util.ArrayList; import java.util.List; import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter; @@ -87,6 +88,8 @@ import org.apache.flex.compiler.tree.as.IUnaryOperatorNode; import org.apache.flex.compiler.tree.as.IVariableNode; import org.apache.flex.compiler.utils.ASNodeUtils; +import com.google.common.base.Joiner; + /** * Concrete implementation of the 'FlexJS' JavaScript production. * @@ -124,6 +127,36 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter private ObjectDefinePropertyEmitter objectDefinePropertyEmitter; private DefinePropertyFunctionEmitter definePropertyFunctionEmitter; + public ArrayList<String> usedNames = new ArrayList<String>(); + + @Override + public String postProcess(String output) + { + String[] lines = output.split("\n"); + ArrayList<String> finalLines = new ArrayList<String>(); + boolean sawRequires = false; + boolean stillSearching = true; + for (String line : lines) + { + if (stillSearching) + { + int c = line.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken()); + if (c > -1) + { + int c2 = line.indexOf(")"); + String s = line.substring(c + 14, c2 - 1); + sawRequires = true; + if (!usedNames.contains(s)) + continue; + } + else if (sawRequires) + stillSearching = false; + } + finalLines.add(line); + } + return Joiner.on("\n").join(finalLines); + } + public BindableEmitter getBindableEmitter() { return bindableEmitter; @@ -291,6 +324,11 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter @Override public String formatQualifiedName(String name) { + return formatQualifiedName(name, false); + } + + public String formatQualifiedName(String name, boolean isDoc) + { /* if (name.contains("goog.") || name.startsWith("Vector.")) return name; @@ -300,9 +338,14 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter return getModel().getInternalClasses().get(name); if (name.startsWith("window.")) name = name.substring(7); + else if (!isDoc) + { + if (!usedNames.contains(name)) + usedNames.add(name); + } return name; } - + //-------------------------------------------------------------------------- // Package Level //-------------------------------------------------------------------------- @@ -351,6 +394,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter public void emitPackageHeaderContents(IPackageDefinition definition) { packageHeaderEmitter.emitContents(definition); + usedNames.clear(); } @Override http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java index a21cd63..4ed97e7 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java @@ -29,6 +29,7 @@ import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils; import org.apache.flex.compiler.internal.definitions.AccessorDefinition; import org.apache.flex.compiler.internal.definitions.FunctionDefinition; +import org.apache.flex.compiler.internal.definitions.TypeDefinitionBase; import org.apache.flex.compiler.tree.ASTNodeID; import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IFunctionObjectNode; @@ -128,8 +129,10 @@ public class IdentifierEmitter extends JSSubEmitter implements String qname = nodeDef.getQualifiedName(); if (parentNodeId == ASTNodeID.MemberAccessExpressionID) write(node.getName()); - else + else if (nodeDef instanceof TypeDefinitionBase) write(getEmitter().formatQualifiedName(qname)); + else + write(qname); } else write(node.getName()); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java index 1110448..daffb46 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java @@ -19,6 +19,8 @@ package org.apache.flex.compiler.internal.codegen.js.jx; +import java.util.ArrayList; + import org.apache.flex.compiler.codegen.ISubEmitter; import org.apache.flex.compiler.codegen.js.IJSEmitter; import org.apache.flex.compiler.definitions.IDefinition; @@ -28,6 +30,7 @@ import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.JSEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter; import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSDocEmitter; +import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter; import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.utils.EmitterUtils; import org.apache.flex.compiler.scopes.IASScope; @@ -135,6 +138,5 @@ public class PackageFooterEmitter extends JSSubEmitter implements write(ASEmitterTokens.SPACE); write(ASEmitterTokens.BLOCK_CLOSE); writeNewline(ASEmitterTokens.SEMICOLON); - } } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLEmitter.java index 56d0fb2..bba7f23 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLEmitter.java @@ -64,6 +64,12 @@ import org.apache.flex.compiler.visitor.mxml.IMXMLBlockWalker; public class MXMLEmitter extends Emitter implements IMXMLEmitter { + @Override + public String postProcess(String output) + { + return output; + } + //-------------------------------------------------------------------------- // walkers //-------------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java index 1d97ea5..81ce78c 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/MXMLWriter.java @@ -67,7 +67,7 @@ public class MXMLWriter extends JSWriter try { - out.write(writer.toString().getBytes()); + out.write(mxmlEmitter.postProcess(writer.toString()).getBytes()); } catch (IOException e) { http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java index 950f66e..f9f05a4 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java @@ -86,6 +86,8 @@ import org.apache.flex.compiler.units.ICompilationUnit; import org.apache.flex.compiler.utils.NativeUtils; import org.apache.flex.compiler.visitor.mxml.IMXMLBlockWalker; +import com.google.common.base.Joiner; + /** * @author Erik de Bruin */ @@ -107,6 +109,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements private ArrayList<MXMLScriptSpecifier> scripts; //private ArrayList<MXMLStyleSpecifier> styles; private IClassDefinition classDefinition; + private ArrayList<String> usedNames = new ArrayList<String>(); private int eventCounter; private int idCounter; @@ -137,6 +140,37 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements } @Override + public String postProcess(String output) + { + IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker()).getASEmitter(); + usedNames.addAll(((JSFlexJSEmitter)asEmitter).usedNames); + + String[] lines = output.split("\n"); + ArrayList<String> finalLines = new ArrayList<String>(); + boolean sawRequires = false; + boolean stillSearching = true; + for (String line : lines) + { + if (stillSearching) + { + int c = line.indexOf(JSGoogEmitterTokens.GOOG_REQUIRE.getToken()); + if (c > -1) + { + int c2 = line.indexOf(")"); + String s = line.substring(c + 14, c2 - 1); + sawRequires = true; + if (!usedNames.contains(s)) + continue; + } + else if (sawRequires) + stillSearching = false; + } + finalLines.add(line); + } + return Joiner.on("\n").join(finalLines); + } + + @Override protected String getIndent(int numIndent) { final StringBuilder sb = new StringBuilder(); @@ -1972,6 +2006,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements return name; name = name.replaceAll("\\.", "_"); */ + usedNames.add(name); return name; } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/15b170f8/compiler.jx/src/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java ---------------------------------------------------------------------- diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java b/compiler.jx/src/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java index 21ec7b6..13108ff 100644 --- a/compiler.jx/src/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java +++ b/compiler.jx/src/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java @@ -147,7 +147,7 @@ public class GoogDepsWriter { visited.put(current.className, current); filePathsInOrder.add(current.filePath); - removeCirculars(current); + //removeCirculars(current); System.out.println("Dependencies calculated for '" + current.filePath + "'"); ArrayList<String> deps = current.deps; @@ -240,12 +240,14 @@ public class GoogDepsWriter { // don't add the require if some class needs it at static initialization // time and that class is not this class suppressCount++; + System.out.println(gd.filePath + " removing circular (static): " + s); continue; } else if (!gd.deps.contains(s)) { // someone require'd this class suppressCount++; + System.out.println(gd.filePath + " removing circular: " + s); continue; } }
