You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2013/04/20 02:18:15 UTC

[4/6] git commit: [flex-falcon] - another attempt at dependency management. Assumes no important dependencies are found during emitting

another attempt at dependency management.  Assumes no important dependencies are found during emitting


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

Branch: refs/heads/develop
Commit: feb25bfc80158c5bf0fbcdb0d6cc0f4b5b6fa1a7
Parents: 32186ca
Author: Alex Harui <ah...@apache.org>
Authored: Fri Apr 19 09:45:39 2013 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Fri Apr 19 10:39:42 2013 -0700

----------------------------------------------------------------------
 .../org/apache/flex/compiler/clients/MXMLJSC.java  |    2 +-
 .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java     |    1 +
 .../compiler/internal/projects/FlexJSProject.java  |  106 +++++++++++----
 3 files changed, 78 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/feb25bfc/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java b/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
index 5ed4dca..35b539f 100644
--- a/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
+++ b/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
@@ -444,7 +444,7 @@ public class MXMLJSC
         final List<ICompilerProblem> problemsBuildingSWF = new ArrayList<ICompilerProblem>();
 
         String qname = config.getMainDefinition();
-        ((FlexJSProject)project).alreadyRequired.put(qname, mainCU);
+        ((FlexJSProject)project).mainCU = mainCU;
         final IJSApplication app = buildApplication(project,
                 config.getMainDefinition(), mainCU, problemsBuildingSWF);
         problems.addAll(problemsBuildingSWF);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/feb25bfc/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
index aa2df2c..6e18b20 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
@@ -652,6 +652,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
                 writtenInstances.add(imp);
             }
         }
+        
     }
 
     private void emitHeaderLine(String qname)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/feb25bfc/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
index 4af001a..f4aa6a1 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
@@ -20,6 +20,8 @@ package org.apache.flex.compiler.internal.projects;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
 
 import org.apache.flex.compiler.common.DependencyType;
 import org.apache.flex.compiler.definitions.IDefinition;
@@ -28,6 +30,8 @@ import org.apache.flex.compiler.internal.scopes.ASProjectScope.DefinitionPromise
 import org.apache.flex.compiler.internal.workspaces.Workspace;
 import org.apache.flex.compiler.units.ICompilationUnit;
 
+import com.google.common.collect.ImmutableSet;
+
 /**
  * @author aharui
  *
@@ -45,8 +49,9 @@ public class FlexJSProject extends FlexProject
         super(workspace);
     }
 
-    private HashMap<ICompilationUnit, ArrayList<String>> requires = new HashMap<ICompilationUnit, ArrayList<String>>();
-    public HashMap<String, ICompilationUnit> alreadyRequired = new HashMap<String, ICompilationUnit>();
+    private HashMap<ICompilationUnit, HashMap<String, DependencyType>> requires = new HashMap<ICompilationUnit, HashMap<String, DependencyType>>();
+    
+    public ICompilationUnit mainCU;
     
     @Override
     public void addDependency(ICompilationUnit from, ICompilationUnit to, DependencyType dt, String qname)
@@ -54,43 +59,84 @@ public class FlexJSProject extends FlexProject
         IDefinition def = to.getDefinitionPromises().get(0);
         IDefinition actualDef = ((DefinitionPromise) def).getActualDefinition();
         boolean isInterface = actualDef instanceof InterfaceDefinition;
-        if (isInterface)
-        {
-            //System.out.println("Interface: " + qname);
-        }
-        else
+        if (!isInterface)
         {
-            
-        	ArrayList<String> reqs;
-        	if (requires.containsKey(from))
-        		reqs = requires.get(from);
-        	else
-        	{
-        		reqs = new ArrayList<String>();
-        		requires.put(from, reqs);
-        	}
-        	// if the class is already required by some other class
-        	// don't add it.  Otherwise we can get circular
-        	// dependencies.
-        	boolean circular = (from == to);
-        	if (requires.containsKey(to))
-        	{
-        		if (alreadyRequired.containsKey(qname))
-        			circular = true;
-        	}
-        	if (!circular || dt == DependencyType.INHERITANCE)
+        	if (from != to)
         	{
-        		reqs.add(qname);
-        		alreadyRequired.put(qname, from);
+                HashMap<String, DependencyType> reqs;
+            	if (requires.containsKey(from))
+            		reqs = requires.get(from);
+            	else
+            	{
+            		reqs = new HashMap<String, DependencyType>();
+            		requires.put(from, reqs);
+            	}
+            	if (reqs.containsKey(qname))
+            	{
+            	    // inheritance is important so remember it
+            	    if (reqs.get(qname) != DependencyType.INHERITANCE)
+            	    {
+            	        reqs.put(qname, dt);
+            	    }
+            	}
+            	else
+            	    reqs.put(qname, dt);
         	}
         }
         super.addDependency(from, to, dt, qname);
     }
+
+    private boolean needToDetermineRequires = true;
+    
+    // this set is computed from the requires list .  we have to strip out any circularities starting from the mainCU
+    private HashMap<ICompilationUnit, ArrayList<String>> googrequires = new HashMap<ICompilationUnit, ArrayList<String>>();
+    
+    private void determineRequires()
+    {
+        if (mainCU == null)
+            return;
+        
+        needToDetermineRequires = false;
+        List<ICompilationUnit> reachableCompilationUnits = 
+            getReachableCompilationUnitsInSWFOrder(ImmutableSet
+                .of(mainCU));
+        
+        HashMap<String, String> already = new HashMap<String, String>();
+        
+        for (ICompilationUnit cu: reachableCompilationUnits)
+        {
+            if (requires.containsKey(cu))
+            {
+                HashMap<String, DependencyType> reqs = requires.get(cu);
+                Set<String> it = reqs.keySet();
+                ArrayList<String> newreqs = new ArrayList<String>();
+                for (String req : it)
+                {
+                    DependencyType dt = reqs.get(req);
+                    if (dt == DependencyType.INHERITANCE)
+                        newreqs.add(req);
+                    else
+                    {
+                        if (!already.containsKey(req))
+                        {
+                            newreqs.add(req);
+                            already.put(req, req);
+                        }
+                    }
+                }
+                googrequires.put(cu, newreqs);
+            }
+        }
+    }
     
     public ArrayList<String> getRequires(ICompilationUnit from)
     {
-    	if (requires.containsKey(from))
-    		return requires.get(from);
+        if (needToDetermineRequires)
+            determineRequires();
+        
+    	if (googrequires.containsKey(from))
+    		return googrequires.get(from);
     	return null;
     }
+    
 }