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