compiler options to optimize output by removing certain kinds of coercions

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

Branch: refs/heads/develop
Commit: 67ed780ef705fe654f0f616b1be0a0ea4c0604c5
Parents: 3052451
Author: Alex Harui <[email protected]>
Authored: Fri Jan 8 23:24:42 2016 -0800
Committer: Alex Harui <[email protected]>
Committed: Fri Jan 8 23:24:42 2016 -0800

----------------------------------------------------------------------
 .../apache/flex/compiler/clients/MXMLJSC.java   |  1 +
 .../codegen/js/flexjs/JSFlexJSDocEmitter.java   | 27 ++++++++++
 .../js/flexjs/JSFlexJSEmitterTokens.java        |  3 ++
 .../internal/codegen/js/jx/AsIsEmitter.java     | 54 ++++++++++++++------
 .../driver/js/goog/JSGoogConfiguration.java     | 40 +++++++++++++++
 .../internal/projects/FlexJSProject.java        |  4 ++
 6 files changed, 113 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/67ed780e/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java 
b/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
index 750c54a..35a9609 100644
--- a/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
+++ b/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
@@ -703,6 +703,7 @@ public class MXMLJSC implements JSCompilerEntryPoint, 
ProblemQueryProvider,
             problems = new ProblemQuery(
                     projectConfigurator.getCompilerProblemSettings());
 
+            project.config = 
(JSGoogConfiguration)projectConfigurator.getConfiguration();
             config = projectConfigurator.getConfiguration();
             configBuffer = projectConfigurator.getConfigurationBuffer();
             problems.addAll(projectConfigurator.getConfigurationProblems());

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/67ed780e/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 5dc097b..057bcf1 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
@@ -48,6 +48,7 @@ import org.apache.flex.compiler.tree.as.IVariableNode;
 public class JSFlexJSDocEmitter extends JSGoogDocEmitter
 {
     private List<String> classIgnoreList;
+    private List<String> ignoreList;
     private List<String> coercionList;
 
     public JSFlexJSDocEmitter(IJSEmitter emitter)
@@ -68,6 +69,11 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter
     @Override
     protected String convertASTypeToJS(String name, String pname)
     {
+        if (ignoreList != null)
+        {
+            if (ignoreList.contains(pname + "." + name))
+                return IASLanguageConstants.Object;
+        }
         if (coercionList != null)
         {
             if (!coercionList.contains(pname + "." + name))
@@ -95,6 +101,7 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter
     public void emitMethodDoc(IFunctionNode node, ICompilerProject project)
     {
         coercionList = null;
+        ignoreList = null;
 
         IClassDefinition classDefinition = resolveClassDefinition(node);
 
@@ -156,6 +163,10 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter
                                 .getToken();
                         if (docText.contains(keepToken))
                             loadKeepers(docText);
+                        String ignoreToken = 
JSFlexJSEmitterTokens.IGNORE_COERCION
+                                       .getToken();
+                               if (docText.contains(ignoreToken))
+                                   loadIgnores(docText);
                         write(changeAnnotations(asDoc.commentNoEnd()));
                     }
                     else
@@ -242,6 +253,22 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter
         }
     }
 
+    private void loadIgnores(String doc)
+    {
+       ignoreList = new ArrayList<String>();
+        String ignoreToken = JSFlexJSEmitterTokens.IGNORE_COERCION.getToken();
+        int index = doc.indexOf(ignoreToken);
+        while (index != -1)
+        {
+            String ignore = doc.substring(index + ignoreToken.length());
+            int endIndex = ignore.indexOf("\n");
+            ignore = ignore.substring(0, endIndex);
+            ignore = ignore.trim();
+            ignoreList.add(ignore);
+            index = doc.indexOf(ignoreToken, index + endIndex);
+        }
+    }
+    
     private void loadKeepers(String doc)
     {
        coercionList = new ArrayList<String>();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/67ed780e/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
index a09c9ab..4c4a16b 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitterTokens.java
@@ -35,6 +35,7 @@ public enum JSFlexJSEmitterTokens implements IEmitterTokens
     QNAME("qName"),
     UNDERSCORE("_"),
     EMIT_COERCION("@flexjsemitcoercion"),
+    IGNORE_COERCION("@flexjsignorecoercion"),
     IGNORE_IMPORT("@flexjsignoreimport"),
     PREINCREMENT("preincrement"),
     PREDECREMENT("predecrement"),
@@ -43,6 +44,8 @@ public enum JSFlexJSEmitterTokens implements IEmitterTokens
     SUPERGETTER("superGetter"),
     SUPERSETTER("superSetter"),
     CLOSURE_FUNCTION_NAME("org.apache.flex.utils.Language.closure"),
+    SKIP_AS_COERCIONS("skipAsCoercions"),
+    SKIP_FUNCTION_COERCIONS("skipFunctionCoercions"),
     ;
 
     private String token;

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/67ed780e/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java
index b821d7a..b18cb88 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/AsIsEmitter.java
@@ -50,12 +50,30 @@ public class AsIsEmitter extends JSSubEmitter
                 .resolve(getProject()) : null;
         if (id != ASTNodeID.Op_IsID && dnode != null)
         {
-            boolean emit = false;
+            boolean emit = coercion ? 
+                       
!((FlexJSProject)getProject()).config.getJSOutputOptimizations().contains(JSFlexJSEmitterTokens.SKIP_FUNCTION_COERCIONS.getToken())
 :
+                       
!((FlexJSProject)getProject()).config.getJSOutputOptimizations().contains(JSFlexJSEmitterTokens.SKIP_AS_COERCIONS.getToken());
+                               
             // find the function node
             IFunctionNode functionNode = (IFunctionNode) left
                     .getAncestorOfType(IFunctionNode.class);
             if (functionNode != null) // can be null in synthesized binding 
code
             {
+                if (coercion)
+                {
+                       // see if the cast is inside a try/catch in this 
function. If so,
+                       // assume that we want an exception.
+                       IASNode child = left.getParent();
+                       while (child != functionNode)
+                       {
+                               if (child.getNodeID() == ASTNodeID.TryID)
+                               {
+                                       emit = true;
+                                       break;
+                               }
+                               child = child.getParent();
+                       }
+                }
                 ASDocComment asDoc = (ASDocComment) functionNode
                         .getASDocComment();
                 if (asDoc != null)
@@ -80,21 +98,25 @@ public class AsIsEmitter extends JSSubEmitter
                         emitIndex = asDocString.indexOf(coercionToken,
                                        emitIndex + coercionToken.length());
                     }
-                }
-                if (coercion)
-                {
-                       // see if the cast is inside a try/catch in this 
function. If so,
-                       // assume that we want an exception.
-                       IASNode child = left.getParent();
-                       while (child != functionNode)
-                       {
-                               if (child.getNodeID() == ASTNodeID.TryID)
-                               {
-                                       emit = true;
-                                       break;
-                               }
-                               child = child.getParent();
-                       }
+                    String ignoreToken = JSFlexJSEmitterTokens.IGNORE_COERCION
+                    .getToken();
+                           int ignoreIndex = asDocString.indexOf(ignoreToken);
+                           while (ignoreIndex != -1)
+                           {
+                               String ignorable = 
asDocString.substring(emitIndex
+                                       + ignoreToken.length());
+                               int endIndex = ignorable.indexOf("\n");
+                               ignorable = ignorable.substring(0, endIndex);
+                               ignorable = ignorable.trim();
+                               String rightSide = dnode.getQualifiedName();
+                               if (ignorable.equals(rightSide))
+                               {
+                                   emit = false;
+                                   break;
+                               }
+                               ignoreIndex = asDocString.indexOf(ignoreToken,
+                                               ignoreIndex + 
ignoreToken.length());
+                           }
                 }
             }
             if (!emit)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/67ed780e/compiler.jx/src/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
 
b/compiler.jx/src/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
index 55f449e..0f03323 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/driver/js/goog/JSGoogConfiguration.java
@@ -236,6 +236,27 @@ public class JSGoogConfiguration extends JSConfiguration
 
     
     
+    //
+    // 'remove-circulars'
+    //
+
+    private boolean removeCirculars = false;
+
+    public boolean getRemoveCirculars()
+    {
+        return removeCirculars;
+    }
+
+    @Config
+    @Mapping("remove-circulars")
+    public void setRemoveCirculars(ConfigurationValue cv, boolean value)
+            throws ConfigurationException
+    {
+       removeCirculars = value;
+    }
+
+    
+    
     protected String getAbsolutePathFromPathRelativeToMXMLC(String 
relativePath)
         throws IOException
     {
@@ -268,4 +289,23 @@ public class JSGoogConfiguration extends JSConfiguration
        jsCompilerOptions.addAll(value);
     }
 
+    //
+    // 'js-output-optimization'
+    //
+
+    protected List<String> jsOutputOptimizations = new ArrayList<String>();
+
+    public List<String> getJSOutputOptimizations()
+    {
+        return jsOutputOptimizations;
+    }
+
+    @Config(allowMultiple = true)
+    @Mapping("js-output-optimization")
+    @InfiniteArguments
+    public void setJSOutputOptimizations(ConfigurationValue cv, List<String> 
value)
+            throws ConfigurationException
+    {
+       jsOutputOptimizations.addAll(value);
+    }
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/67ed780e/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
----------------------------------------------------------------------
diff --git 
a/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java 
b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
index 6ce6e23..1cf6d3d 100644
--- 
a/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
+++ 
b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
@@ -25,12 +25,14 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.flex.compiler.common.DependencyType;
+import org.apache.flex.compiler.config.Configuration;
 import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.IScopedDefinition;
 import 
org.apache.flex.compiler.internal.codegen.mxml.flexjs.MXMLFlexJSEmitterTokens;
 import org.apache.flex.compiler.internal.css.codegen.CSSCompilationSession;
 import org.apache.flex.compiler.internal.definitions.InterfaceDefinition;
 import 
org.apache.flex.compiler.internal.driver.js.flexjs.JSCSSCompilationSession;
+import org.apache.flex.compiler.internal.driver.js.goog.JSGoogConfiguration;
 import 
org.apache.flex.compiler.internal.scopes.ASProjectScope.DefinitionPromise;
 import org.apache.flex.compiler.internal.scopes.ASScope;
 import org.apache.flex.compiler.internal.scopes.PackageScope;
@@ -63,6 +65,8 @@ public class FlexJSProject extends FlexProject
     private HashMap<ICompilationUnit, HashMap<String, String>> interfaces = 
new HashMap<ICompilationUnit, HashMap<String, String>>();
     private HashMap<ICompilationUnit, HashMap<String, DependencyType>> 
requires = new HashMap<ICompilationUnit, HashMap<String, DependencyType>>();
 
+    public JSGoogConfiguration config;
+    
     public ICompilationUnit mainCU;
 
     @Override

Reply via email to