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