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
