fix more complex dependency scenarios.  Hope this doesn't slow down big project 
compiles too much.


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/200c568c
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/200c568c
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/200c568c

Branch: refs/heads/master
Commit: 200c568c9034045b5392d7049ad07a47bc094085
Parents: 0271ed0
Author: Alex Harui <[email protected]>
Authored: Tue Mar 14 12:39:15 2017 -0700
Committer: Alex Harui <[email protected]>
Committed: Tue Mar 14 12:39:15 2017 -0700

----------------------------------------------------------------------
 .../compiler/internal/graph/GoogDepsWriter.java | 62 ++++++++++++++++++--
 1 file changed, 58 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/200c568c/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java
----------------------------------------------------------------------
diff --git 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java
 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java
index 9b843b3..5833696 100644
--- 
a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java
+++ 
b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/graph/GoogDepsWriter.java
@@ -130,6 +130,7 @@ public class GoogDepsWriter {
     public ArrayList<String> additionalHTML = new ArrayList<String>();
     
     private HashMap<String, GoogDep> visited = new HashMap<String, GoogDep>();
+    private HashMap<String, GoogDep> inArray = new HashMap<String, GoogDep>();
     
        private ArrayList<GoogDep> sort(String rootClassName)
        {
@@ -148,16 +149,46 @@ public class GoogDepsWriter {
                        removeCirculars(current);
         System.out.println("Dependencies calculated for '" + current.filePath 
+ "'");
 
+               ArrayList<GoogDep> visitedButNotAdded = new 
ArrayList<GoogDep>();
                ArrayList<String> deps = current.deps;
                for (String className : deps)
                {
-                       if (!visited.containsKey(className) && 
!isGoogClass(className))
+                       if (!isGoogClass(className))
                        {
-                               GoogDep gd = depMap.get(className);
-                               sortFunction(gd, arr);
+                               if (!visited.containsKey(className))
+                               {
+                                       GoogDep gd = depMap.get(className);
+                                       sortFunction(gd, arr);
+                               }
+                               else
+                               {
+                               if (!inArray.containsKey(className))
+                               {
+                                       // if we get here, we haven't yet added 
the dependency to the
+                                       // array of GoogDeps because we are 
computing its dependencies.
+                                       // For example, class A extends B which 
references class C which
+                                       // extends B.  This isn't a circular 
reference.  But B needs to
+                                       // be in the array before C instead of 
just before A.
+                                       
visitedButNotAdded.add(depMap.get(className));
+                                       System.out.println("Visited but haven't 
added: '" + className + "'");
+                               }
+                               }
                        }
                }
-               arr.add(current);
+               for (GoogDep gdep : visitedButNotAdded)
+               {
+                       if (!inArray.containsKey(gdep.className))
+                       {
+                               arr.add(gdep);
+                               inArray.put(gdep.className, gdep);
+                       }
+               }
+               if (!inArray.containsKey(current.className))
+               {
+                       arr.add(current);
+                       inArray.put(current.className, current);
+               }
+               
        }
        
        private void addDeps(String className)
@@ -248,6 +279,13 @@ public class GoogDepsWriter {
                                        System.out.println(gd.filePath + " 
removing circular: " + s);
                                        continue;
                                }
+                               else if (gd.deps.contains(s) && !isGoogClass(s) 
&& onProtoChain(s, className))
+                               {
+                                       // if we are on the proto chain of s, 
then take away our require of s
+                                       suppressCount++;
+                                       System.out.println(gd.filePath + " 
removing circular (proto): " + s);
+                                       continue;
+                               }
                         }
                     }
                }
@@ -331,6 +369,22 @@ public class GoogDepsWriter {
         }              
        }
        
+       boolean onProtoChain(String name, String base)
+       {
+               GoogDep gd = depMap.get(name);
+               if (gd.fileInfo.impls != null)
+               {
+                       if (gd.fileInfo.impls.contains(base))
+                               return true;
+                       for (String s : gd.fileInfo.impls)
+                       {
+                               if (!isGoogClass(s) && onProtoChain(s, base))
+                                       return true;
+                       }
+               }
+               return false;
+       }
+       
        FileInfo getFileInfo(List<String> lines, String className)
        {
                FileInfo fi = new FileInfo();

Reply via email to