control which getter/setters get renamed by GCC by faking a set of externs. AFAICT that is what @export on the Object.defineProperties object did. It didn't actually create an export alias like exportSymbol per class, it just prevented renaming of the object keys with that name
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/207a9587 Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/207a9587 Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/207a9587 Branch: refs/heads/develop Commit: 207a95872e4928a5af40209a6f436c51e7c14ace Parents: 6331b80 Author: Alex Harui <aha...@apache.org> Authored: Fri Aug 11 20:55:06 2017 -0700 Committer: Alex Harui <aha...@apache.org> Committed: Fri Aug 11 20:55:06 2017 -0700 ---------------------------------------------------------------------- .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java | 45 ++++++++++++++++++++ .../mxml/flexjs/MXMLFlexJSPublisher.java | 36 ++++++++++++++++ .../internal/projects/FlexJSProject.java | 12 ++++++ 3 files changed, 93 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/207a9587/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 c79bfea..5d29850 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 @@ -43,6 +43,7 @@ import org.apache.flex.compiler.constants.IASKeywordConstants; import org.apache.flex.compiler.constants.IASLanguageConstants; import org.apache.flex.compiler.definitions.IClassDefinition; import org.apache.flex.compiler.definitions.IDefinition; +import org.apache.flex.compiler.definitions.ITypeDefinition; import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.flex.compiler.internal.codegen.databinding.BindingDatabase; import org.apache.flex.compiler.internal.codegen.databinding.BindingInfo; @@ -753,6 +754,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements MXMLDescriptorSpecifier root = currentStateOverrides; root.isTopNode = true; + collectExportedNames(root); + writeNewline("/**"); if (emitExports) writeNewline(" * @export"); @@ -788,6 +791,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements MXMLDescriptorSpecifier root = propertiesTree; root.isTopNode = true; writeNewline(root.output(true)); + + collectExportedNames(root); write(ASEmitterTokens.SQUARE_CLOSE); write(ASEmitterTokens.PAREN_CLOSE); @@ -1152,6 +1157,15 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements for (BindingInfo bi : bindingInfo) { String s; + IMXMLNode node = bi.node; + if (node instanceof IMXMLSingleDataBindingNode) + { + IMXMLSingleDataBindingNode sbdn = (IMXMLSingleDataBindingNode)node; + FlexJSProject project = (FlexJSProject)getMXMLWalker().getProject(); + IDefinition bdef = sbdn.getExpressionNode().resolve(project); + IDefinition cdef = bdef.getParent(); + project.addExportedName(/*cdef.getQualifiedName() + "." + */bdef.getBaseName()); + } s = bi.getSourceString(); if (s == null && bi.isSourceSimplePublicProperty()) s = getSourceStringFromGetter(bi.getExpressionNodesForGetter()); @@ -1652,6 +1666,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements MXMLDescriptorSpecifier root = descriptorTree.get(0); root.isTopNode = false; + collectExportedNames(root); + indentPush(); writeNewline("'MXMLDescriptor': {"); writeNewline("/** @this {" + formatQualifiedName(cname) + "} */"); @@ -1697,6 +1713,35 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements } + private void collectExportedNames(MXMLDescriptorSpecifier descriptor) + { + ICompilerProject project = getMXMLWalker().getProject(); + FlexJSProject flexJSProject = null; + if (project instanceof FlexJSProject) + { + flexJSProject = (FlexJSProject) project; + String name = descriptor.name; + if (name == null) + name = this.classDefinition.getQualifiedName(); + for (MXMLDescriptorSpecifier prop : descriptor.propertySpecifiers) + { + String propName = prop.name; + flexJSProject.addExportedName(/*name + "." + */propName); + if (prop.propertySpecifiers.size() > 0) + { + collectExportedNames(prop.propertySpecifiers.get(0)); + } + } + if (descriptor.childrenSpecifier != null) + { + for (MXMLDescriptorSpecifier prop : descriptor.childrenSpecifier.propertySpecifiers) + { + collectExportedNames(prop); + } + } + } + } + //-------------------------------------------------------------------------- private HashMap<IMXMLEventSpecifierNode, String> eventHandlerNameMap = new HashMap<IMXMLEventSpecifierNode, String>(); http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/207a9587/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 c0c382f..a46c9ba 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 @@ -266,6 +266,7 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements IJSPublisher compilerWrapper.addJSSourceFile(closureSourceFile); } + writeExportedNames(compilerWrapper); ///////////////////////////////////////////////////////////////////////////////// // Add all the externs to the compilation @@ -766,5 +767,40 @@ public class MXMLFlexJSPublisher extends JSGoogPublisher implements IJSPublisher } return true; } + + private void writeExportedNames(JSClosureCompilerWrapper compilerWrapper) + { + if (!googConfiguration.getExportPublicSymbols()) + { + // if not generating exports for every public symbol + // generate an externs file that blocks renaming + // of properties used by MXML and dataBinding. + Set<String> exportedNames = project.getExportedNames(); + if (exportedNames.size() > 0) + { + StringBuilder sb = new StringBuilder(); + sb.append("/**\n"); + sb.append(" * generated by Apache FlexJS compiler\n"); + sb.append(" * @externs\n"); + sb.append(" */\n"); + for (String name : exportedNames) + { + sb.append("\n\n"); + sb.append("/**\n"); + sb.append(" * @export\n"); + sb.append(" */\n"); + sb.append("Object.prototype." + name + ";\n"); + } + File exportsFile = new File(outputFolder, "dontrename.js"); + try { + writeFile(exportsFile, sb.toString(), false); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + compilerWrapper.addJSExternsFile(exportsFile.getAbsolutePath()); + } + } + } } http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/207a9587/compiler-jx/src/main/java/org/apache/flex/compiler/internal/projects/FlexJSProject.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/projects/FlexJSProject.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/projects/FlexJSProject.java index 8dc88b0..8c2b232 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/projects/FlexJSProject.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/projects/FlexJSProject.java @@ -21,6 +21,7 @@ package org.apache.flex.compiler.internal.projects; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -431,4 +432,15 @@ public class FlexJSProject extends FlexProject return true; } + private HashSet<String> exportedNames = new HashSet<String>(); + + public void addExportedName(String name) + { + exportedNames.add(name); + } + + public Set<String> getExportedNames() + { + return exportedNames; + } }