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 355054c89f75fd6bd78e48aad2ee84d11cf8bf4a
Author: Josh Tynjala <joshtynj...@apache.org>
AuthorDate: Wed Mar 6 14:32:05 2024 -0800

    RoyaleProject: collect missing errors from MXMLManifestManager, which 
indicate if a manifest XML file is invalid or creates an invalid mapping
    
    MXMLManifestManager: report a problem if a manifest XML file contains 
invalid XML
---
 .../internal/mxml/MXMLManifestManager.java         | 108 ++++++++-------------
 .../compiler/internal/projects/RoyaleProject.java  |  13 +++
 .../royale/compiler/mxml/IMXMLManifestManager.java |   3 +
 ...nifestInconsistentComponentEntriesProblem.java} |  16 +--
 ...estProblem.java => ManifestParsingProblem.java} |  22 ++---
 5 files changed, 79 insertions(+), 83 deletions(-)

diff --git 
a/compiler/src/main/java/org/apache/royale/compiler/internal/mxml/MXMLManifestManager.java
 
b/compiler/src/main/java/org/apache/royale/compiler/internal/mxml/MXMLManifestManager.java
index 5271c5f5c..575c642ed 100644
--- 
a/compiler/src/main/java/org/apache/royale/compiler/internal/mxml/MXMLManifestManager.java
+++ 
b/compiler/src/main/java/org/apache/royale/compiler/internal/mxml/MXMLManifestManager.java
@@ -25,7 +25,6 @@ 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.Set;
 import java.util.TreeSet;
@@ -36,11 +35,12 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
-
+import org.xml.sax.SAXException;
 import org.apache.royale.compiler.mxml.IMXMLManifestManager;
 import org.apache.royale.compiler.mxml.IMXMLNamespaceMapping;
 import org.apache.royale.compiler.problems.ICompilerProblem;
-import org.apache.royale.compiler.problems.ManifestProblem;
+import 
org.apache.royale.compiler.problems.ManifestInconsistentComponentEntriesProblem;
+import org.apache.royale.compiler.problems.ManifestParsingProblem;
 import org.apache.royale.compiler.common.XMLName;
 import org.apache.royale.compiler.config.CompilerDiagnosticsConstants;
 import org.apache.royale.compiler.filespecs.IFileSpecification;
@@ -60,7 +60,7 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
 {
     /**
      * Helper method to get the class name from the
-     * class info. Takes are of checking if the class
+     * class info. Takes care of checking if the class
      * info is null.
      * 
      * @param classInfo may be null.
@@ -109,11 +109,8 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
      * an MXML tag name such as "&lt;s:Button&gt;".
      */
     private SetMultimap<String, XMLName> reverseLookupMap = 
HashMultimap.<String, XMLName>create();
-    
-    // Maps an MXML tag name to a list of (qname, path) duples,
-    // for reporting inconsistencies or duplications between manifests.
-    private HashMap<XMLName, ArrayList<ProblemEntry>> problemMap =
-        new HashMap<XMLName, ArrayList<ProblemEntry>>();
+
+    private Collection<ICompilerProblem> problems = new 
ArrayList<ICompilerProblem>();
     
     //
     // Object overrides
@@ -209,7 +206,7 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
             
             // Add the mapping info in the <component> tag
             // to the maps of this manifest manager.
-            add(tagName, qname, swcFile.getAbsolutePath(), false);
+            add(tagName, qname, uri, swcFile.getAbsolutePath(), false);
         }        
     }
     
@@ -231,9 +228,17 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
             documentBuilderFactory.setIgnoringComments(true);
             manifestDocument = 
documentBuilderFactory.newDocumentBuilder().parse(new 
InputSource(manifestFileSpec.createReader()));
         }
+        catch (SAXException e)
+        {
+            ManifestParsingProblem problem = new 
ManifestParsingProblem(e.getMessage(), uri, manifestFileName);
+            problems.add(problem);
+            return;
+        }
         catch (Exception e)
         {
-            // TODO Report a problem.
+            ManifestParsingProblem problem = new 
ManifestParsingProblem("Unknown parsing problem", uri, manifestFileName);
+            problems.add(problem);
+            return;
         }
 
         if (manifestDocument != null)
@@ -264,7 +269,7 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
                     
                     if (id != null && className != null)
                     {
-                        add(tagName, className, manifestFileName, true);
+                        add(tagName, className, uri, manifestFileName, true);
 
                         if (lookupOnly)
                             addLookupOnly(tagName, className);
@@ -272,8 +277,6 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
                 }
             }
         }
-        else
-            System.err.println("Unable to parse " + manifestFileName);
     }
     
     /**
@@ -286,8 +289,8 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
      * 
      * @param file The SWC file in which the mapping was declared.
      */
-    private void add(XMLName tagName, String className, String fileName,
-                     boolean fromManifest)
+    private void add(XMLName tagName, String className, String uri,
+                     String fileName, boolean fromManifest)
     {
         if (!lookupMap.containsKey(tagName))
         {
@@ -306,8 +309,22 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
             // otherwise getQualifiedNamesForNamespaces() won't return the
             // right names and COMPC won't link in all the classes that
             // were in manifests.
+            ClassInfo classInfo = lookupMap.get(tagName);
             if (fromManifest)
-                lookupMap.get(tagName).fromManifest = true;
+            {
+                boolean wasFromManifest = classInfo.fromManifest;
+                classInfo.fromManifest = true;
+                if (!wasFromManifest)
+                {
+                    // manifest takes precedence over SWC, and a manifest uses 
a
+                    // different class name than a SWC for the same URI, that 
is
+                    // not treated as an error.
+                    // however, if two manifests have different classes names
+                    // for the same URI, that will be treated as an error.
+                    classInfo.className = className;
+                    return;
+                }
+            }
         }
         
         // If subsequent classNames added for this tagName aren't consistent,
@@ -315,20 +332,15 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
         // resolve to a class.
         String oldClassName = getClassName(lookupMap.get(tagName)); 
         if (className.equals(oldClassName))
+        {
             return;
+        }
         
         lookupMap.put(tagName, null);
         reverseLookupMap.remove(oldClassName, tagName);
         
-        // 
-        ProblemEntry entry = new ProblemEntry(className, fileName);
-        ArrayList<ProblemEntry> list = problemMap.get(tagName);
-        if (list == null)
-        {
-            list = new ArrayList<ProblemEntry>();
-            problemMap.put(tagName, list);
-        }
-        list.add(entry);
+        ICompilerProblem problem = new 
ManifestInconsistentComponentEntriesProblem(tagName.getName(), uri, fileName);
+        problems.add(problem);
     }
     
     /**
@@ -348,6 +360,11 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
             lookupOnlyMap.put(tagName, className);
         }
     }
+
+    public void collectProblems(Collection<ICompilerProblem> problems)
+    {
+        problems.addAll(getProblems());
+    }
     
     /**
      * Looks for inconsistent manifest mappings and returns
@@ -357,22 +374,6 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
      */
     public Collection<ICompilerProblem> getProblems()
     {
-        Collection<ICompilerProblem> problems = new 
HashSet<ICompilerProblem>();
-        
-        // Search the lookupMap for null values, which indicate
-        // an inconsistent tagName->className mapping.
-        for (XMLName key : lookupMap.keySet())
-        {
-            if (lookupMap.get(key) == null)
-            {
-                // The corresponding entry in the problemMap
-                // has information about all the mapping of that tagName.
-                List<ProblemEntry> list = problemMap.get(key);
-                ICompilerProblem problem = new ManifestProblem(list);
-                problems.add(problem);
-            }
-        }
-        
         return problems;
     }
     
@@ -397,27 +398,4 @@ public class MXMLManifestManager implements 
IMXMLManifestManager
         public String className;
         public boolean fromManifest;
     }
-    
-    /**
-     * This inner class is a simple duple struct used to keep track
-     * of all the manifest mappings for a particular tag.
-     * For example, <whatever:Foo> might map to a.b.Foo in
-     * X.swc and Y.swc but c.d.Foo in Z.swc.
-     * We keep track of all of this so that we can create compiler
-     * problems describing where the inconsistencies are.
-     */
-    private static class ProblemEntry
-    {
-        ProblemEntry(String className, String fileName)
-        {
-            this.className = className;
-            this.fileName = fileName;
-        }
-        
-        @SuppressWarnings("unused")
-        public String className;
-        
-        @SuppressWarnings("unused")
-        public String fileName;
-    }
 }
diff --git 
a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java
 
b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java
index a3bb1c484..3bf7a6139 100644
--- 
a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java
+++ 
b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java
@@ -81,6 +81,7 @@ import 
org.apache.royale.compiler.internal.workspaces.Workspace;
 import org.apache.royale.compiler.mxml.IMXMLLanguageConstants;
 import org.apache.royale.compiler.mxml.IMXMLManifestManager;
 import org.apache.royale.compiler.mxml.IMXMLNamespaceMapping;
+import org.apache.royale.compiler.problems.ICompilerProblem;
 import org.apache.royale.compiler.projects.ICompilerProjectWithNamedColor;
 import org.apache.royale.compiler.projects.IRoyaleProject;
 import org.apache.royale.compiler.scopes.IASScope;
@@ -1498,6 +1499,18 @@ public class RoyaleProject extends ASProject implements 
IRoyaleProject, ICompile
                 namespaceURIs, true);
     }
 
+
+
+    @Override
+    public void collectProblems(Collection<ICompilerProblem> problems)
+    {
+        super.collectProblems(problems);
+        if (manifestManager != null)
+        {
+            manifestManager.collectProblems(problems);
+        }
+    }
+
     /**
      * Test is a component is 'lookupOnly' or not. If a component is
      * 'lookupOnly' is means this component it not expect to have source in the
diff --git 
a/compiler/src/main/java/org/apache/royale/compiler/mxml/IMXMLManifestManager.java
 
b/compiler/src/main/java/org/apache/royale/compiler/mxml/IMXMLManifestManager.java
index 77fc7a294..77e6381da 100755
--- 
a/compiler/src/main/java/org/apache/royale/compiler/mxml/IMXMLManifestManager.java
+++ 
b/compiler/src/main/java/org/apache/royale/compiler/mxml/IMXMLManifestManager.java
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.Set;
 
 import org.apache.royale.compiler.common.XMLName;
+import org.apache.royale.compiler.problems.ICompilerProblem;
 
 /**
  * 
@@ -79,4 +80,6 @@ public interface IMXMLManifestManager
      * specified set of namespaces.
      */
     Collection<String> getQualifiedNamesForNamespaces(Set<String> 
namespaceURIs, boolean manifestEntriesOnly);
+
+    void collectProblems(Collection<ICompilerProblem> problems);
 }
diff --git 
a/compiler/src/main/java/org/apache/royale/compiler/problems/ManifestProblem.java
 
b/compiler/src/main/java/org/apache/royale/compiler/problems/ManifestInconsistentComponentEntriesProblem.java
similarity index 71%
copy from 
compiler/src/main/java/org/apache/royale/compiler/problems/ManifestProblem.java
copy to 
compiler/src/main/java/org/apache/royale/compiler/problems/ManifestInconsistentComponentEntriesProblem.java
index e20f80c21..66eec9c01 100644
--- 
a/compiler/src/main/java/org/apache/royale/compiler/problems/ManifestProblem.java
+++ 
b/compiler/src/main/java/org/apache/royale/compiler/problems/ManifestInconsistentComponentEntriesProblem.java
@@ -19,22 +19,24 @@
 
 package org.apache.royale.compiler.problems;
 
-import java.util.List;
-
 /**
  * Problem generated when there are multiple and inconsistent manifest entries
  * for how an MXML tag should map to an ActionScript class.
  */
-public final class ManifestProblem extends CompilerProblem
+public final class ManifestInconsistentComponentEntriesProblem extends 
CompilerProblem
 {
-    // TODO What should this say?
     public static final String DESCRIPTION =
-        "Manifest problem";
+        "Manifest: Error loading namespace ${uri}: Component ${tagName} is 
defined more than once in this namespace.";
     
     public static final int errorCode = 1474;
     
-    public ManifestProblem(List<?> list)
+    public ManifestInconsistentComponentEntriesProblem(String tagName, String 
uri, String manifestFileName)
     {
-        super();
+        super(manifestFileName);
+        this.tagName = tagName;
+        this.uri = uri;
     }
+
+    public String tagName;
+    public String uri;
 }
diff --git 
a/compiler/src/main/java/org/apache/royale/compiler/problems/ManifestProblem.java
 
b/compiler/src/main/java/org/apache/royale/compiler/problems/ManifestParsingProblem.java
similarity index 70%
rename from 
compiler/src/main/java/org/apache/royale/compiler/problems/ManifestProblem.java
rename to 
compiler/src/main/java/org/apache/royale/compiler/problems/ManifestParsingProblem.java
index e20f80c21..c73632100 100644
--- 
a/compiler/src/main/java/org/apache/royale/compiler/problems/ManifestProblem.java
+++ 
b/compiler/src/main/java/org/apache/royale/compiler/problems/ManifestParsingProblem.java
@@ -19,22 +19,22 @@
 
 package org.apache.royale.compiler.problems;
 
-import java.util.List;
-
 /**
- * Problem generated when there are multiple and inconsistent manifest entries
- * for how an MXML tag should map to an ActionScript class.
+ * Problem generated when a manifest file is invalid.
  */
-public final class ManifestProblem extends CompilerProblem
+public final class ManifestParsingProblem extends CompilerProblem
 {
-    // TODO What should this say?
     public static final String DESCRIPTION =
-        "Manifest problem";
-    
-    public static final int errorCode = 1474;
+        "Manifest: Error loading namespace ${uri}: ${text}.";
+
     
-    public ManifestProblem(List<?> list)
+    public ManifestParsingProblem(String text, String uri, String 
manifestFileName)
     {
-        super();
+        super(manifestFileName);
+        this.text = text;
+        this.uri = uri;
     }
+
+    public String text;
+    public String uri;
 }

Reply via email to