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 1c3e6375c56a6b8e3c8665688ce5b6119844973e
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed Mar 5 15:46:26 2025 -0800

    compiler-jx: avoid duplicates in usedNames/staticUsedNames by using a Set 
instead of a List
    
    The duplicates were causing multiple goog.require() calls for the same class
    
    As a bonus, this should be faster for compiler performance too
---
 .../codegen/js/royale/JSRoyaleEmitter.java         | 28 ++++++---------
 .../mxml/royale/MXMLRoyaleASDocEmitter.java        |  7 ++--
 .../codegen/mxml/royale/MXMLRoyaleEmitter.java     | 40 ++++++++++++----------
 3 files changed, 38 insertions(+), 37 deletions(-)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
index ecf679d18..a56c4333f 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/royale/JSRoyaleEmitter.java
@@ -144,8 +144,8 @@ public class JSRoyaleEmitter extends JSEmitter implements 
IJSRoyaleEmitter
     private ObjectDefinePropertyEmitter objectDefinePropertyEmitter;
     private DefinePropertyFunctionEmitter definePropertyFunctionEmitter;
 
-    public ArrayList<String> usedNames = new ArrayList<String>();
-    public ArrayList<String> staticUsedNames = new ArrayList<String>();
+    public Set<String> usedNames = new HashSet<String>();
+    public Set<String> staticUsedNames = new HashSet<String>();
     private boolean needNamespace;
     
     private Set<IFunctionNode> emittingHoistedNodes = new 
HashSet<IFunctionNode>();
@@ -201,13 +201,6 @@ public class JSRoyaleEmitter extends JSEmitter implements 
IJSRoyaleEmitter
                         foundNamespace = true;
                     }
                                sawRequires = true;
-                               /*
-                               if (!usedNames.contains(s))
-                    {
-                        removeLineFromMappings(i);
-                        continue;
-                    }
-                    */
                        }
                        else if (sawRequires || i == len - 1)
                 {
@@ -808,8 +801,7 @@ public class JSRoyaleEmitter extends JSEmitter implements 
IJSRoyaleEmitter
         write(IASLanguageConstants.Namespace);
         endMapping(node);
         write(ASEmitterTokens.PAREN_OPEN);
-        if (!staticUsedNames.contains(IASLanguageConstants.Namespace))
-               staticUsedNames.add(IASLanguageConstants.Namespace);
+        staticUsedNames.add(IASLanguageConstants.Namespace);
         IExpressionNode uriNode = node.getNamespaceURINode();
         if (uriNode == null)
         {
@@ -934,14 +926,18 @@ public class JSRoyaleEmitter extends JSEmitter implements 
IJSRoyaleEmitter
        else if (!isDoc)
        {
                if (getModel().inStaticInitializer)
-                       if (!staticUsedNames.contains(name) && 
!NativeUtils.isJSNative(name)
+            {
+                       if (!NativeUtils.isJSNative(name)
                                        && isGoogProvided(name) && 
(getModel().getCurrentClass() == null || 
!getModel().getCurrentClass().getQualifiedName().equals(name))
                                        && (getModel().primaryDefinitionQName 
== null
                                                || 
!getModel().primaryDefinitionQName.equals(name)))
                                staticUsedNames.add(name);
+            }
                
-               if (!usedNames.contains(name) && isGoogProvided(name))
+               if (isGoogProvided(name))
+            {
                        usedNames.add(name);
+            }
        }
         return name;
     }
@@ -1900,8 +1896,7 @@ public class JSRoyaleEmitter extends JSEmitter implements 
IJSRoyaleEmitter
         }
         if (getModel().inStaticInitializer)
         {
-               if 
(!staticUsedNames.contains(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken()))
-                       
staticUsedNames.add(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken());
+            
staticUsedNames.add(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken());
         }
         if (project instanceof RoyaleJSProject)
                ((RoyaleJSProject)project).needLanguage = true;
@@ -1914,8 +1909,7 @@ public class JSRoyaleEmitter extends JSEmitter implements 
IJSRoyaleEmitter
         super.emitAssignmentCoercion(assignedNode, definition);
         if (getModel().inStaticInitializer)
         {
-               if 
(!staticUsedNames.contains(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken()))
-                       
staticUsedNames.add(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken());
+            
staticUsedNames.add(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken());
         }
 
     }
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleASDocEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleASDocEmitter.java
index 0d5702f3f..b16d7721c 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleASDocEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleASDocEmitter.java
@@ -23,6 +23,7 @@ package 
org.apache.royale.compiler.internal.codegen.mxml.royale;
 import java.io.FilterWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -72,7 +73,7 @@ public class MXMLRoyaleASDocEmitter extends MXMLEmitter 
implements
     //private ArrayList<MXMLStyleSpecifier> styles;
     private IClassDefinition classDefinition;
     private IClassDefinition documentDefinition;
-    private ArrayList<String> usedNames = new ArrayList<String>();
+    private Set<String> usedNames = new HashSet<String>();
     
     private int eventCounter;
     private int idCounter;
@@ -1225,8 +1226,10 @@ public class MXMLRoyaleASDocEmitter extends MXMLEmitter 
implements
        if (subDocumentNames.contains(name))
                return documentDefinition.getQualifiedName() + "." + name;
         if (NativeUtils.isJSNative(name)) return name;
-               if (useName && !usedNames.contains(name))
+               if (useName)
+        {
                        usedNames.add(name);
+        }
        return name;
     }
 
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 1576125db..909c3f3b9 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
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -131,8 +132,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
     //private ArrayList<MXMLStyleSpecifier> styles;
     private IClassDefinition classDefinition;
     private IClassDefinition documentDefinition;
-    private ArrayList<String> usedNames = new ArrayList<String>();
-    private ArrayList<String> staticUsedNames = new ArrayList<String>();
+    private Set<String> usedNames = new HashSet<String>();
+    private Set<String> staticUsedNames = new HashSet<String>();
     private ArrayList<IMXMLMetadataNode> metadataNodes = new 
ArrayList<IMXMLMetadataNode>();
     // separately track all fx:Declarations that are primitive types 
(fx:String, fx:Array)
     private ArrayList<IMXMLInstanceNode> primitiveDeclarationNodes = new 
ArrayList<IMXMLInstanceNode>();
@@ -187,11 +188,11 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
     public String postProcess(String output)
     {
         IASEmitter asEmitter = ((IMXMLBlockWalker) 
getMXMLWalker()).getASEmitter();
-        ArrayList<String> asEmitterUsedNames = 
((JSRoyaleEmitter)asEmitter).usedNames;
+        Set<String> asEmitterUsedNames = 
((JSRoyaleEmitter)asEmitter).usedNames;
         JSRoyaleEmitter fjs = (JSRoyaleEmitter)asEmitter;
 
         String currentClassName = 
fjs.getModel().getCurrentClass().getQualifiedName();
-        ArrayList<String> removals = new ArrayList<String>();
+        Set<String> removals = new HashSet<String>();
         for (String usedName : asEmitterUsedNames) {
             //remove any internal component that has been registered with the 
other emitter's usedNames
             if (usedName.startsWith(currentClassName+".") && 
subDocumentNames.contains(usedName.substring(currentClassName.length()+1))) {
@@ -210,8 +211,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
         }
         usedNames.addAll(asEmitterUsedNames);
         
-        ArrayList<String> asStaticEmitterUsedNames = 
((JSRoyaleEmitter)asEmitter).staticUsedNames;
-        removals = new ArrayList<String>();
+        Set<String> asStaticEmitterUsedNames = 
((JSRoyaleEmitter)asEmitter).staticUsedNames;
+        removals = new HashSet<String>();
         for (String usedName : asStaticEmitterUsedNames) {
             //remove any internal component that has been registered with the 
other emitter's usedNames
             if (usedName.startsWith(currentClassName+".") && 
subDocumentNames.contains(usedName.substring(currentClassName.length()+1))) {
@@ -281,7 +282,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
                            royaleProject = (RoyaleJSProject) project;
 
                                stillSearching = false;
-                    for (String usedName :usedNames) {
+                    for (String usedName : usedNames) {
                         if (!foundRequires.contains(usedName)) {
                             if 
(usedName.equals(classDefinition.getQualifiedName())) continue;
                             if (((JSRoyaleEmitter) 
asEmitter).getModel().isInternalClass(usedName)) continue;
@@ -640,8 +641,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
         }
                if (staticUsedNames.size() > 0)
                {
-                       if (staticUsedNames.size() > 1 ||
-                                       
!staticUsedNames.get(0).equals(currentClassName))
+                       if (staticUsedNames.size() > 1 || 
!staticUsedNames.contains(currentClassName))
                        {
                                StringBuilder sb = new StringBuilder();
                                
sb.append(JSGoogEmitterTokens.ROYALE_STATIC_DEPENDENCY_LIST.getToken());
@@ -1627,10 +1627,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
                     write(ASEmitterTokens.DOUBLE_QUOTE);
                     write(qname);
                     write(ASEmitterTokens.DOUBLE_QUOTE);
-                       if (!usedNames.contains(qname))
-                               usedNames.add(qname);
-                       if (!staticUsedNames.contains(qname))
-                               staticUsedNames.add(qname);
+                    usedNames.add(qname);
+                    staticUsedNames.add(qname);
                     StringBuilder objString = null;
                     if (useMxmlReflectObjectProperty)
                     {
@@ -3461,8 +3459,7 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             //we need to add EventDispatcher
             if (deps.indexOf(BindableEmitter.DISPATCHER_CLASS_QNAME) == -1)
                 deps.add(BindableEmitter.DISPATCHER_CLASS_QNAME);
-            if (usedNames.indexOf(BindableEmitter.DISPATCHER_CLASS_QNAME) == 
-1)
-                usedNames.add(BindableEmitter.DISPATCHER_CLASS_QNAME);
+            usedNames.add(BindableEmitter.DISPATCHER_CLASS_QNAME);
         }
 
         if (interfaceList != null)
@@ -3526,7 +3523,14 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
             if (project instanceof RoyaleJSProject)
             {
                if (((RoyaleJSProject)project).needLanguage)
-                       
emitHeaderLine(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken());
+                {
+                    String formatted = 
JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken();
+                    if (writtenInstances.indexOf(formatted) == -1)
+                    {
+                           
emitHeaderLine(JSRoyaleEmitterTokens.LANGUAGE_QNAME.getToken());
+                        writtenInstances.add(formatted);
+                    }
+                }
             }
         }
 
@@ -3654,13 +3658,13 @@ public class MXMLRoyaleEmitter extends MXMLEmitter 
implements
         if (NativeUtils.isJSNative(name)) return name;
         if (inStaticInitializer)
         {
-            if (!staticUsedNames.contains(name) && 
!NativeUtils.isJSNative(name) && isGoogProvided(name))
+            if (!NativeUtils.isJSNative(name) && isGoogProvided(name))
             {
                 staticUsedNames.add(name);
             }
         }
 
-        if (useName && !usedNames.contains(name) && isGoogProvided(name))
+        if (useName && isGoogProvided(name))
         {
             usedNames.add(name);
         }

Reply via email to