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