You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ms...@apache.org on 2012/12/18 00:47:26 UTC
svn commit: r1423226 - in /incubator/flex/whiteboard/mschmalle/falconjx:
compiler.jx.tests/src/org/apache/flex/js/internal/driver/
compiler.jx/src/org/apache/flex/as/
compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/
compiler.jx/src/org/apa...
Author: mschmalle
Date: Mon Dec 17 23:47:25 2012
New Revision: 1423226
URL: http://svn.apache.org/viewvc?rev=1423226&view=rev
Log:
Flex:FalconJx
- Added TestMethodMembers for Class methods
- Refactored ASEmitter to share production methods with member emitters
Added:
incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestMethodMembers.java (with props)
Modified:
incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestFieldMembers.java
incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/as/IASEmitter.java
incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/ASBlockWalker.java
Modified: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestFieldMembers.java
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestFieldMembers.java?rev=1423226&r1=1423225&r2=1423226&view=diff
==============================================================================
--- incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestFieldMembers.java (original)
+++ incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestFieldMembers.java Mon Dec 17 23:47:25 2012
@@ -32,9 +32,7 @@ import org.junit.Test;
public class TestFieldMembers extends TestWalkerBase
{
/*
- * Field, Constant, Namespace
- *
- * - config block
+ * Field, Constant, [Namespace]
*
* var foo;
* var foo:int;
Added: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestMethodMembers.java
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestMethodMembers.java?rev=1423226&view=auto
==============================================================================
--- incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestMethodMembers.java (added)
+++ incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestMethodMembers.java Mon Dec 17 23:47:25 2012
@@ -0,0 +1,158 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.flex.js.internal.driver;
+
+import org.apache.flex.compiler.tree.as.IFileNode;
+import org.apache.flex.compiler.tree.as.IFunctionNode;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * This class tests the production of valid ActionScript3 code for Class Method
+ * members.
+ *
+ * @author Michael Schmalle
+ */
+public class TestMethodMembers extends TestWalkerBase
+{
+ /*
+ * Method
+ *
+ * function foo(){}
+ * function foo():int{}
+ * function foo(bar):int{}
+ * function foo(bar:String):int{}
+ * function foo(bar:String = "baz"):int{}
+ * function foo(bar:String, baz:int = null):int{}
+ * function foo(bar:String, ...rest):int{}
+ * public function foo(bar:String, baz:int = null):int{}
+ * public static function foo(bar:String, baz:int = null):int{}
+ */
+
+ //--------------------------------------------------------------------------
+ // Method
+ //--------------------------------------------------------------------------
+
+ @Test
+ public void testMethod()
+ {
+ IFunctionNode node = getMethod("function foo(){}");
+ visitor.visitFunction(node);
+ assertOut("function foo() {\n}");
+ }
+
+ @Test
+ public void testMethod_withReturnType()
+ {
+ IFunctionNode node = getMethod("function foo():int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("function foo():int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withParameterReturnType()
+ {
+ IFunctionNode node = getMethod("function foo(bar):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("function foo(bar:*):int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withParameterTypeReturnType()
+ {
+ IFunctionNode node = getMethod("function foo(bar:String):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("function foo(bar:String):int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withDefaultParameterTypeReturnType()
+ {
+ IFunctionNode node = getMethod("function foo(bar:String = \"baz\"):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("function foo(bar:String = \"baz\"):int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withMultipleDefaultParameterTypeReturnType()
+ {
+ IFunctionNode node = getMethod("function foo(bar:String, baz:int = null):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("function foo(bar:String, baz:int = null):int {\n\treturn -1;\n}");
+ }
+
+ @Ignore
+ @Test
+ public void testMethod_withRestParameterTypeReturnType()
+ {
+ IFunctionNode node = getMethod("function foo(bar:String, ...rest):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("function foo(bar:String, ...rest):int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withNamespace()
+ {
+ IFunctionNode node = getMethod("public function foo(bar:String, baz:int = null):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("public function foo(bar:String, baz:int = null):int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withNamespaceCustom()
+ {
+ IFunctionNode node = getMethod("mx_internal function foo(bar:String, baz:int = null):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("mx_internal function foo(bar:String, baz:int = null):int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withNamespaceModifiers()
+ {
+ IFunctionNode node = getMethod("public static function foo(bar:String, baz:int = null):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("public static function foo(bar:String, baz:int = null):int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withNamespaceModifierOverride()
+ {
+ IFunctionNode node = getMethod("public override function foo(bar:String, baz:int = null):int{\treturn -1;}");
+ visitor.visitFunction(node);
+ assertOut("public override function foo(bar:String, baz:int = null):int {\n\treturn -1;\n}");
+ }
+
+ @Test
+ public void testMethod_withNamespaceModifierOverrideBackwards()
+ {
+ IFunctionNode node = getMethod("override public function foo(bar:String, baz:int = null):int{return -1;}");
+ visitor.visitFunction(node);
+ assertOut("public override function foo(bar:String, baz:int = null):int {\n\treturn -1;\n}");
+ }
+
+ protected IFunctionNode getMethod(String code)
+ {
+ String source = "package {public class A {" + code + "}}";
+ IFileNode node = getFileNode(source);
+ IFunctionNode child = (IFunctionNode) findFirstDescendantOfType(node,
+ IFunctionNode.class);
+ return child;
+ }
+}
Propchange: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/js/internal/driver/TestMethodMembers.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/as/IASEmitter.java
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/as/IASEmitter.java?rev=1423226&r1=1423225&r2=1423226&view=diff
==============================================================================
--- incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/as/IASEmitter.java (original)
+++ incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/as/IASEmitter.java Mon Dec 17 23:47:25 2012
@@ -21,6 +21,7 @@ package org.apache.flex.as;
import java.io.Writer;
+import org.apache.flex.compiler.tree.as.IFunctionNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
import org.apache.flex.compiler.visitor.IASNodeStrategy;
@@ -46,22 +47,37 @@ public interface IASEmitter
void indentPush();
/**
- * Pops an indent from the emitter so after newlines are emitted, the
- * output is correctly formatted.
+ * Pops an indent from the emitter so after newlines are emitted, the output
+ * is correctly formatted.
*/
void indentPop();
-
+
/**
- * Emit a documentation comment for a Class field {@link IVariableNode}.
+ * Emit a documentation comment for a Class field or constant
+ * {@link IVariableNode}.
*
* @param node The {@link IVariableNode} class field member.
*/
- void emitDocumentation(IVariableNode node);
-
+ void emitFieldDocumentation(IVariableNode node);
+
/**
* Emit a full Class field member.
*
* @param node The {@link IVariableNode} class field member.
*/
void emitField(IVariableNode node);
+
+ /**
+ * Emit a documentation comment for a Class method {@link IFunctionNode}.
+ *
+ * @param node The {@link IFunctionNode} class method member.
+ */
+ void emitMethodDocumentation(IFunctionNode node);
+
+ /**
+ * Emit a full Class or Interface method member.
+ *
+ * @param node The {@link IFunctionNode} class method member.
+ */
+ void emitMethod(IFunctionNode node);
}
Modified: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java?rev=1423226&r1=1423225&r2=1423226&view=diff
==============================================================================
--- incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java (original)
+++ incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java Mon Dec 17 23:47:25 2012
@@ -21,13 +21,22 @@ package org.apache.flex.compiler.interna
import java.io.FilterWriter;
import java.io.IOException;
+import java.util.ArrayList;
import org.apache.flex.as.IASEmitter;
import org.apache.flex.compiler.common.ASModifier;
import org.apache.flex.compiler.common.ModifiersSet;
+import org.apache.flex.compiler.definitions.IDefinition;
+import org.apache.flex.compiler.definitions.IFunctionDefinition;
import org.apache.flex.compiler.definitions.IVariableDefinition;
import org.apache.flex.compiler.definitions.references.INamespaceReference;
+import org.apache.flex.compiler.internal.tree.as.FunctionNode;
+import org.apache.flex.compiler.problems.ICompilerProblem;
+import org.apache.flex.compiler.tree.as.IDefinitionNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
+import org.apache.flex.compiler.tree.as.IFunctionNode;
+import org.apache.flex.compiler.tree.as.IParameterNode;
+import org.apache.flex.compiler.tree.as.IScopedNode;
import org.apache.flex.compiler.tree.as.IVariableNode;
import org.apache.flex.compiler.visitor.IASBlockWalker;
@@ -124,15 +133,64 @@ public class ASEmitter implements IASEmi
//--------------------------------------------------------------------------
//
//--------------------------------------------------------------------------
-
+
+ @Override
+ public void emitFieldDocumentation(IVariableNode node)
+ {
+ }
+
@Override
public void emitField(IVariableNode node)
{
- emitDocumentation(node);
-
+ emitFieldDocumentation(node);
+
IVariableDefinition definition = (IVariableDefinition) node
.getDefinition();
-
+
+ emitNamespace(definition);
+ emitModifiers(definition);
+ emitMemberKeyword(node);
+ emitMemberName(node);
+ emitType(node.getVariableTypeNode());
+ emitAssignedValue(node.getAssignedValueNode());
+ // the client such as IASBlockWalker is responsible for the
+ // semi-colon and newline handling
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ //--------------------------------------------------------------------------
+
+ @Override
+ public void emitMethodDocumentation(IFunctionNode node)
+ {
+ }
+
+ @Override
+ public void emitMethod(IFunctionNode node)
+ {
+ emitMethodDocumentation(node);
+
+ FunctionNode fn = (FunctionNode) node;
+ // XXX (mschmalle) parseFunctionBody() TEMP until I figure out the correct way to do this
+ // will need to pass these problems back to the visitor
+ fn.parseFunctionBody(new ArrayList<ICompilerProblem>());
+
+ IFunctionDefinition definition = node.getDefinition();
+
+ emitNamespace(definition);
+ emitModifiers(definition);
+ emitMemberKeyword(node);
+ emitMemberName(node);
+ emitParamters(node.getParameterNodes());
+ emitType(node.getReturnTypeNode());
+ emitMethodScope(node.getScopedNode());
+ // the client such as IASBlockWalker is responsible for the
+ // semi-colon and newline handling
+ }
+
+ protected void emitNamespace(IDefinition definition)
+ {
// namespace (public, protected, private, foo_bar)
// TODO (mschmalle) figure out what to do if there is an explicit internal
// right now if it's internal, code not produced (implied)
@@ -142,8 +200,10 @@ public class ASEmitter implements IASEmi
write(reference.getBaseName());
write(" ");
}
-
- // madofiers (static)
+ }
+
+ protected void emitModifiers(IDefinition definition)
+ {
ModifiersSet modifierSet = definition.getModifiers();
if (modifierSet.hasModifiers())
{
@@ -153,36 +213,66 @@ public class ASEmitter implements IASEmi
write(" ");
}
}
-
- // keyword
- write(node.isConst() ? "const" : "var");
- write(" ");
- // name
+ }
+
+ protected void emitMemberKeyword(IDefinitionNode node)
+ {
+ if (node instanceof IVariableNode)
+ {
+ write(((IVariableNode) node).isConst() ? "const" : "var");
+ write(" ");
+ }
+ else if (node instanceof IFunctionNode)
+ {
+ write("function");
+ write(" ");
+ }
+ }
+
+ protected void emitMemberName(IDefinitionNode node)
+ {
getVisitor().walk(node.getNameExpressionNode());
-
- // type
- IExpressionNode tnode = node.getVariableTypeNode();
+ }
+
+ protected void emitParamters(IParameterNode[] nodes)
+ {
+ write("(");
+ int len = nodes.length;
+ for (int i = 0; i < len; i++)
+ {
+ IParameterNode node = nodes[i];
+ getVisitor().walk(node);
+ if (i < len - 1)
+ write(", ");
+ }
+ write(")");
+ }
+
+ protected void emitType(IExpressionNode node)
+ {
// TODO (mschmalle) node.getVariableTypeNode() will return "*" if undefined, what to use?
- if (tnode != null)
+ // or node.getReturnTypeNode()
+ if (node != null)
{
write(":");
- getVisitor().walk(tnode);
+ getVisitor().walk(node);
}
-
- // assigned value
- IExpressionNode vnode = node.getAssignedValueNode();
- if (vnode != null)
+ }
+
+ protected void emitAssignedValue(IExpressionNode node)
+ {
+ if (node != null)
{
write(" ");
write("=");
write(" ");
- getVisitor().walk(vnode);
+ getVisitor().walk(node);
}
- // the client such as IASBlockWalker is responsible for the
- // semi-colon and newline handling
}
- public void emitDocumentation(IVariableNode node)
+ protected void emitMethodScope(IScopedNode node)
{
+ write(" ");
+ getVisitor().walk(node);
}
}
Modified: incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/ASBlockWalker.java
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/ASBlockWalker.java?rev=1423226&r1=1423225&r2=1423226&view=diff
==============================================================================
--- incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/ASBlockWalker.java (original)
+++ incubator/flex/whiteboard/mschmalle/falconjx/compiler.jx/src/org/apache/flex/compiler/internal/js/codgen/ASBlockWalker.java Mon Dec 17 23:47:25 2012
@@ -321,9 +321,6 @@ public class ASBlockWalker implements IA
if (SemanticUtils.isMemberDefinition(node.getDefinition()))
{
- //if (node.hasNamespace("private"))
- // return;
-
emitter.emitField(node);
}
else
@@ -337,6 +334,13 @@ public class ASBlockWalker implements IA
{
// XXX (mschmalle) visitFunction() refactor, this is a mess
debug("visitFunction()");
+
+ if (SemanticUtils.isMemberDefinition(node.getDefinition()))
+ {
+ emitter.emitMethod(node);
+ return; // TEMP
+ }
+
FunctionNode fn = (FunctionNode) node;
fn.parseFunctionBody(new ArrayList<ICompilerProblem>());
if (!inContext(TraverseContext.FUNCTION))