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/12 09:02:32 UTC
[6/8] git commit: Change dependency management by adding
FlexJSProject. Also fix some issues with MXML id tags showing up as a
bindable VariableDefinition instead of AccessorDefinition
Change dependency management by adding FlexJSProject. Also fix some issues with MXML id tags showing up as a bindable VariableDefinition instead of AccessorDefinition
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/57e7e08a
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/57e7e08a
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/57e7e08a
Branch: refs/heads/develop
Commit: 57e7e08a72880cfa62efa05fe831f374f9a22c72
Parents: d441f73
Author: Alex Harui <ah...@apache.org>
Authored: Tue Apr 9 23:23:14 2013 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Apr 11 20:47:53 2013 -0700
----------------------------------------------------------------------
.../codegen/js/flexjs/TestFlexJSPackage.java | 9 +-
.../codegen/js/flexjs/TestFlexJSStatements.java | 9 +-
.../compiler/internal/test/FlexJSTestBase.java | 2 +
.../flex/compiler/internal/test/TestBase.java | 3 +-
.../org/apache/flex/compiler/clients/MXMLJSC.java | 3 +-
.../codegen/js/flexjs/JSFlexJSEmitter.java | 124 ++++++++++++++-
.../codegen/mxml/flexjs/MXMLFlexJSEmitter.java | 69 ++++++++-
.../compiler/internal/projects/FlexJSProject.java | 69 ++++++++
8 files changed, 274 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/57e7e08a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
index b0d4f8b..9b02b0a 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
@@ -22,6 +22,7 @@ package org.apache.flex.compiler.internal.codegen.js.flexjs;
import org.apache.flex.compiler.driver.IBackend;
import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogPackage;
import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
import org.apache.flex.compiler.tree.as.IFileNode;
import org.junit.Test;
@@ -30,7 +31,13 @@ import org.junit.Test;
*/
public class TestFlexJSPackage extends TestGoogPackage
{
-
+ @Override
+ public void setUp()
+ {
+ project = new FlexJSProject(workspace);
+ super.setUp();
+ }
+
@Override
@Test
public void testPackageQualified_ClassBodyMethodContents()
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/57e7e08a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
index e367ac7..5d8cafc 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
@@ -22,13 +22,20 @@ package org.apache.flex.compiler.internal.codegen.js.flexjs;
import org.apache.flex.compiler.driver.IBackend;
import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogStatements;
import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
/**
* @author Erik de Bruin
*/
public class TestFlexJSStatements extends TestGoogStatements
{
-
+ @Override
+ public void setUp()
+ {
+ project = new FlexJSProject(workspace);
+ super.setUp();
+ }
+
@Override
protected IBackend createBackend()
{
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/57e7e08a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/FlexJSTestBase.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/FlexJSTestBase.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/FlexJSTestBase.java
index 49913ce..7b9a421 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/FlexJSTestBase.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/FlexJSTestBase.java
@@ -5,6 +5,7 @@ import java.util.List;
import org.apache.flex.compiler.driver.IBackend;
import org.apache.flex.compiler.internal.driver.mxml.flexjs.MXMLFlexJSBackend;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
import org.apache.flex.compiler.mxml.IMXMLNamespaceMapping;
import org.apache.flex.compiler.mxml.MXMLNamespaceMapping;
import org.apache.flex.compiler.tree.mxml.IMXMLFileNode;
@@ -19,6 +20,7 @@ public class FlexJSTestBase extends TestBase
@Override
public void setUp()
{
+ project = new FlexJSProject(workspace);
super.setUp();
asEmitter = backend.createEmitter(writer);
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/57e7e08a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
index e47d594..12a94f9 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
@@ -104,7 +104,8 @@ public class TestBase implements ITestBase
errors = new ArrayList<ICompilerProblem>();
- project = new FlexProject(workspace);
+ if (project == null)
+ project = new FlexProject(workspace);
FlexProjectConfigurator.configure(project);
backend = createBackend();
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/57e7e08a/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 9966c16..6ea2385 100644
--- a/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
+++ b/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
@@ -57,6 +57,7 @@ import org.apache.flex.compiler.internal.driver.js.amd.AMDBackend;
import org.apache.flex.compiler.internal.driver.js.goog.GoogBackend;
import org.apache.flex.compiler.internal.driver.mxml.flexjs.MXMLFlexJSBackend;
import org.apache.flex.compiler.internal.projects.CompilerProject;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
import org.apache.flex.compiler.internal.projects.FlexProject;
import org.apache.flex.compiler.internal.projects.ISourceFileHandler;
import org.apache.flex.compiler.internal.targets.JSTarget;
@@ -196,7 +197,7 @@ public class MXMLJSC
{
JSSharedData.backend = backend;
workspace = new Workspace();
- project = new FlexProject(workspace);
+ project = new FlexJSProject(workspace);
problems = new ProblemQuery();
JSSharedData.OUTPUT_EXTENSION = backend.getOutputExtension();
JSSharedData.workspace = workspace;
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/57e7e08a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index 20f169c..7a4e7fe 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -20,6 +20,7 @@
package org.apache.flex.compiler.internal.codegen.js.flexjs;
import java.io.FilterWriter;
+import java.util.ArrayList;
import org.apache.flex.compiler.codegen.IDocEmitter;
import org.apache.flex.compiler.codegen.js.flexjs.IJSFlexJSEmitter;
@@ -28,6 +29,7 @@ import org.apache.flex.compiler.common.ModifiersSet;
import org.apache.flex.compiler.constants.IASLanguageConstants;
import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.definitions.IFunctionDefinition;
+import org.apache.flex.compiler.definitions.IPackageDefinition;
import org.apache.flex.compiler.definitions.ITypeDefinition;
import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
import org.apache.flex.compiler.internal.codegen.js.JSEmitterTokens;
@@ -39,6 +41,10 @@ import org.apache.flex.compiler.internal.definitions.ClassDefinition;
import org.apache.flex.compiler.internal.definitions.ClassTraitsDefinition;
import org.apache.flex.compiler.internal.definitions.ParameterDefinition;
import org.apache.flex.compiler.internal.definitions.VariableDefinition;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
+import org.apache.flex.compiler.internal.scopes.ASProjectScope;
+import org.apache.flex.compiler.internal.scopes.PackageScope;
+import org.apache.flex.compiler.internal.semantics.SemanticUtils;
import org.apache.flex.compiler.internal.tree.as.BinaryOperatorAssignmentNode;
import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode;
import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
@@ -60,6 +66,7 @@ import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode;
import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode;
import org.apache.flex.compiler.tree.as.ISetterNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
+import org.apache.flex.compiler.units.ICompilationUnit;
import org.apache.flex.compiler.utils.ASNodeUtils;
import org.apache.flex.compiler.utils.NativeUtils;
@@ -214,8 +221,15 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
IClassNode cnode = (IClassNode) node
.getAncestorOfType(IClassNode.class);
+ String name = node.getName();
+
IDefinition def = ((IIdentifierNode) node).resolve(project);
-
+ boolean bindable = false;
+ if (def instanceof VariableDefinition)
+ {
+ bindable = ((VariableDefinition)def).isBindable();
+ }
+
ITypeDefinition type = ((IIdentifierNode) node).resolveType(project);
IASNode pnode = node.getParent();
@@ -268,7 +282,14 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
}
else if (!(pnode instanceof ParameterNode))
{
- writeSelf = true;
+ if (def instanceof VariableDefinition)
+ {
+ VariableDefinition vardef = (VariableDefinition)def;
+ if (SemanticUtils.isMemberDefinition(vardef))
+ writeSelf = true;
+ }
+ else
+ writeSelf = true;
}
}
else if (inode == ASTNodeID.ContainerID)
@@ -320,7 +341,9 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
}
}
- if (def instanceof AccessorDefinition)
+ if (def instanceof AccessorDefinition ||
+ (def instanceof VariableDefinition &&
+ ((VariableDefinition)def).isBindable()))
{
IASNode anode = node
.getAncestorOfType(BinaryOperatorAssignmentNode.class);
@@ -469,8 +492,13 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
IExpressionNode property = null;
int leftSideChildCount = leftSide.getChildCount();
if (leftSideChildCount > 0)
- property = (IExpressionNode) leftSide
- .getChild(leftSideChildCount - 1);
+ {
+ IASNode childNode = leftSide.getChild(leftSideChildCount - 1);
+ if (childNode instanceof IExpressionNode)
+ property = (IExpressionNode) childNode;
+ else
+ property = leftSide;
+ }
else
property = leftSide;
@@ -565,4 +593,90 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
return new JSFlexJSGoogDocEmitter(this);
}
+ @Override
+ public void emitPackageHeaderContents(IPackageDefinition definition)
+ {
+ PackageScope containedScope = (PackageScope) definition
+ .getContainedScope();
+
+ ITypeDefinition type = findType(containedScope.getAllLocalDefinitions());
+ if (type == null)
+ return;
+
+ FlexJSProject project = (FlexJSProject)getWalker().getProject();
+ ASProjectScope projectScope = (ASProjectScope) project.getScope();
+ ICompilationUnit cu = projectScope.getCompilationUnitForDefinition(type);
+ ArrayList<String> list = project.getRequires(cu);
+
+ String cname = type.getQualifiedName();
+ ArrayList<String> writtenInstances = new ArrayList<String>();
+ writtenInstances.add(cname); // make sure we don't add ourselves
+
+ if (list != null)
+ {
+ for (String imp : list)
+ {
+ if (imp.indexOf(JSGoogEmitterTokens.AS3.getToken()) != -1)
+ continue;
+
+ if (imp.equals(cname))
+ continue;
+
+ if (imp.equals("Array"))
+ continue;
+ if (imp.equals("Boolean"))
+ continue;
+ if (imp.equals("decodeURI"))
+ continue;
+ if (imp.equals("decodeURIComponent"))
+ continue;
+ if (imp.equals("encodeURI"))
+ continue;
+ if (imp.equals("encodeURIComponent"))
+ continue;
+ if (imp.equals("Error"))
+ continue;
+ if (imp.equals("Function"))
+ continue;
+ if (imp.equals("JSON"))
+ continue;
+ if (imp.equals("Number"))
+ continue;
+ if (imp.equals("int"))
+ continue;
+ if (imp.equals("Object"))
+ continue;
+ if (imp.equals("RegExp"))
+ continue;
+ if (imp.equals("String"))
+ continue;
+ if (imp.equals("uint"))
+ continue;
+
+ if (writtenInstances.indexOf(imp) == -1)
+ {
+
+ /* goog.require('x');\n */
+ write(JSGoogEmitterTokens.GOOG_REQUIRE);
+ write(ASEmitterTokens.PAREN_OPEN);
+ write(ASEmitterTokens.SINGLE_QUOTE);
+ write(imp);
+ write(ASEmitterTokens.SINGLE_QUOTE);
+ write(ASEmitterTokens.PAREN_CLOSE);
+ writeNewline(ASEmitterTokens.SEMICOLON);
+ writtenInstances.add(imp);
+ }
+ }
+
+ // (erikdebruin) only write 'closing' line break when there are
+ // actually imports...
+ if (list.size() > 1
+ || (list.size() == 1 && list.get(0).indexOf(
+ JSGoogEmitterTokens.AS3.getToken()) == -1))
+ {
+ writeNewline();
+ }
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/57e7e08a/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 6a72083..7496ef5 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
@@ -30,6 +30,8 @@ import org.apache.flex.compiler.definitions.IDefinition;
import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
import org.apache.flex.compiler.internal.codegen.mxml.MXMLEmitter;
+import org.apache.flex.compiler.internal.projects.FlexJSProject;
+import org.apache.flex.compiler.internal.scopes.ASProjectScope;
import org.apache.flex.compiler.projects.ICompilerProject;
import org.apache.flex.compiler.tree.as.IASNode;
import org.apache.flex.compiler.tree.as.IFunctionNode;
@@ -43,6 +45,7 @@ import org.apache.flex.compiler.tree.mxml.IMXMLPropertySpecifierNode;
import org.apache.flex.compiler.tree.mxml.IMXMLScriptNode;
import org.apache.flex.compiler.tree.mxml.IMXMLStringNode;
import org.apache.flex.compiler.tree.mxml.IMXMLStyleSpecifierNode;
+import org.apache.flex.compiler.units.ICompilationUnit;
import org.apache.flex.compiler.visitor.mxml.IMXMLBlockWalker;
/**
@@ -91,7 +94,8 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
IMXMLPropertySpecifierNode[] propertySpecifierNodes = node
.getPropertySpecifierNodes();
if (propertySpecifierNodes != null && propertySpecifierNodes.length > 0)
- isMainFile = !isMXMLContentNode((IMXMLPropertySpecifierNode) propertySpecifierNodes[0]);
+ isMainFile = !isMXMLContentNode((IMXMLPropertySpecifierNode) node
+ .getPropertySpecifierNodes()[0]);
eventCounter = 0;
idCounter = 0;
@@ -254,6 +258,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
.getToken()))
{
writeNewline("/**");
+ writeNewline(" * @expose");
writeNewline(" * @this {" + cname + "}");
writeNewline(" * @return {" + instance.name + "}");
writeNewline(" */");
@@ -266,6 +271,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
writeNewline("};");
writeNewline();
writeNewline("/**");
+ writeNewline(" * @expose");
writeNewline(" * @this {" + cname + "}");
writeNewline(" * @param {" + instance.name + "} value");
writeNewline(" */");
@@ -289,6 +295,10 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
protected void emitMXMLDescriptorFuncs(String cname)
{
+ // top level is 'mxmlContent', skip it...
+ if (descriptorTree.size() == 0)
+ return;
+
MXMLDescriptorSpecifier root = descriptorTree.get(0);
root.isTopNodeInMainFile = isMainFile;
@@ -610,6 +620,7 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
writeNewline();
emitHeaderLine(node.getBaseClassName());
ArrayList<String> writtenInstances = new ArrayList<String>();
+ writtenInstances.add(cname); // make sure we don't add ourselves
for (MXMLDescriptorSpecifier instance : instances)
{
String name = instance.name;
@@ -619,12 +630,60 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
writtenInstances.add(name);
}
}
- for (String name : imports) // imports from fx:script tags
+ FlexJSProject project = (FlexJSProject)getMXMLWalker().getProject();
+ ASProjectScope projectScope = (ASProjectScope) project.getScope();
+ IDefinition cdef = node.getDefinition();
+ ICompilationUnit cu = projectScope.getCompilationUnitForDefinition(cdef);
+ ArrayList<String> deps = project.getRequires(cu);
+
+ for (String imp : deps)
{
- if (writtenInstances.indexOf(name) == -1)
+ if (imp.indexOf(JSGoogEmitterTokens.AS3.getToken()) != -1)
+ continue;
+
+ if (imp.equals(cname))
+ continue;
+
+ if (imp.equals("mx.events.PropertyChangeEvent"))
+ continue;
+ if (imp.equals("mx.events.PropertyChangeEventKind"))
+ continue;
+
+ if (imp.equals("Array"))
+ continue;
+ if (imp.equals("Boolean"))
+ continue;
+ if (imp.equals("decodeURI"))
+ continue;
+ if (imp.equals("decodeURIComponent"))
+ continue;
+ if (imp.equals("encodeURI"))
+ continue;
+ if (imp.equals("encodeURIComponent"))
+ continue;
+ if (imp.equals("Error"))
+ continue;
+ if (imp.equals("Function"))
+ continue;
+ if (imp.equals("JSON"))
+ continue;
+ if (imp.equals("Number"))
+ continue;
+ if (imp.equals("int"))
+ continue;
+ if (imp.equals("Object"))
+ continue;
+ if (imp.equals("RegExp"))
+ continue;
+ if (imp.equals("String"))
+ continue;
+ if (imp.equals("uint"))
+ continue;
+
+ if (writtenInstances.indexOf(imp) == -1)
{
- emitHeaderLine(name);
- writtenInstances.add(name);
+ emitHeaderLine(imp);
+ writtenInstances.add(imp);
}
}
}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/57e7e08a/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
new file mode 100644
index 0000000..f00cf64
--- /dev/null
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
@@ -0,0 +1,69 @@
+/**
+ *
+ */
+package org.apache.flex.compiler.internal.projects;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.flex.compiler.asdoc.IASDocBundleDelegate;
+import org.apache.flex.compiler.common.DependencyType;
+import org.apache.flex.compiler.internal.workspaces.Workspace;
+import org.apache.flex.compiler.units.ICompilationUnit;
+
+/**
+ * @author aharui
+ *
+ */
+public class FlexJSProject extends FlexProject
+{
+
+ /**
+ * Constructor
+ *
+ * @param workspace The {@code Workspace} containing this project.
+ */
+ public FlexJSProject(Workspace workspace)
+ {
+ super(workspace);
+ }
+
+ private HashMap<ICompilationUnit, ArrayList<String>> requires = new HashMap<ICompilationUnit, ArrayList<String>>();
+ private HashMap<String, String> already = new HashMap<String, String>();
+
+ @Override
+ public void addDependency(ICompilationUnit from, ICompilationUnit to, DependencyType dt, String qname)
+ {
+ 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 = false;
+ if (requires.containsKey(to))
+ {
+ if (already.containsKey(qname))
+ circular = true;
+ }
+ if (!circular || dt == DependencyType.INHERITANCE)
+ {
+ reqs.add(qname);
+ already.put(qname, qname);
+ }
+ super.addDependency(from, to, dt, qname);
+ }
+
+ public ArrayList<String> getRequires(ICompilationUnit from)
+ {
+ if (requires.containsKey(from))
+ return requires.get(from);
+ return null;
+ }
+}