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); }
