You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by er...@apache.org on 2013/01/09 16:41:08 UTC

svn commit: r1430902 - in /flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler: internal/js/codegen/ internal/js/codegen/amd/ internal/js/codegen/goog/ js/codegen/goog/

Author: erikdebruin
Date: Wed Jan  9 15:41:07 2013
New Revision: 1430902

URL: http://svn.apache.org/viewvc?rev=1430902&view=rev
Log:
- refactored to get ALL of the JS doc emission to happen in the DocEmitter
- removed doc emission from the AMD emitter (requires specific implementation, if any)

Modified:
    flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java
    flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/amd/JSAMDEmitter.java
    flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java
    flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java
    flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java

Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java?rev=1430902&r1=1430901&r2=1430902&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/JSEmitter.java Wed Jan  9 15:41:07 2013
@@ -21,13 +21,11 @@ package org.apache.flex.compiler.interna
 
 import java.io.FilterWriter;
 
-import org.apache.flex.compiler.definitions.ITypeDefinition;
 import org.apache.flex.compiler.internal.as.codegen.ASEmitter;
 import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode;
 import org.apache.flex.compiler.internal.tree.as.FunctionNode;
 import org.apache.flex.compiler.internal.tree.as.FunctionObjectNode;
 import org.apache.flex.compiler.js.codegen.IJSEmitter;
-import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IExpressionNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
@@ -44,21 +42,6 @@ public class JSEmitter extends ASEmitter
         super(out);
     }
 
-    // TODO this signature doesn't feel right
-    public void emitJSDoc(IFunctionNode node, ICompilerProject project,
-            boolean isConstructor, ITypeDefinition type)
-    {
-    }
-
-    public void emitJSDocVariable(IVariableNode node)
-    {
-    }
-
-    public void emitJSDocConstructor(IFunctionNode node,
-            ICompilerProject project)
-    {
-    }
-
     public void emitConstructor(IFunctionNode node)
     {
         // for now, we just call back, this is to allow custom handling
@@ -81,22 +64,6 @@ public class JSEmitter extends ASEmitter
     }
 
     @Override
-    public void emitField(IVariableNode node)
-    {
-        super.emitField(node);
-        //        emitJSDocVariable(node);
-        //        write(getVisitor().getCurrentType().getQualifiedName() + ".prototype."
-        //                + node.getName());
-        //        IExpressionNode vnode = node.getAssignedValueNode();
-        //        if (vnode != null)
-        //        {
-        //            write(" = ");
-        //            getVisitor().walk(vnode);
-        //        }
-        //        write(";\n");
-    }
-
-    @Override
     public void emitVarDeclaration(IVariableNode node)
     {
         if (!(node instanceof ChainedVariableNode))
@@ -123,12 +90,4 @@ public class JSEmitter extends ASEmitter
             }
         }
     }
-
-    @Override
-    public void writeBlockClose()
-    {
-    	super.writeBlockClose();
-        
-    	//write(";");
-    }
 }

Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/amd/JSAMDEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/amd/JSAMDEmitter.java?rev=1430902&r1=1430901&r2=1430902&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/amd/JSAMDEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/amd/JSAMDEmitter.java Wed Jan  9 15:41:07 2013
@@ -37,7 +37,6 @@ import org.apache.flex.compiler.problems
 import org.apache.flex.compiler.tree.as.IClassNode;
 import org.apache.flex.compiler.tree.as.IDefinitionNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
-import org.apache.flex.compiler.tree.as.IPackageNode;
 import org.apache.flex.compiler.tree.as.IParameterNode;
 import org.apache.flex.compiler.tree.as.IScopedNode;
 import org.apache.flex.compiler.tree.as.ITypeNode;
@@ -58,15 +57,6 @@ public class JSAMDEmitter extends JSEmit
     // 
     //--------------------------------------------------------------------------
 
-    public void emitJSDocPackgeHeader(IPackageNode node)
-    {
-        //        getDocEmitter().emmitPackageHeader(node);
-    }
-
-    //--------------------------------------------------------------------------
-    // 
-    //--------------------------------------------------------------------------
-
     @Override
     public void emitConstructor(IFunctionNode node)
     {
@@ -75,8 +65,6 @@ public class JSAMDEmitter extends JSEmit
         FunctionNode fn = (FunctionNode) node;
         fn.parseFunctionBody(new ArrayList<ICompilerProblem>());
 
-        emitJSDocConstructor(node, getWalker().getProject());
-
         String qname = definition.getQualifiedName();
         write(qname);
         write(" ");
@@ -96,9 +84,6 @@ public class JSAMDEmitter extends JSEmit
             return;
         }
 
-        IClassDefinition definition = getClassDefinition(node);
-
-        emitJSDoc(node, getWalker().getProject(), false, definition);
         FunctionNode fn = (FunctionNode) node;
         fn.parseFunctionBody(new ArrayList<ICompilerProblem>());
 

Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java?rev=1430902&r1=1430901&r2=1430902&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java Wed Jan  9 15:41:07 2013
@@ -19,13 +19,16 @@
 
 package org.apache.flex.compiler.internal.js.codegen.goog;
 
+import org.apache.flex.compiler.common.ASModifier;
 import org.apache.flex.compiler.definitions.IClassDefinition;
 import org.apache.flex.compiler.definitions.ITypeDefinition;
 import org.apache.flex.compiler.definitions.references.IReference;
 import org.apache.flex.compiler.internal.js.codegen.JSDocEmitter;
 import org.apache.flex.compiler.internal.js.codegen.JSSharedData;
+import org.apache.flex.compiler.internal.semantics.SemanticUtils;
 import org.apache.flex.compiler.js.codegen.IJSEmitter;
 import org.apache.flex.compiler.js.codegen.goog.IJSGoogDocEmitter;
+import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IClassNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
@@ -39,20 +42,124 @@ public class JSGoogDocEmitter extends JS
     public JSGoogDocEmitter(IJSEmitter emitter)
     {
         super(emitter);
-        // TODO Auto-generated constructor stub
     }
     
-
     @Override
-    public void emitConst(IVariableNode node)
+    public void emitFieldDoc(IVariableNode node)
     {
-        write(" * @const\n");
+        begin();
+        
+        String ns = node.getNamespace();
+        if (ns == "private")
+        {
+        	emitPrivate(node);
+        }
+        else if (ns == "protected")
+        {	
+        	emitProtected(node);
+        }
+        
+        if (node.isConst())
+        	emitConst(node);
+        
+        emitType(node);
+        
+        end();
+    }
+    
+    @Override
+    public void emitMethodDoc(IFunctionNode node, ICompilerProject project)
+    {
+        IClassNode cnode = (IClassNode) node.getAncestorOfType(IClassNode.class);
+        IClassDefinition classDefinition = cnode.getDefinition();
+
+        if (node instanceof IFunctionNode)
+        {
+            boolean hasDoc = false;
+
+            if (node.isConstructor())
+            {
+                begin();
+                hasDoc = true;
+                
+                write(" * @constructor\n");
+                
+                IClassDefinition parent = (IClassDefinition) node.getDefinition().getParent();
+                IClassDefinition superClass = parent.resolveBaseClass(project);
+            	String qname = superClass.getQualifiedName();
+            	
+                if (superClass != null && !qname.equals("Object"))
+                    emitExtends(superClass);
+                
+            	IReference[] interfaceReferences = classDefinition.getImplementedInterfaceReferences();
+                if (interfaceReferences.length > 0)
+                {
+                    for (IReference reference : interfaceReferences)
+                    {
+                    	emitImplements(reference);
+                    }
+                }
+            }
+            else
+            {
+                // @this
+                if (containsThisReference(node))
+                {
+                    begin();
+                    hasDoc = true;
+
+                    emitThis(classDefinition);
+                }
+
+                // @param
+                IParameterNode[] parameters = node.getParameterNodes();
+                for (IParameterNode pnode : parameters)
+                {
+                    if (!hasDoc)
+                    {
+                        begin();
+                        hasDoc = true;
+                    }
+
+                    emitParam(pnode);
+                }
+
+                // @return
+                String returnType = node.getReturnType();
+                if (returnType != "" && returnType != "void")
+                {
+                    if (!hasDoc)
+                    {
+                        begin();
+                        hasDoc = true;
+                    }
+
+                    emitReturn(node);
+                }
+
+                // @override
+                Boolean override = node.hasModifier(ASModifier.OVERRIDE);
+                if (override)
+                {
+                    if (!hasDoc)
+                    {
+                        begin();
+                        hasDoc = true;
+                    }
+
+                    emitOverride(node);
+                }
+            }
+            
+            if (hasDoc)
+                end();
+        }
     }
 
     @Override
-    public void emitConstructor(IFunctionNode node)
+    public void emitConst(IVariableNode node)
     {
-        write(" * @constructor\n");
+        write(" * @const\n");
     }
 
     @Override
@@ -138,7 +245,6 @@ public class JSGoogDocEmitter extends JS
     @Override
     public void emitReturn(IFunctionNode node)
     {
-        // TODO convert js types
         String rtype = node.getReturnType();
         if (rtype != null)
             write(" * @return {" + convertASTypeToJS(rtype) + "}\n");
@@ -177,6 +283,26 @@ public class JSGoogDocEmitter extends JS
 
     //--------------------------------------------------------------------------
 
+    private boolean containsThisReference(IASNode node)
+    {
+        final int len = node.getChildCount();
+        for (int i = 0; i < len; i++)
+        {
+            final IASNode child = node.getChild(i);
+            if (child.getChildCount() > 0)
+            {
+                return containsThisReference(child);
+            }
+            else
+            {
+                if (SemanticUtils.isThisKeyword(child))
+                    return true;
+            }
+        }
+
+        return false;
+    }
+
     private String convertASTypeToJS(String name)
     {
     	String result = name;
@@ -190,8 +316,7 @@ public class JSGoogDocEmitter extends JS
     	if (name.equals("int") || name.equals("uint") || name.equals("Number"))
     		result = "number";
     	
-    	// TODO (erikdebruin) this will not work right with nested Vector
-    	//                    declarations...
+    	// TODO (erikdebruin) this will not work with nested Vector declarations...
     	if (name.matches("Vector.<.*>"))
     		result = name.replace("Vector", "Array");
     	

Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java?rev=1430902&r1=1430901&r2=1430902&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java Wed Jan  9 15:41:07 2013
@@ -30,9 +30,7 @@ import org.apache.flex.compiler.definiti
 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.definitions.references.IReference;
 import org.apache.flex.compiler.internal.js.codegen.JSEmitter;
-import org.apache.flex.compiler.internal.semantics.SemanticUtils;
 import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode;
 import org.apache.flex.compiler.internal.tree.as.FunctionNode;
 import org.apache.flex.compiler.js.codegen.goog.IJSGoogDocEmitter;
@@ -73,58 +71,6 @@ public class JSGoogEmitter extends JSEmi
     //--------------------------------------------------------------------------
 
     @Override
-    public void emitJSDocVariable(IVariableNode node)
-    {
-        getDoc().begin();
-        
-        // emit namespace annotation
-        String ns = node.getNamespace();
-        if (ns == "private")
-        {
-        	getDoc().emitPrivate(node);
-        }
-        else if (ns == "protected")
-        {	
-        	getDoc().emitProtected(node);
-        }
-        
-        if (node.isConst())
-        	getDoc().emitConst(node);
-        
-        getDoc().emitType(node);
-        
-        getDoc().end();
-    }
-
-    @Override
-    public void emitJSDocConstructor(IFunctionNode node, ICompilerProject project)
-    {
-        getDoc().begin();
-        
-        getDoc().emitConstructor(node);
-        
-        boolean hasSuperClass = hasSuperClass(node, project);
-        if (hasSuperClass)
-            getDoc().emitExtends(getSuperClassDefinition(node, project));
-        
-        boolean implementsInterfaces = implementsInterfaces(node);
-        if (implementsInterfaces)
-        {
-        	IReference[] references = getImplementedInterfaces(node);
-            for (IReference reference : references)
-            {
-            	getDoc().emitImplements(reference);
-            }
-        }
-        
-        getDoc().end();
-    }
-
-    //--------------------------------------------------------------------------
-    // 
-    //--------------------------------------------------------------------------
-
-    @Override
     public void emitPackageHeader(IPackageNode node)
     {
         ITypeNode type = findTypeNode(node);
@@ -173,6 +119,10 @@ public class JSGoogEmitter extends JSEmi
     {
     }
 
+    //--------------------------------------------------------------------------
+    // 
+    //--------------------------------------------------------------------------
+
     @Override
     public void emitClass(IClassNode node)
     {
@@ -300,7 +250,7 @@ public class JSGoogEmitter extends JSEmi
 
         ICompilerProject project = getWalker().getProject();
         
-        emitJSDocConstructor(node, project);
+        getDoc().emitMethodDoc(node, project);
 
         boolean hasSuperClass = hasSuperClass(node, project);
         
@@ -332,7 +282,7 @@ public class JSGoogEmitter extends JSEmi
     {
         IClassDefinition definition = getClassDefinition(node);
 
-        emitJSDocVariable(node);
+        getDoc().emitFieldDoc(node);
 
         String root = "";
         if (!node.isConst())
@@ -363,84 +313,6 @@ public class JSGoogEmitter extends JSEmi
     }
 
     @Override
-    public void emitJSDoc(IFunctionNode node, ICompilerProject project,
-            boolean isConstructor, ITypeDefinition type)
-    {
-        // TODO (mschmalle) change method signature, remove type
-        // this is a temp override until I change the method signature
-        // unit testing dosn't have access to the type, we need to use the AST to get the definition
-        if (type == null)
-        {
-            ITypeNode tnode = (ITypeNode) node
-                    .getAncestorOfType(ITypeNode.class);
-            type = (ITypeDefinition) tnode.getDefinition();
-        }
-
-        if (node instanceof IFunctionNode)
-        {
-            if (isConstructor)
-            {
-                emitJSDocConstructor(node, project);
-            }
-            else
-            {
-                boolean hasDoc = false;
-
-                // @this
-                if (containsThisReference(node))
-                {
-                    getDoc().begin();
-                    hasDoc = true;
-
-                    getDoc().emitThis(type);
-                }
-
-                // @param
-                IParameterNode[] parameters = node.getParameterNodes();
-                for (IParameterNode pnode : parameters)
-                {
-                    if (!hasDoc)
-                    {
-                        getDoc().begin();
-                        hasDoc = true;
-                    }
-
-                    getDoc().emitParam(pnode);
-                }
-
-                // @return
-                String returnType = node.getReturnType();
-                if (returnType != "" && returnType != "void")
-                {
-                    if (!hasDoc)
-                    {
-                        getDoc().begin();
-                        hasDoc = true;
-                    }
-
-                    getDoc().emitReturn(node);
-                }
-
-                // @override
-                Boolean override = node.hasModifier(ASModifier.OVERRIDE);
-                if (override)
-                {
-                    if (!hasDoc)
-                    {
-                        getDoc().begin();
-                        hasDoc = true;
-                    }
-
-                    getDoc().emitOverride(node);
-                }
-
-                if (hasDoc)
-                    getDoc().end();
-            }
-        }
-    }
-
-    @Override
     public void emitGetAccessor(IGetterNode node)
     {
         emitObjectDefineProperty(node);
@@ -461,9 +333,8 @@ public class JSGoogEmitter extends JSEmi
             return;
         }
 
-        IClassDefinition definition = getClassDefinition(node);
-
-        emitJSDoc(node, getWalker().getProject(), false, definition);
+        getDoc().emitMethodDoc(node, getWalker().getProject());
+        
         FunctionNode fn = (FunctionNode) node;
         fn.parseFunctionBody(new ArrayList<ICompilerProblem>());
 
@@ -646,45 +517,12 @@ public class JSGoogEmitter extends JSEmi
     	return superClassDefinition != null && !qname.equals("Object");
     }
 
-    private static IReference[] getImplementedInterfaces(IDefinitionNode node)
-    {
-    	IClassDefinition classDefinition = getClassDefinition(node);
-    	IReference[] interfaceReferences = classDefinition.getImplementedInterfaceReferences();
-    	return interfaceReferences;
-    }
-
-    private static boolean implementsInterfaces(IDefinitionNode node)
-    {
-    	IReference[] interfaceReferences = getImplementedInterfaces(node);
-    	return interfaceReferences.length > 0;
-    }
-
     private static boolean hasBody(IFunctionNode node)
     {
         IScopedNode scope = node.getScopedNode();
         return scope.getChildCount() > 0;
     }
 
-    private static boolean containsThisReference(IASNode node)
-    {
-        final int len = node.getChildCount();
-        for (int i = 0; i < len; i++)
-        {
-            final IASNode child = node.getChild(i);
-            if (child.getChildCount() > 0)
-            {
-                return containsThisReference(child);
-            }
-            else
-            {
-                if (SemanticUtils.isThisKeyword(child))
-                    return true;
-            }
-        }
-
-        return false;
-    }
-
     private void emitObjectDefineProperty(IAccessorNode node)
     {
         /*

Modified: flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java?rev=1430902&r1=1430901&r2=1430902&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/js/codegen/goog/IJSGoogDocEmitter.java Wed Jan  9 15:41:07 2013
@@ -23,6 +23,7 @@ import org.apache.flex.compiler.definiti
 import org.apache.flex.compiler.definitions.ITypeDefinition;
 import org.apache.flex.compiler.definitions.references.IReference;
 import org.apache.flex.compiler.js.codegen.IJSDocEmitter;
+import org.apache.flex.compiler.projects.ICompilerProject;
 import org.apache.flex.compiler.tree.as.IASNode;
 import org.apache.flex.compiler.tree.as.IClassNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
@@ -47,12 +48,17 @@ import org.apache.flex.compiler.tree.as.
  */
 public interface IJSGoogDocEmitter extends IJSDocEmitter
 {
+	
+    //void emitConstructorDoc(IFunctionNode node, ICompilerProject project);
+
+    void emitFieldDoc(IVariableNode node);
+
+    void emitMethodDoc(IFunctionNode node, ICompilerProject project);
+
     /*
      * https://developers.google.com/closure/compiler/docs/js-for-compiler#types
      *- @const - Marks a variable as read-only. The compiler can inline @const variables
      *
-     *- @constructor - Marks a function as a constructor.
-     *
      *- @define - Indicates a constant that can be overridden by the compiler at compile-time.
      *
      * @deprecated - Warns against using the marked function, method, or property should not be used.
@@ -103,12 +109,8 @@ public interface IJSGoogDocEmitter exten
      * @typedef - Declares an alias for a more complex type. 
      */
 
-    // @const
-
     void emitConst(IVariableNode node);
 
-    void emitConstructor(IFunctionNode node);
-
     void emitDefine(IVariableNode node);
 
     void emitDeprecated(IASNode node);
@@ -117,7 +119,6 @@ public interface IJSGoogDocEmitter exten
 
     void emitExtends(IClassDefinition superDefinition);
 
-    //void emitImplements(IClassNode node);
     void emitImplements(IReference reference);
 
     void emitInheritDoc(IClassNode node);