You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2021/11/08 01:47:05 UTC
[royale-compiler] branch develop updated: Fix @royalesuppressexport
implementation to match the change to dynamic export configuration for
Closure compile,
. closes #193 This auto-populates metadata in the definitions which suits
querying of swc-loaded definitions.
This is an automated email from the ASF dual-hosted git repository.
gregdove pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
The following commit(s) were added to refs/heads/develop by this push:
new bf8da99 Fix @royalesuppressexport implementation to match the change to dynamic export configuration for Closure compile,. closes #193 This auto-populates metadata in the definitions which suits querying of swc-loaded definitions.
bf8da99 is described below
commit bf8da9968e70602073c54101bf3032d06b64a0fe
Author: greg-dove <gr...@gmail.com>
AuthorDate: Mon Nov 8 14:46:51 2021 +1300
Fix @royalesuppressexport implementation to match the change to dynamic export configuration for Closure compile,. closes #193
This auto-populates metadata in the definitions which suits querying of swc-loaded definitions.
---
.../apache/royale/compiler/clients/COMPJSC.java | 6 +++
.../internal/codegen/js/jx/AccessorEmitter.java | 12 +++---
.../internal/codegen/js/jx/ClassEmitter.java | 3 +-
.../codegen/js/royale/JSRoyaleDocEmitter.java | 21 ++++++-----
.../internal/codegen/js/utils/DocEmitterUtils.java | 15 +++++---
.../internal/parsing/as/RoyaleASDocDelegate.java | 44 ++++++++++++++++++++--
.../apache/royale/compiler/utils/ASNodeUtils.java | 18 +++++----
.../apache/royale/compiler/utils/ClosureUtils.java | 21 ++++++-----
.../royale/compiler/utils/DefinitionUtils.java | 16 ++++++++
9 files changed, 114 insertions(+), 42 deletions(-)
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
index d010412..06b218a 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/clients/COMPJSC.java
@@ -54,6 +54,7 @@ import org.apache.royale.compiler.exceptions.ConfigurationException;
import org.apache.royale.compiler.exceptions.ConfigurationException.IOError;
import org.apache.royale.compiler.exceptions.ConfigurationException.MustSpecifyTarget;
import org.apache.royale.compiler.internal.driver.js.goog.JSGoogCompcConfiguration;
+import org.apache.royale.compiler.internal.parsing.as.RoyaleASDocDelegate;
import org.apache.royale.compiler.internal.projects.CompilerProject;
import org.apache.royale.compiler.internal.targets.RoyaleSWCTarget;
import org.apache.royale.compiler.internal.units.SWCCompilationUnit;
@@ -207,6 +208,11 @@ public class COMPJSC extends MXMLJSC
System.out.println("COMPC");
COMPC compc = new COMPC();
mxmlc = compc;
+ //passing true to RoyaleASDocDelegate constructor, to make it behave (outwardly) the same
+ //as NilASDocDelegate, which would be the default ASDocDelegate, if the following
+ //setASDocDelegate assignment was not made. This allows for 'processing' of ASDocComments in
+ //the 'afterDefinition' call.
+ compc.workspace.setASDocDelegate(new RoyaleASDocDelegate(true));
compc.configurationClass = JSGoogCompcConfiguration.class;
result = compc.mainNoExit(removeJSArgs(args));
if (result != 0)
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
index f14a956..bc8aa0c 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/AccessorEmitter.java
@@ -22,7 +22,6 @@ package org.apache.royale.compiler.internal.codegen.js.jx;
import java.util.HashMap;
import java.util.Set;
-import org.apache.royale.compiler.asdoc.royale.ASDocComment;
import org.apache.royale.compiler.codegen.ISubEmitter;
import org.apache.royale.compiler.codegen.js.IJSEmitter;
import org.apache.royale.compiler.common.ASModifier;
@@ -55,6 +54,7 @@ import org.apache.royale.compiler.tree.as.IAccessorNode;
import org.apache.royale.compiler.tree.as.IGetterNode;
import org.apache.royale.compiler.tree.as.INamespaceDecorationNode;
import org.apache.royale.compiler.tree.as.ISetterNode;
+import org.apache.royale.compiler.utils.ASNodeUtils;
public class AccessorEmitter extends JSSubEmitter implements
ISubEmitter<IAccessorNode>
@@ -739,9 +739,8 @@ public class AccessorEmitter extends JSSubEmitter implements
{
// TODO (mschmalle) will remove this cast as more things get abstracted
JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter();
- boolean suppress = getModel().suppressExports ||
- (node.getASDocComment() != null &&
- ((ASDocComment)node.getASDocComment()).commentNoEnd().contains(JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken()));
+ boolean suppress = getModel().suppressExports || ASNodeUtils.hasExportSuppressed(node);
+;
if (suppress) getModel().suppressedExportNodes.add(node);
IDefinition def = node.getDefinition();
@@ -817,9 +816,8 @@ public class AccessorEmitter extends JSSubEmitter implements
// TODO (mschmalle) will remove this cast as more things get abstracted
JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter();
JSRoyaleDocEmitter doc = (JSRoyaleDocEmitter) fjs.getDocEmitter();
- boolean suppress = getModel().suppressExports ||
- (node.getASDocComment() != null &&
- ((ASDocComment)node.getASDocComment()).commentNoEnd().contains(JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken()));
+ boolean suppress = getModel().suppressExports || ASNodeUtils.hasExportSuppressed(node);
+
if (suppress) getModel().suppressedExportNodes.add(node);
IFunctionDefinition def = node.getDefinition();
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ClassEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ClassEmitter.java
index ca22de7..97e8470 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ClassEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/ClassEmitter.java
@@ -45,6 +45,7 @@ import org.apache.royale.compiler.internal.tree.as.VariableNode;
import org.apache.royale.compiler.tree.ASTNodeID;
import org.apache.royale.compiler.tree.as.*;
import org.apache.royale.compiler.units.ICompilationUnit;
+import org.apache.royale.compiler.utils.ASNodeUtils;
public class ClassEmitter extends JSSubEmitter implements
ISubEmitter<IClassNode>
@@ -92,7 +93,7 @@ public class ClassEmitter extends JSSubEmitter implements
}
}
- boolean suppressExport = (asDoc != null && DocEmitterUtils.hasSuppressExport(fjs, asDoc.commentNoEnd()));
+ boolean suppressExport = ASNodeUtils.hasExportSuppressed(node);
getModel().suppressExports = suppressExport;
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 8ee0bea..90ce582 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
@@ -31,9 +31,7 @@ import org.apache.royale.compiler.constants.IASLanguageConstants;
import org.apache.royale.compiler.definitions.IClassDefinition;
import org.apache.royale.compiler.definitions.IDefinition;
import org.apache.royale.compiler.definitions.IFunctionDefinition;
-import org.apache.royale.compiler.definitions.IFunctionDefinition.FunctionClassification;
import org.apache.royale.compiler.definitions.ITypeDefinition;
-import org.apache.royale.compiler.definitions.IVariableDefinition.VariableClassification;
import org.apache.royale.compiler.definitions.references.IReference;
import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
import org.apache.royale.compiler.internal.codegen.js.JSEmitterTokens;
@@ -49,6 +47,7 @@ import org.apache.royale.compiler.tree.ASTNodeID;
import org.apache.royale.compiler.tree.as.*;
import org.apache.royale.compiler.tree.metadata.IMetaTagNode;
import org.apache.royale.compiler.tree.metadata.IMetaTagsNode;
+import org.apache.royale.compiler.utils.ASNodeUtils;
public class JSRoyaleDocEmitter extends JSGoogDocEmitter
{
@@ -227,6 +226,13 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter
override = node.hasModifier(ASModifier.OVERRIDE);
String ns = node.getNamespace();
+
+ if (ASNodeUtils.hasExportSuppressed(node)) {
+ emitExports = false;
+ if (IASKeywordConstants.PUBLIC.equals(ns)) // suppress it for reflection data checks:
+ ((JSRoyaleEmitter) (emitter)).getModel().suppressedExportNodes.add(node);
+ }
+
if (ns != null)
{
if (asDoc != null && keepASDoc)
@@ -264,13 +270,12 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter
if (docText.contains(suppressClosureToken))
suppressClosure = true;
-
- String suppressExport = JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken();
- if (docText.contains(suppressExport)) {
+
+/* if (ASNodeUtils.hasExportSuppressed(node)) {
emitExports = false;
if (IASKeywordConstants.PUBLIC.equals(ns)) // suppress it for reflection data checks:
((JSRoyaleEmitter) (emitter)).getModel().suppressedExportNodes.add(node);
- }
+ }*/
write(changeAnnotations(asDoc.commentNoEnd()));
}
@@ -662,9 +667,7 @@ public class JSRoyaleDocEmitter extends JSGoogDocEmitter
node.getEndLine(), node.getEndColumn()));
}
}
- boolean avoidExport = (node.getASDocComment() instanceof ASDocComment
- && ((ASDocComment)node.getASDocComment()).commentNoEnd()
- .contains(JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken()));
+ boolean avoidExport = ASNodeUtils.hasExportSuppressed(node);
if (!avoidExport) {
if (ns.equals(IASKeywordConstants.PUBLIC))
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/DocEmitterUtils.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/DocEmitterUtils.java
index a188e76..ab5acd3 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/DocEmitterUtils.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/utils/DocEmitterUtils.java
@@ -22,9 +22,13 @@ package org.apache.royale.compiler.internal.codegen.js.utils;
import java.util.ArrayList;
import java.util.List;
+import org.apache.royale.compiler.codegen.js.royale.IJSRoyaleEmitter;
import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleDocEmitter;
import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter;
import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitterTokens;
+import org.apache.royale.compiler.tree.as.IDocumentableDefinitionNode;
+import org.apache.royale.compiler.utils.ASNodeUtils;
+import org.apache.royale.compiler.utils.DefinitionUtils;
public class DocEmitterUtils
{
@@ -47,13 +51,12 @@ public class DocEmitterUtils
((JSRoyaleDocEmitter)emitter.getDocEmitter()).setClassIgnoreList(ignoreList);
return ignoreList;
}
-
-
- public static Boolean hasSuppressExport(JSRoyaleEmitter emitter, String doc)
- {
- String ignoreToken = JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken();
- int index = doc.indexOf(ignoreToken);
+
+ public static Boolean hasSuppressExport(String doc) {
+ String suppressToken = JSRoyaleEmitterTokens.SUPPRESS_EXPORT.getToken();
+ int index = doc.indexOf(suppressToken);
return index != -1;
}
+
}
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/parsing/as/RoyaleASDocDelegate.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/parsing/as/RoyaleASDocDelegate.java
index 67ab4a3..1e1be6e 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/parsing/as/RoyaleASDocDelegate.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/parsing/as/RoyaleASDocDelegate.java
@@ -31,7 +31,12 @@ import org.apache.royale.compiler.asdoc.IPackageDITAParser;
import org.apache.royale.compiler.asdoc.royale.ASDocComment;
import org.apache.royale.compiler.common.ISourceLocation;
import org.apache.royale.compiler.definitions.IDocumentableDefinition;
+import org.apache.royale.compiler.internal.codegen.js.utils.DocEmitterUtils;
+import org.apache.royale.compiler.internal.tree.as.BaseDefinitionNode;
+import org.apache.royale.compiler.internal.tree.as.metadata.BasicMetaTagNode;
+import org.apache.royale.compiler.internal.tree.as.metadata.MetaTagsNode;
import org.apache.royale.compiler.tree.as.IDocumentableDefinitionNode;
+import org.apache.royale.compiler.utils.DefinitionUtils;
/**
* Default implementation of {@link IASDocDelegate} that does not have any code
@@ -51,14 +56,31 @@ public final class RoyaleASDocDelegate implements IASDocDelegate
return INSTANCE;
}
+ private boolean noDoc = false;
+
public RoyaleASDocDelegate()
{
}
+ /**
+ * Passing true as constructor argument allows for processing of comments, without returning
+ * the parsed comment for storage.
+ * This option is included to provide outward behavior similar to NilASDocDelegate, whilst
+ * still allowing its use as a 'hook' in the 'afterDefinition' method, to 'process' comments
+ * during initial processing of AST nodes.
+ *
+ * @param noDocReturn
+ */
+ public RoyaleASDocDelegate(Boolean noDocReturn)
+ {
+ super();
+ this.noDoc = noDocReturn;
+ }
+
@Override
public IASParserASDocDelegate getASParserASDocDelegate()
{
- return new ASDelegate();
+ return new ASDelegate(noDoc);
}
@Override
@@ -76,7 +98,13 @@ public final class RoyaleASDocDelegate implements IASDocDelegate
private static final class ASDelegate implements IASParserASDocDelegate, IMetadataParserASDocDelegate
{
@SuppressWarnings("unused")
- static final ASDelegate INSTANCE = new ASDelegate();
+ static final ASDelegate INSTANCE = new ASDelegate(false);
+
+ private boolean noDoc = false;
+ public ASDelegate(Boolean noDocReturn)
+ {
+ this.noDoc = noDocReturn;
+ }
@Override
public void beforeVariable()
@@ -103,8 +131,18 @@ public final class RoyaleASDocDelegate implements IASDocDelegate
return null;
ASDocComment comment = new ASDocComment(currentToken);
+ if (definitionNode instanceof BaseDefinitionNode && DocEmitterUtils.hasSuppressExport(comment.commentNoEnd())) {
+ MetaTagsNode tags = (MetaTagsNode)definitionNode.getMetaTags();
+ if (tags == null) {
+ tags = new MetaTagsNode();
+ ((BaseDefinitionNode) definitionNode).setMetaTags(tags);
+ }
+ if (!tags.hasTagByName(DefinitionUtils.JSROYALE_SUPPRESS_EXPORT)) {
+ tags.addTag(new BasicMetaTagNode(DefinitionUtils.JSROYALE_SUPPRESS_EXPORT));
+ }
+ }
currentToken = null;
- return comment;
+ return !noDoc ? comment : null;
}
@Override
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ASNodeUtils.java b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ASNodeUtils.java
index 2d6788c..b2ea9a6 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ASNodeUtils.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/ASNodeUtils.java
@@ -22,13 +22,7 @@ package org.apache.royale.compiler.utils;
import java.util.ArrayList;
import org.apache.royale.compiler.tree.ASTNodeID;
-import org.apache.royale.compiler.tree.as.IASNode;
-import org.apache.royale.compiler.tree.as.IBlockNode;
-import org.apache.royale.compiler.tree.as.IConditionalNode;
-import org.apache.royale.compiler.tree.as.IExpressionNode;
-import org.apache.royale.compiler.tree.as.IOperatorNode;
-import org.apache.royale.compiler.tree.as.ISwitchNode;
-import org.apache.royale.compiler.tree.as.ITerminalNode;
+import org.apache.royale.compiler.tree.as.*;
/**
* @author Michael Schmalle
@@ -90,4 +84,14 @@ public class ASNodeUtils
{
return node.getNodeID() == ASTNodeID.LiteralStringID;
}
+
+ /**
+ * Method for checking if a node has been marked to be suppressed for export by Closure, via its definition.
+ * The implementation is to check for [JSRoyaleSuppressExport] Metadata in the definition.
+ * This metadata is typically added by compiler-jx internally based on the @royalesuppressexport doc-comment directive.
+ * @param node the IDocumentableDefinitionNode instance to inspect as being suppressed for export
+ */
+ public static boolean hasExportSuppressed(IDocumentableDefinitionNode node) {
+ return node != null && node.getDefinition() != null && DefinitionUtils.hasExportSuppressed(node.getDefinition());
+ }
}
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
index fdf611c..a4a6af3 100644
--- 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
@@ -22,18 +22,15 @@ package org.apache.royale.compiler.utils;
import java.util.LinkedHashSet;
import java.util.Set;
-import org.apache.royale.compiler.asdoc.royale.ASDocComment;
import org.apache.royale.compiler.definitions.IAccessorDefinition;
import org.apache.royale.compiler.definitions.IDefinition;
import org.apache.royale.compiler.definitions.IFunctionDefinition;
-import org.apache.royale.compiler.definitions.INamespaceDefinition;
import org.apache.royale.compiler.definitions.IPackageDefinition;
import org.apache.royale.compiler.definitions.ITypeDefinition;
import org.apache.royale.compiler.definitions.IVariableDefinition;
import org.apache.royale.compiler.definitions.IVariableDefinition.VariableClassification;
import org.apache.royale.compiler.definitions.references.INamespaceReference;
import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter;
-import org.apache.royale.compiler.internal.codegen.js.utils.DocEmitterUtils;
import org.apache.royale.compiler.internal.projects.RoyaleJSProject;
import org.apache.royale.compiler.scopes.IASScope;
import org.apache.royale.compiler.scopes.IFileScope;
@@ -84,6 +81,9 @@ public class ClosureUtils
IPackageDefinition packageDef = (IPackageDefinition) def;
def = packageDef.getContainedScope().getAllLocalDefinitions().iterator().next();
}
+ if (DefinitionUtils.hasExportSuppressed(def)) {
+ continue;
+ }
if(scope instanceof IFileScope && def.isPrivate())
{
//file-private symbols are emitted like static variables
@@ -110,6 +110,9 @@ public class ClosureUtils
{
continue;
}
+ if (DefinitionUtils.hasExportSuppressed(localDef)) {
+ continue;
+ }
INamespaceReference nsRef = localDef.getNamespaceReference();
boolean isCustomNS = !nsRef.isLanguageNamespace();
boolean isMethod = localDef instanceof IFunctionDefinition
@@ -281,7 +284,9 @@ public class ClosureUtils
{
continue;
}
-
+ if (DefinitionUtils.hasExportSuppressed(def)) {
+ continue;
+ }
String qualifiedName = def.getQualifiedName();
boolean isFilePrivate = false;
if(scope instanceof IFileScope && def.isPrivate())
@@ -304,11 +309,6 @@ public class ClosureUtils
if (def instanceof ITypeDefinition)
{
ITypeDefinition typeDef = (ITypeDefinition) def;
- ASDocComment asDoc = (ASDocComment) typeDef.getExplicitSourceComment();
- if (asDoc != null && DocEmitterUtils.hasSuppressExport(null, asDoc.commentNoEnd()))
- {
- continue;
- }
for(IDefinition localDef : typeDef.getContainedScope().getAllLocalDefinitions())
{
@@ -316,6 +316,9 @@ public class ClosureUtils
{
continue;
}
+ if (DefinitionUtils.hasExportSuppressed(localDef)) {
+ continue;
+ }
boolean isMethod = localDef instanceof IFunctionDefinition
&& !(localDef instanceof IAccessorDefinition);
boolean isVar = localDef instanceof IVariableDefinition
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/DefinitionUtils.java b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/DefinitionUtils.java
index 40ec8e5..7da8710 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/utils/DefinitionUtils.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/utils/DefinitionUtils.java
@@ -23,12 +23,28 @@ import org.apache.royale.compiler.definitions.IClassDefinition;
import org.apache.royale.compiler.definitions.IDefinition;
import org.apache.royale.compiler.definitions.IInterfaceDefinition;
import org.apache.royale.compiler.projects.ICompilerProject;
+import org.apache.royale.compiler.tree.as.IDocumentableDefinitionNode;
/**
* @author Michael Schmalle
*/
public class DefinitionUtils
{
+
+ public static final String JSROYALE_SUPPRESS_EXPORT = "JSRoyaleSuppressExport";
+
+ /**
+ * Utility method for checking if a definition has been marked to be suppressed for export by Closure.
+ * The implementation is to check for [JSRoyaleSuppressExport] Metadata.
+ * (This metadata is typically added based on the @royalesuppressexport doc-comment directive, by the ASDocDelegate
+ * during parsing, instead of being present in the original code)
+ * @param def the definition to inspect as suppressed for export
+ */
+ public static boolean hasExportSuppressed(IDefinition def) {
+ return def.hasMetaTagByName(JSROYALE_SUPPRESS_EXPORT);
+ }
+
+
public static final boolean isMemberDefinition(IDefinition definition)
{
return definition != null