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);