This is an automated email from the ASF dual-hosted git repository. joshtynjala pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit 21d8cae1a1bf444390ab66435b46f0f9b4c6800c Author: Josh Tynjala <[email protected]> AuthorDate: Mon Mar 30 18:02:02 2020 -0700 Prevent renaming of public variables (static or non-static) --- .../javascript/jscomp/RoyaleClosurePassConfig.java | 53 ++++++++++++- .../apache/royale/compiler/clients/MXMLJSC.java | 10 ++- .../royale/compiler/clients/MXMLJSCNative.java | 11 ++- .../royale/compiler/clients/MXMLJSCNode.java | 10 ++- .../royale/compiler/clients/MXMLJSCRoyale.java | 11 ++- .../compiler/clients/MXMLJSCRoyaleCordova.java | 11 ++- .../compiler/codegen/js/goog/IJSGoogPublisher.java | 33 +++++++++ .../codegen/mxml/royale/MXMLRoyalePublisher.java | 12 ++- .../driver/js/goog/JSGoogCompcConfiguration.java | 2 +- .../driver/js/goog/JSGoogConfiguration.java | 2 +- .../apache/royale/compiler/utils/ClosureUtils.java | 86 ++++++++++++++++++++++ .../compiler/utils/JSClosureCompilerWrapper.java | 9 ++- 12 files changed, 227 insertions(+), 23 deletions(-) diff --git a/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java b/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java index 84fae02..449918c 100644 --- a/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java +++ b/compiler-jx/src/main/java/com/google/javascript/jscomp/RoyaleClosurePassConfig.java @@ -61,7 +61,10 @@ import com.google.javascript.jscomp.lint.CheckUselessBlocks; import com.google.javascript.jscomp.parsing.ParserRunner; import com.google.javascript.jscomp.parsing.parser.FeatureSet; import com.google.javascript.rhino.IR; +import com.google.javascript.rhino.JSDocInfo; +import com.google.javascript.rhino.JSDocInfoBuilder; import com.google.javascript.rhino.Node; +import com.google.javascript.rhino.Token; import java.io.File; import java.util.ArrayList; @@ -130,8 +133,10 @@ public final class RoyaleClosurePassConfig extends PassConfig { /** file of already renamed vars */ private File varRenameMapFile; + + private Set<String> propertyNamesToKeep; - public RoyaleClosurePassConfig(CompilerOptions options, String sourceFileName, File varRenameMapFile) { + public RoyaleClosurePassConfig(CompilerOptions options, String sourceFileName, File varRenameMapFile, Set<String> propertyNamesToKeep) { super(options); // The current approach to protecting "hidden" side-effects is to @@ -141,6 +146,7 @@ public final class RoyaleClosurePassConfig extends PassConfig { preprocessorSymbolTableFactory = new PreprocessorSymbolTable.CachedInstanceFactory(); this.varRenameMapFile = varRenameMapFile; this.sourceFileName = sourceFileName; + this.propertyNamesToKeep = propertyNamesToKeep; } GlobalNamespace getGlobalNamespace() { @@ -335,6 +341,10 @@ public final class RoyaleClosurePassConfig extends PassConfig { checks.add(angularPass); } + if (propertyNamesToKeep != null && propertyNamesToKeep.size() > 0) { + checks.add(keepPropertyNamesPass); + } + if (!options.generateExportsAfterTypeChecking && options.generateExports) { checks.add(generateExports); } @@ -1255,6 +1265,47 @@ public final class RoyaleClosurePassConfig extends PassConfig { } }; + private final PassFactory keepPropertyNamesPass = + new PassFactory("keep-property-names", true) { + @Override + protected CompilerPass create(final AbstractCompiler compiler) { + return new CompilerPass() { + @Override + public void process(Node externs, Node root) { + + Node propsObj = new Node(Token.OBJECTLIT); + for(String nameToKeep : propertyNamesToKeep) + { + Node nameStringKey = IR.stringKey(nameToKeep); + JSDocInfoBuilder builder = new JSDocInfoBuilder(true); + builder.recordExport(); + JSDocInfo jsDocInfo = builder.build(); + nameStringKey.setJSDocInfo(jsDocInfo); + + Node propertyDescriptor = new Node(Token.OBJECTLIT); + propertyDescriptor.addChildToBack(IR.propdef(IR.stringKey("get"), NodeUtil.emptyFunction())); + + Node prop = IR.propdef(nameStringKey, propertyDescriptor); + propsObj.addChildToBack(prop); + } + + Node definePropertiesTarget = NodeUtil.newQName(compiler, "Object.defineProperties"); + Node definePropertiesCall = IR.call(definePropertiesTarget, IR.objectlit(), propsObj); + Node expression = IR.exprResult(definePropertiesCall); + + Node scriptNode = compiler.getScriptNode(sourceFileName); + scriptNode.addChildToBack(expression); + compiler.reportChangeToEnclosingScope(expression); + } + }; + } + + @Override + protected FeatureSet featureSet() { + return ES_NEXT; + } + }; + /** Raw exports processing pass. */ private final PassFactory gatherRawExports = new PassFactory(PassNames.GATHER_RAW_EXPORTS, true) { diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSC.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSC.java index 5bed5df..748c169 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSC.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSC.java @@ -35,8 +35,8 @@ import org.apache.royale.compiler.clients.problems.ProblemPrinter; import org.apache.royale.compiler.clients.problems.ProblemQuery; import org.apache.royale.compiler.clients.problems.ProblemQueryProvider; import org.apache.royale.compiler.clients.problems.WorkspaceProblemFormatter; -import org.apache.royale.compiler.codegen.js.IJSPublisher; import org.apache.royale.compiler.codegen.js.IJSWriter; +import org.apache.royale.compiler.codegen.js.goog.IJSGoogPublisher; import org.apache.royale.compiler.common.VersionInfo; import org.apache.royale.compiler.config.CommandLineConfigurator; import org.apache.royale.compiler.config.CompilerDiagnosticsConstants; @@ -75,6 +75,7 @@ import org.apache.royale.compiler.targets.ITarget; import org.apache.royale.compiler.targets.ITarget.TargetType; import org.apache.royale.compiler.targets.ITargetSettings; import org.apache.royale.compiler.units.ICompilationUnit; +import org.apache.royale.compiler.utils.ClosureUtils; import org.apache.royale.swf.ISWF; import org.apache.royale.swf.SWF; import org.apache.royale.swf.types.RGB; @@ -272,7 +273,7 @@ public class MXMLJSC implements JSCompilerEntryPoint, ProblemQueryProvider, protected ITarget target; protected ITargetSettings targetSettings; protected IJSApplication jsTarget; - private IJSPublisher jsPublisher; + private IJSGoogPublisher jsPublisher; protected MXMLC mxmlc; protected JSCompilerEntryPoint lastCompiler; public boolean noLink; @@ -532,7 +533,8 @@ public class MXMLJSC implements JSCompilerEntryPoint, ProblemQueryProvider, return false; } - jsPublisher = (IJSPublisher) project.getBackend().createPublisher( + Set<String> closurePropNamesToKeep = new HashSet<String>(); + jsPublisher = (IJSGoogPublisher) project.getBackend().createPublisher( project, errors, config); File outputFolder = jsPublisher.getOutputFolder(); @@ -617,11 +619,13 @@ public class MXMLJSC implements JSCompilerEntryPoint, ProblemQueryProvider, outputClassFile.setLastModified(fileDate); } } + ClosureUtils.collectPropertyNamesToKeep(cu, project, closurePropNamesToKeep); } } if (jsPublisher != null) { + jsPublisher.setClosurePropertyNamesToKeep(closurePropNamesToKeep); compilationSuccess = jsPublisher.publish(problems); } else diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCNative.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCNative.java index 1c4474f..9b54b1e 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCNative.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCNative.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -36,8 +37,8 @@ import org.apache.royale.compiler.clients.problems.ProblemPrinter; import org.apache.royale.compiler.clients.problems.ProblemQuery; import org.apache.royale.compiler.clients.problems.ProblemQueryProvider; import org.apache.royale.compiler.clients.problems.WorkspaceProblemFormatter; -import org.apache.royale.compiler.codegen.js.IJSPublisher; import org.apache.royale.compiler.codegen.js.IJSWriter; +import org.apache.royale.compiler.codegen.js.goog.IJSGoogPublisher; import org.apache.royale.compiler.config.Configuration; import org.apache.royale.compiler.config.ConfigurationBuffer; import org.apache.royale.compiler.config.Configurator; @@ -72,6 +73,7 @@ import org.apache.royale.compiler.targets.ITarget.TargetType; import org.apache.royale.compiler.targets.ITargetSettings; import org.apache.royale.compiler.units.ICompilationUnit; import org.apache.royale.compiler.units.ICompilationUnit.UnitType; +import org.apache.royale.compiler.utils.ClosureUtils; import org.apache.flex.tools.FlexTool; import org.apache.royale.utils.ArgumentUtil; import org.apache.royale.utils.FilenameNormalization; @@ -169,7 +171,7 @@ public class MXMLJSCNative implements JSCompilerEntryPoint, ProblemQueryProvider protected ITarget target; protected ITargetSettings targetSettings; protected IJSApplication jsTarget; - private IJSPublisher jsPublisher; + private IJSGoogPublisher jsPublisher; public MXMLJSCNative() { @@ -315,7 +317,8 @@ public class MXMLJSCNative implements JSCompilerEntryPoint, ProblemQueryProvider return false; } - jsPublisher = (IJSPublisher) project.getBackend().createPublisher( + Set<String> closurePropNamesToKeep = new HashSet<String>(); + jsPublisher = (IJSGoogPublisher) project.getBackend().createPublisher( project, errors, config); File outputFolder = jsPublisher.getOutputFolder(); @@ -381,11 +384,13 @@ public class MXMLJSCNative implements JSCompilerEntryPoint, ProblemQueryProvider } writer.close(); } + ClosureUtils.collectPropertyNamesToKeep(cu, project, closurePropNamesToKeep); } } if (jsPublisher != null) { + jsPublisher.setClosurePropertyNamesToKeep(closurePropNamesToKeep); compilationSuccess = jsPublisher.publish(problems); } else diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCNode.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCNode.java index bb83228..70c1c24 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCNode.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCNode.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -36,8 +37,8 @@ import org.apache.royale.compiler.clients.problems.ProblemPrinter; import org.apache.royale.compiler.clients.problems.ProblemQuery; import org.apache.royale.compiler.clients.problems.ProblemQueryProvider; import org.apache.royale.compiler.clients.problems.WorkspaceProblemFormatter; -import org.apache.royale.compiler.codegen.js.IJSPublisher; import org.apache.royale.compiler.codegen.js.IJSWriter; +import org.apache.royale.compiler.codegen.js.goog.IJSGoogPublisher; import org.apache.royale.compiler.config.Configuration; import org.apache.royale.compiler.config.ConfigurationBuffer; import org.apache.royale.compiler.config.Configurator; @@ -72,6 +73,7 @@ import org.apache.royale.compiler.targets.ITarget.TargetType; import org.apache.royale.compiler.targets.ITargetSettings; import org.apache.royale.compiler.units.ICompilationUnit; import org.apache.royale.compiler.units.ICompilationUnit.UnitType; +import org.apache.royale.compiler.utils.ClosureUtils; import org.apache.flex.tools.FlexTool; import org.apache.royale.utils.ArgumentUtil; import org.apache.royale.utils.FilenameNormalization; @@ -168,7 +170,7 @@ public class MXMLJSCNode implements JSCompilerEntryPoint, ProblemQueryProvider, protected ITarget target; protected ITargetSettings targetSettings; protected IJSApplication jsTarget; - private IJSPublisher jsPublisher; + private IJSGoogPublisher jsPublisher; public MXMLJSCNode() { @@ -317,7 +319,8 @@ public class MXMLJSCNode implements JSCompilerEntryPoint, ProblemQueryProvider, return false; } - jsPublisher = (IJSPublisher) project.getBackend().createPublisher( + Set<String> closurePropNamesToKeep = new HashSet<String>(); + jsPublisher = (IJSGoogPublisher) project.getBackend().createPublisher( project, errors, config); File outputFolder = jsPublisher.getOutputFolder(); @@ -383,6 +386,7 @@ public class MXMLJSCNode implements JSCompilerEntryPoint, ProblemQueryProvider, } writer.close(); } + ClosureUtils.collectPropertyNamesToKeep(cu, project, closurePropNamesToKeep); } } diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyale.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyale.java index 1236ef2..fe73f30 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyale.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyale.java @@ -38,8 +38,8 @@ import org.apache.royale.compiler.clients.problems.ProblemPrinter; import org.apache.royale.compiler.clients.problems.ProblemQuery; import org.apache.royale.compiler.clients.problems.ProblemQueryProvider; import org.apache.royale.compiler.clients.problems.WorkspaceProblemFormatter; -import org.apache.royale.compiler.codegen.js.IJSPublisher; import org.apache.royale.compiler.codegen.js.IJSWriter; +import org.apache.royale.compiler.codegen.js.goog.IJSGoogPublisher; import org.apache.royale.compiler.config.Configuration; import org.apache.royale.compiler.config.ConfigurationBuffer; import org.apache.royale.compiler.config.Configurator; @@ -86,6 +86,7 @@ import org.apache.royale.compiler.targets.ITarget.TargetType; import org.apache.royale.compiler.targets.ITargetSettings; import org.apache.royale.compiler.units.ICompilationUnit; import org.apache.royale.compiler.units.ICompilationUnit.UnitType; +import org.apache.royale.compiler.utils.ClosureUtils; import org.apache.flex.tools.FlexTool; import org.apache.royale.swc.ISWC; import org.apache.royale.swc.ISWCFileEntry; @@ -188,7 +189,7 @@ public class MXMLJSCRoyale implements JSCompilerEntryPoint, ProblemQueryProvider protected ITarget target; protected ITargetSettings targetSettings; protected IJSApplication jsTarget; - private IJSPublisher jsPublisher; + private IJSGoogPublisher jsPublisher; public MXMLJSCRoyale() { @@ -337,7 +338,8 @@ public class MXMLJSCRoyale implements JSCompilerEntryPoint, ProblemQueryProvider return false; } - jsPublisher = (IJSPublisher) project.getBackend().createPublisher( + Set<String> closurePropNamesToKeep = new HashSet<String>(); + jsPublisher = (IJSGoogPublisher) project.getBackend().createPublisher( project, errors, config); File outputFolder = jsPublisher.getOutputFolder(); @@ -414,6 +416,7 @@ public class MXMLJSCRoyale implements JSCompilerEntryPoint, ProblemQueryProvider } writer.close(); } + ClosureUtils.collectPropertyNamesToKeep(cu, project, closurePropNamesToKeep); } File externsReportFile = googConfiguration.getExternsReport(); if (externsReportFile != null) @@ -431,6 +434,7 @@ public class MXMLJSCRoyale implements JSCompilerEntryPoint, ProblemQueryProvider if (jsPublisher != null) { + jsPublisher.setClosurePropertyNamesToKeep(closurePropNamesToKeep); compilationSuccess = jsPublisher.publish(problems); } else @@ -817,7 +821,6 @@ public class MXMLJSCRoyale implements JSCompilerEntryPoint, ProblemQueryProvider // TODO Auto-generated catch block e.printStackTrace(); } - } /** diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyaleCordova.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyaleCordova.java index 378339c..80bca1a 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyaleCordova.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/MXMLJSCRoyaleCordova.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -36,8 +37,8 @@ import org.apache.royale.compiler.clients.problems.ProblemPrinter; import org.apache.royale.compiler.clients.problems.ProblemQuery; import org.apache.royale.compiler.clients.problems.ProblemQueryProvider; import org.apache.royale.compiler.clients.problems.WorkspaceProblemFormatter; -import org.apache.royale.compiler.codegen.js.IJSPublisher; import org.apache.royale.compiler.codegen.js.IJSWriter; +import org.apache.royale.compiler.codegen.js.goog.IJSGoogPublisher; import org.apache.royale.compiler.config.Configuration; import org.apache.royale.compiler.config.ConfigurationBuffer; import org.apache.royale.compiler.config.Configurator; @@ -72,6 +73,7 @@ import org.apache.royale.compiler.targets.ITarget.TargetType; import org.apache.royale.compiler.targets.ITargetSettings; import org.apache.royale.compiler.units.ICompilationUnit; import org.apache.royale.compiler.units.ICompilationUnit.UnitType; +import org.apache.royale.compiler.utils.ClosureUtils; import org.apache.flex.tools.FlexTool; import org.apache.royale.utils.ArgumentUtil; import org.apache.royale.utils.FilenameNormalization; @@ -171,7 +173,7 @@ public class MXMLJSCRoyaleCordova implements JSCompilerEntryPoint, ProblemQueryP protected ITarget target; protected ITargetSettings targetSettings; protected IJSApplication jsTarget; - private IJSPublisher jsPublisher; + private IJSGoogPublisher jsPublisher; public MXMLJSCRoyaleCordova() { @@ -320,7 +322,8 @@ public class MXMLJSCRoyaleCordova implements JSCompilerEntryPoint, ProblemQueryP return false; } - jsPublisher = (IJSPublisher) project.getBackend().createPublisher( + Set<String> closurePropNamesToKeep = new HashSet<String>(); + jsPublisher = (IJSGoogPublisher) project.getBackend().createPublisher( project, errors, config); File outputFolder = jsPublisher.getOutputFolder(); @@ -386,11 +389,13 @@ public class MXMLJSCRoyaleCordova implements JSCompilerEntryPoint, ProblemQueryP } writer.close(); } + ClosureUtils.collectPropertyNamesToKeep(cu, project, closurePropNamesToKeep); } } if (jsPublisher != null) { + jsPublisher.setClosurePropertyNamesToKeep(closurePropNamesToKeep); compilationSuccess = jsPublisher.publish(problems); } else diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/goog/IJSGoogPublisher.java b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/goog/IJSGoogPublisher.java new file mode 100644 index 0000000..eaa3bad --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/codegen/js/goog/IJSGoogPublisher.java @@ -0,0 +1,33 @@ +/* + * + * 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.royale.compiler.codegen.js.goog; + +import java.util.Set; + +import org.apache.royale.compiler.codegen.js.IJSPublisher; + +/** + * The {@link IJSGoogPublisher} interface allows the abstraction of project output + * generation. + */ +public interface IJSGoogPublisher extends IJSPublisher +{ + void setClosurePropertyNamesToKeep(Set<String> propertyNames); +} \ No newline at end of file diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyalePublisher.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyalePublisher.java index 77abfad..d823a33 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyalePublisher.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyalePublisher.java @@ -28,7 +28,7 @@ import org.apache.commons.io.filefilter.FileFileFilter; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.commons.io.filefilter.IOFileFilter; import org.apache.royale.compiler.clients.problems.ProblemQuery; -import org.apache.royale.compiler.codegen.js.IJSPublisher; +import org.apache.royale.compiler.codegen.js.goog.IJSGoogPublisher; import org.apache.royale.compiler.config.Configuration; import org.apache.royale.compiler.css.ICSSPropertyValue; import org.apache.royale.compiler.definitions.IClassDefinition; @@ -40,7 +40,6 @@ import org.apache.royale.compiler.internal.codegen.js.goog.JarSourceFile; import org.apache.royale.compiler.internal.css.CSSArrayPropertyValue; import org.apache.royale.compiler.internal.css.CSSFontFace; import org.apache.royale.compiler.internal.css.CSSFunctionCallPropertyValue; -import org.apache.royale.compiler.internal.definitions.ClassDefinition; import org.apache.royale.compiler.internal.driver.js.royale.JSCSSCompilationSession; import org.apache.royale.compiler.internal.driver.js.goog.JSGoogConfiguration; import org.apache.royale.compiler.internal.graph.GoogDepsWriter; @@ -58,7 +57,7 @@ import java.net.URLDecoder; import java.nio.charset.Charset; import java.util.*; -public class MXMLRoyalePublisher extends JSGoogPublisher implements IJSPublisher +public class MXMLRoyalePublisher extends JSGoogPublisher implements IJSGoogPublisher { public static final String ROYALE_OUTPUT_DIR_NAME = "bin"; @@ -103,6 +102,7 @@ public class MXMLRoyalePublisher extends JSGoogPublisher implements IJSPublisher private String moduleOutput; private boolean useStrictPublishing; private List<String> additionalHTML = new ArrayList<String>(); + private Set<String> closurePropertyNamesToKeep; private GoogDepsWriter getGoogDepsWriter(File intermediateDir, String mainClassQName, @@ -183,6 +183,11 @@ public class MXMLRoyalePublisher extends JSGoogPublisher implements IJSPublisher return outputFolder; } + public void setClosurePropertyNamesToKeep(Set<String> propertyNames) + { + closurePropertyNamesToKeep = propertyNames; + } + @Override public boolean publish(ProblemQuery problems) throws IOException { @@ -381,6 +386,7 @@ public class MXMLRoyalePublisher extends JSGoogPublisher implements IJSPublisher if (configuration.release()) { compilerWrapper = new JSClosureCompilerWrapper(googConfiguration.getJSCompilerOptions()); + compilerWrapper.setPropertyNamesToKeep(closurePropertyNamesToKeep); } if (compilerWrapper != null) diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogCompcConfiguration.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogCompcConfiguration.java index 2fa9464..a63a741 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogCompcConfiguration.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogCompcConfiguration.java @@ -446,7 +446,7 @@ public class JSGoogCompcConfiguration extends JSConfiguration // 'warn-public-vars' // - private boolean warnPublicVars = true; + private boolean warnPublicVars = false; public boolean getWarnPublicVars() { diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java index d4e5328..9942bd0 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/driver/js/goog/JSGoogConfiguration.java @@ -451,7 +451,7 @@ public class JSGoogConfiguration extends JSConfiguration // 'warn-public-vars' // - private boolean warnPublicVars = true; + private boolean warnPublicVars = false; public boolean getWarnPublicVars() { diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java new file mode 100644 index 0000000..785385e --- /dev/null +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ClosureUtils.java @@ -0,0 +1,86 @@ +/* + * + * 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.royale.compiler.utils; + +import java.util.Set; + +import org.apache.royale.compiler.definitions.IDefinition; +import org.apache.royale.compiler.definitions.IFunctionDefinition; +import org.apache.royale.compiler.definitions.ITypeDefinition; +import org.apache.royale.compiler.definitions.IVariableDefinition; +import org.apache.royale.compiler.internal.projects.RoyaleJSProject; +import org.apache.royale.compiler.internal.scopes.ASProjectScope.DefinitionPromise; +import org.apache.royale.compiler.units.ICompilationUnit; + +public class ClosureUtils +{ + public static void collectPropertyNamesToKeep(ICompilationUnit cu, RoyaleJSProject project, Set<String> result) + { + if (project.isExternalLinkage(cu)) + { + return; + } + boolean renamePublic = false; + boolean renameProtected = true; + for (IDefinition def : cu.getDefinitionPromises()) + { + if(def instanceof DefinitionPromise) + { + def = ((DefinitionPromise) def).getActualDefinition(); + } + if (def instanceof ITypeDefinition) + { + if (def.isImplicit() || def.isNative()) + { + continue; + } + ITypeDefinition typeDef = (ITypeDefinition) def; + for (IDefinition localDef : typeDef.getContainedScope().getAllLocalDefinitions()) + { + if (localDef.isImplicit()) + { + continue; + } + if (!localDef.isPublic() && !localDef.isProtected()) + { + continue; + } + if (localDef.isProtected() && renameProtected) + { + continue; + } + if (localDef.isPublic() && renamePublic) + { + continue; + } + if (!(localDef instanceof IVariableDefinition)) + { + continue; + } + if (localDef instanceof IFunctionDefinition) + { + continue; + } + result.add(localDef.getBaseName()); + } + } + } + } +} \ No newline at end of file diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/JSClosureCompilerWrapper.java b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/JSClosureCompilerWrapper.java index ae3d614..0364d35 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/JSClosureCompilerWrapper.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/JSClosureCompilerWrapper.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.logging.Level; import com.google.javascript.jscomp.CheckLevel; @@ -91,6 +92,7 @@ public class JSClosureCompilerWrapper private boolean skipTypeInference; private boolean sourceMap = false; private boolean verbose = false; + private Set<String> propertyNamesToKeep; public String targetFilePath; @@ -123,6 +125,11 @@ public class JSClosureCompilerWrapper { verbose = enabled; } + + public void setPropertyNamesToKeep(Set<String> propertyNames) + { + propertyNamesToKeep = propertyNames; + } public boolean compile() { @@ -160,7 +167,7 @@ public class JSClosureCompilerWrapper compiler_.setPassConfig(new RoyaleClosurePassConfig(options_, jsSourceFiles_.get(jsSourceFiles_.size() - 1).getName(), - variableMapInputPath == null ? null : new File(outputFolder, variableMapInputPath))); + variableMapInputPath == null ? null : new File(outputFolder, variableMapInputPath), propertyNamesToKeep)); Result result = compiler_.compile(jsExternsFiles_, jsSourceFiles_, options_); try
