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 5d78474b91ccbce528946ba511d35aea490efaac Author: Josh Tynjala <[email protected]> AuthorDate: Tue Dec 22 13:18:15 2020 -0800 mxml-reflect-object-property compiler option --- .../codegen/js/goog/JSGoogEmitterTokens.java | 3 +- .../royale/JSRoyaleBasicMXMLDescriptorEmitter.java | 56 +++++-- .../codegen/js/royale/JSRoyaleDocEmitter.java | 9 +- .../codegen/mxml/royale/MXMLRoyaleEmitter.java | 176 +++++++++++++++++---- .../driver/js/goog/JSGoogConfiguration.java | 19 +++ 5 files changed, 221 insertions(+), 42 deletions(-) diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java index 8afd294..75ffea6 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java @@ -38,7 +38,8 @@ public enum JSGoogEmitterTokens implements IEmitterTokens ARRAY("Array"), ERROR("Error"), SELF("self"), - SUPERCLASS("superClass_"); + SUPERCLASS("superClass_"), + GOOG_REFLECT_OBJECTPROPERTY("goog.reflect.objectProperty"); private String token; diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java index ea11bf7..934569b 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleBasicMXMLDescriptorEmitter.java @@ -22,12 +22,16 @@ package org.apache.royale.compiler.internal.codegen.js.royale; import org.apache.royale.compiler.codegen.ISubEmitter; import org.apache.royale.compiler.codegen.mxml.js.IMXMLJSEmitter; import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens; +import org.apache.royale.compiler.internal.codegen.js.goog.JSGoogEmitterTokens; import org.apache.royale.compiler.internal.codegen.mxml.MXMLSubEmitter; import org.apache.royale.compiler.internal.codegen.mxml.royale.MXMLDescriptorSpecifier; import org.apache.royale.compiler.internal.codegen.mxml.royale.MXMLEventSpecifier; +import org.apache.royale.compiler.internal.projects.RoyaleJSProject; public class JSRoyaleBasicMXMLDescriptorEmitter extends MXMLSubEmitter implements ISubEmitter<MXMLDescriptorSpecifier> { + private boolean useGoogReflectObjectProperty = false; + public JSRoyaleBasicMXMLDescriptorEmitter(IMXMLJSEmitter emitter) { super(emitter); @@ -36,6 +40,8 @@ public class JSRoyaleBasicMXMLDescriptorEmitter extends MXMLSubEmitter implement @Override public void emit(MXMLDescriptorSpecifier root) { + RoyaleJSProject project = (RoyaleJSProject) getMXMLWalker().getProject(); + useGoogReflectObjectProperty = project.config != null && project.config.getMxmlReflectObjectProperty(); outputDescriptorSpecifier(root, true); } @@ -201,9 +207,35 @@ public class JSRoyaleBasicMXMLDescriptorEmitter extends MXMLSubEmitter implement private void outputPropertySpecifier(MXMLDescriptorSpecifier specifier, boolean writeNewline) { - write((specifier.isProperty) ? ASEmitterTokens.SINGLE_QUOTE.getToken() : ""); - write(specifier.name); - write((specifier.isProperty) ? ASEmitterTokens.SINGLE_QUOTE.getToken() : ""); + if(specifier.isProperty) + { + if(useGoogReflectObjectProperty) + { + write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY); + write(ASEmitterTokens.PAREN_OPEN); + } + write(ASEmitterTokens.SINGLE_QUOTE); + write(specifier.name); + write(ASEmitterTokens.SINGLE_QUOTE); + if(useGoogReflectObjectProperty) + { + MXMLDescriptorSpecifier parentSpecifier = specifier.parent; + String id = (parentSpecifier.id != null) ? parentSpecifier.id : parentSpecifier.effectiveId; + write(ASEmitterTokens.COMMA); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.THIS); + if (id != null) + { + write(ASEmitterTokens.MEMBER_ACCESS); + write(id); + } + write(ASEmitterTokens.PAREN_CLOSE); + } + } + else + { + write(specifier.name); + } writeDelimiter(writeNewline); if (specifier.isProperty) @@ -252,13 +284,17 @@ public class JSRoyaleBasicMXMLDescriptorEmitter extends MXMLSubEmitter implement { write(specifier.propertySpecifiers.size() + 1 + ""); writeDelimiter(writeNewline); - String idPropName = (specifier.effectiveId != null) ? "_id" - : "id"; - writeSimpleDescriptor(idPropName, ASEmitterTokens.TRUE.getToken(), - ASEmitterTokens.SINGLE_QUOTE.getToken() - + ((specifier.id != null) ? specifier.id : specifier.effectiveId) + ASEmitterTokens.SINGLE_QUOTE.getToken(), - writeNewline); - + String idPropName = (specifier.effectiveId != null) ? "_id" : "id"; + String id = (specifier.id != null) ? specifier.id : specifier.effectiveId; + write(ASEmitterTokens.SINGLE_QUOTE); + write(idPropName); + write(ASEmitterTokens.SINGLE_QUOTE); + writeDelimiter(writeNewline); + write(ASEmitterTokens.TRUE); + writeDelimiter(writeNewline); + write(ASEmitterTokens.SINGLE_QUOTE); + write(id); + write(ASEmitterTokens.SINGLE_QUOTE); writeDelimiter(writeNewline); } else diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java index 05d27c2..8ee0bea 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleDocEmitter.java @@ -627,7 +627,10 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter } else { - boolean warnPublicVars = fjp.config != null && fjp.config.getWarnPublicVars() && !fjp.config.getPreventRenamePublicSymbols(); + boolean warnPublicVars = fjp.config != null + && fjp.config.getWarnPublicVars() + && !fjp.config.getPreventRenamePublicSymbols() + && !fjp.config.getMxmlReflectObjectProperty(); IMetaTagsNode meta = node.getMetaTags(); boolean bindable = false; if (meta != null) @@ -652,12 +655,12 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter } if (!suppressedWarning(node, fjp)) + { fjp.getProblems().add(new PublicVarWarningProblem(node.getSourcePath(), node.getStart(), node.getEnd(), warningNode.getLine(), warningNode.getColumn(), node.getEndLine(), node.getEndColumn())); - - + } } boolean avoidExport = (node.getASDocComment() instanceof ASDocComment && ((ASDocComment)node.getASDocComment()).commentNoEnd() diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java index f211c8f..ff2fc41 100644 --- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java +++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java @@ -1510,6 +1510,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker()) .getASEmitter(); boolean allowDynamicBindings = project.config != null && project.config.getAllowDynamicBindings(); + boolean useMxmlReflectObjectProperty = project.config != null && project.config.getMxmlReflectObjectProperty(); writeNewline("/**"); writeNewline(" * @export"); // must export or else GCC will remove it @@ -1528,7 +1529,10 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements boolean hadOutput = false; for (BindingInfo bi : bindingInfo) { - if (hadOutput) writeNewline(ASEmitterTokens.COMMA.getToken()); + if (hadOutput) + { + writeNewline(ASEmitterTokens.COMMA); + } hadOutput = true; String s; IMXMLNode node = bi.node; @@ -1559,7 +1563,11 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements IExpressionNode getterNode = getterNodes.get(i); sb.append(asEmitter.stringifyNode(getterNode)); if (i < n - 1) - sb.append(ASEmitterTokens.SPACE.getToken() + ASEmitterTokens.PLUS.getToken() + ASEmitterTokens.SPACE.getToken()); + { + sb.append(ASEmitterTokens.SPACE.getToken()); + sb.append(ASEmitterTokens.PLUS.getToken()); + sb.append(ASEmitterTokens.SPACE.getToken()); + } } sb.append("; },"); writeNewline(sb.toString()); @@ -1568,39 +1576,107 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements { if (bi.classDef != null) { - String[] parts = s.split("\\."); - write(ASEmitterTokens.SQUARE_OPEN.getToken() + ASEmitterTokens.DOUBLE_QUOTE.getToken() + - bi.classDef.getQualifiedName() + ASEmitterTokens.DOUBLE_QUOTE.getToken()); + String[] parts = s.split("\\."); String qname = bi.classDef.getQualifiedName(); + write(ASEmitterTokens.SQUARE_OPEN); + write(ASEmitterTokens.DOUBLE_QUOTE); + write(qname); + write(ASEmitterTokens.DOUBLE_QUOTE); if (!usedNames.contains(qname)) usedNames.add(qname); if (!staticUsedNames.contains(qname)) staticUsedNames.add(qname); + StringBuilder objString = null; + if (useMxmlReflectObjectProperty) + { + objString = new StringBuilder(); + objString.append(qname); + } int n = parts.length; for (int i = 1; i < n; i++) { String part = parts[i]; - write(", " + ASEmitterTokens.DOUBLE_QUOTE.getToken() + part + ASEmitterTokens.DOUBLE_QUOTE.getToken()); + write(", "); + if(useMxmlReflectObjectProperty) + { + write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY); + write(ASEmitterTokens.PAREN_OPEN); + } + write(ASEmitterTokens.DOUBLE_QUOTE); + write(part); + write(ASEmitterTokens.DOUBLE_QUOTE); + if(useMxmlReflectObjectProperty) + { + write(ASEmitterTokens.COMMA); + write(ASEmitterTokens.SPACE); + write(objString.toString()); + write(ASEmitterTokens.PAREN_CLOSE); + objString.append("."); + objString.append(part); + } } - writeNewline(ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.COMMA.getToken()); + write(ASEmitterTokens.SQUARE_CLOSE); + writeNewline(ASEmitterTokens.COMMA); } else { String[] parts = s.split("\\."); - write(ASEmitterTokens.SQUARE_OPEN.getToken() + ASEmitterTokens.DOUBLE_QUOTE.getToken() + - parts[0] + ASEmitterTokens.DOUBLE_QUOTE.getToken()); - int n = parts.length; - for (int i = 1; i < n; i++) + write(ASEmitterTokens.SQUARE_OPEN); + StringBuilder objString = null; + if (useMxmlReflectObjectProperty) + { + objString = new StringBuilder(); + objString.append("this"); + } + int n = parts.length; + for (int i = 0; i < n; i++) { - String part = parts[i]; - write(", " + ASEmitterTokens.DOUBLE_QUOTE.getToken() + part + ASEmitterTokens.DOUBLE_QUOTE.getToken()); - } - writeNewline(ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.COMMA.getToken()); + String part = parts[i]; + if (i > 0) + { + write(", "); + } + if(useMxmlReflectObjectProperty) + { + write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY); + write(ASEmitterTokens.PAREN_OPEN); + } + write(ASEmitterTokens.DOUBLE_QUOTE); + write(part); + write(ASEmitterTokens.DOUBLE_QUOTE); + if(useMxmlReflectObjectProperty) + { + write(ASEmitterTokens.COMMA); + write(ASEmitterTokens.SPACE); + write(objString.toString()); + write(ASEmitterTokens.PAREN_CLOSE); + objString.append("."); + objString.append(part); + } + } + write(ASEmitterTokens.SQUARE_CLOSE); + writeNewline(ASEmitterTokens.COMMA); } } else - writeNewline(ASEmitterTokens.DOUBLE_QUOTE.getToken() + s + - ASEmitterTokens.DOUBLE_QUOTE.getToken() + ASEmitterTokens.COMMA.getToken()); + { + if(useMxmlReflectObjectProperty) + { + write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY); + write(ASEmitterTokens.PAREN_OPEN); + } + write(ASEmitterTokens.DOUBLE_QUOTE); + write(s); + write(ASEmitterTokens.DOUBLE_QUOTE); + if(useMxmlReflectObjectProperty) + { + write(ASEmitterTokens.COMMA); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.THIS); + write(ASEmitterTokens.PAREN_CLOSE); + } + writeNewline(ASEmitterTokens.COMMA); + } IExpressionNode destNode = bi.getExpressionNodeForDestination(); s = bi.getDestinationString(); @@ -1621,32 +1697,75 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements { StringBuilder sb = new StringBuilder(); sb.append(generateSetterFunction(bi, destNode)); - writeNewline(sb.toString() + ASEmitterTokens.COMMA.getToken()); + write(sb.toString()); + writeNewline(ASEmitterTokens.COMMA); } else - writeNewline(ASEmitterTokens.NULL.getToken() + ASEmitterTokens.COMMA.getToken()); + { + write(ASEmitterTokens.NULL); + writeNewline(ASEmitterTokens.COMMA); + } if (s == null) { - write(ASEmitterTokens.NULL.getToken()); + write(ASEmitterTokens.NULL); } else if (s.contains(".")) { String[] parts = s.split("\\."); - write(ASEmitterTokens.SQUARE_OPEN.getToken() + ASEmitterTokens.DOUBLE_QUOTE.getToken() + - parts[0] + ASEmitterTokens.DOUBLE_QUOTE.getToken()); + write(ASEmitterTokens.SQUARE_OPEN); + StringBuilder objString = null; + if (useMxmlReflectObjectProperty) + { + objString = new StringBuilder(); + objString.append("this"); + } int n = parts.length; - for (int i = 1; i < n; i++) + for (int i = 0; i < n; i++) { String part = parts[i]; - write(", " + ASEmitterTokens.DOUBLE_QUOTE.getToken() + part + ASEmitterTokens.DOUBLE_QUOTE.getToken()); + if (i > 0) + { + write(", "); + } + if(useMxmlReflectObjectProperty) + { + write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY); + write(ASEmitterTokens.PAREN_OPEN); + } + write(ASEmitterTokens.DOUBLE_QUOTE); + write(part); + write(ASEmitterTokens.DOUBLE_QUOTE); + if(useMxmlReflectObjectProperty) + { + write(ASEmitterTokens.COMMA); + write(ASEmitterTokens.SPACE); + write(objString.toString()); + write(ASEmitterTokens.PAREN_CLOSE); + objString.append("."); + objString.append(part); + } } - write(ASEmitterTokens.SQUARE_CLOSE.getToken()); + write(ASEmitterTokens.SQUARE_CLOSE); } else { - write(ASEmitterTokens.DOUBLE_QUOTE.getToken() + s + - ASEmitterTokens.DOUBLE_QUOTE.getToken()); + if(useMxmlReflectObjectProperty) + { + write(JSGoogEmitterTokens.GOOG_REFLECT_OBJECTPROPERTY); + write(ASEmitterTokens.PAREN_OPEN); + } + write(ASEmitterTokens.DOUBLE_QUOTE); + write(s); + write(ASEmitterTokens.DOUBLE_QUOTE); + if(useMxmlReflectObjectProperty) + { + write(ASEmitterTokens.COMMA); + write(ASEmitterTokens.SPACE); + write(ASEmitterTokens.THIS); + write(ASEmitterTokens.PAREN_CLOSE); + } + writeNewline(ASEmitterTokens.COMMA); } } @@ -1670,7 +1789,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements if (hadOutput) writeNewline(); } - writeNewline( ASEmitterTokens.SQUARE_CLOSE.getToken() + ASEmitterTokens.SEMICOLON.getToken()); + write(ASEmitterTokens.SQUARE_CLOSE); + writeNewline(ASEmitterTokens.SEMICOLON); } private String generateSetterFunction(BindingInfo bi, IExpressionNode destNode) { 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 892cced..1f54cbc 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 @@ -883,6 +883,25 @@ public class JSGoogConfiguration extends JSConfiguration allowDynamicBindings = value; } + // + // 'mxml-reflect-object-property' + // + + private boolean mxmlReflectObjectProperty = false; + + public boolean getMxmlReflectObjectProperty() + { + return mxmlReflectObjectProperty; + } + + @Config + @Mapping("mxml-reflect-object-property") + public void setMxmlReflectObjectProperty(ConfigurationValue cv, boolean value) + throws ConfigurationException + { + mxmlReflectObjectProperty = value; + } + // // 'warn-public-vars'
