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 20:10:06 UTC
svn commit: r1431011 - in /flex/whiteboard/mschmalle/falconjx:
compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/
compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/
compiler.jx/src/org/apache/flex/compiler/internal/js/c...
Author: erikdebruin
Date: Wed Jan 9 19:10:06 2013
New Revision: 1431011
URL: http://svn.apache.org/viewvc?rev=1431011&view=rev
Log:
- implemented TestGoogStatements and refactored a bit to make the tests work
Added:
flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java (with props)
Modified:
flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java
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/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.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java?rev=1431011&r1=1431010&r2=1431011&view=diff
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java (original)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java Wed Jan 9 19:10:06 2013
@@ -73,7 +73,7 @@ public class TestGoogExpressions extends
IVariableNode node = (IVariableNode) getNode("var a = function(){};",
IVariableNode.class);
visitor.visitVariable(node);
- assertOut("var a = function() {\n}");
+ assertOut("var /** @type {*} */ a = function() {\n}");
}
@Override
@@ -84,7 +84,7 @@ public class TestGoogExpressions extends
"var a:Object = function(foo:int, bar:String = 'goo'):int{return -1;};",
IVariableNode.class);
visitor.visitVariable(node);
- assertOut("var a = function(foo, bar) {\n\tbar = typeof bar !== 'undefined' ? bar : 'goo';\n\treturn -1;\n}");
+ assertOut("var /** @type {Object} */ a = function(foo, bar) {\n\tbar = typeof bar !== 'undefined' ? bar : 'goo';\n\treturn -1;\n}");
}
@Override
Added: flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java
URL: http://svn.apache.org/viewvc/flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java?rev=1431011&view=auto
==============================================================================
--- flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java (added)
+++ flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java Wed Jan 9 19:10:06 2013
@@ -0,0 +1,300 @@
+/*
+ *
+ * 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.compiler.internal.js.codegen.goog;
+
+import org.apache.flex.compiler.clients.IBackend;
+import org.apache.flex.compiler.internal.as.codegen.TestStatements;
+import org.apache.flex.compiler.internal.js.driver.goog.GoogBackend;
+import org.apache.flex.compiler.internal.tree.as.LabeledStatementNode;
+import org.apache.flex.compiler.tree.as.IFileNode;
+import org.apache.flex.compiler.tree.as.IForLoopNode;
+import org.apache.flex.compiler.tree.as.ITryNode;
+import org.apache.flex.compiler.tree.as.IVariableNode;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Michael Schmalle
+ * @author Erik de Bruin
+ */
+public class TestGoogStatements extends TestStatements
+{
+ //----------------------------------
+ // var declaration
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVarDeclaration()
+ {
+ IVariableNode node = (IVariableNode) getNode("var a;", IVariableNode.class);
+ visitor.visitVariable(node);
+ assertOut("var /** @type {*} */ a");
+ }
+
+ @Override
+ @Test
+ public void testVarDeclaration_withType()
+ {
+ IVariableNode node = (IVariableNode) getNode("var a:int;", IVariableNode.class);
+ visitor.visitVariable(node);
+ assertOut("var /** @type {number} */ a");
+ }
+
+ @Override
+ @Test
+ public void testVarDeclaration_withTypeAssignedValue()
+ {
+ IVariableNode node = (IVariableNode) getNode("var a:int = 42;",
+ IVariableNode.class);
+ visitor.visitVariable(node);
+ assertOut("var /** @type {number} */ a = 42");
+ }
+
+ @Override
+ @Test
+ public void testVarDeclaration_withTypeAssignedValueComplex()
+ {
+ IVariableNode node = (IVariableNode) getNode(
+ "var a:Foo = new Foo(42, 'goo');", IVariableNode.class);
+ visitor.visitVariable(node);
+ assertOut("var /** @type {Foo} */ a = new Foo(42, 'goo')");
+ }
+
+ @Override
+ @Test
+ public void testVarDeclaration_withList()
+ {
+ IVariableNode node = (IVariableNode) getNode(
+ "var a:int = 4, b:int = 11, c:int = 42;", IVariableNode.class);
+ visitor.visitVariable(node);
+ assertOut("var /** @type {number} */ a = 4, /** @type {number} */ b = 11, /** @type {number} */ c = 42");
+ }
+
+ //----------------------------------
+ // const declaration
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testConstDeclaration()
+ {
+ IVariableNode node = (IVariableNode) getNode("const a = 42;",
+ IVariableNode.class);
+ visitor.visitVariable(node);
+ assertOut("\n/**\n * @const\n * @type {*}\n */\na = 42");
+ }
+
+ @Override
+ @Test
+ public void testConstDeclaration_withType()
+ {
+ IVariableNode node = (IVariableNode) getNode("const a:int = 42;",
+ IVariableNode.class);
+ visitor.visitVariable(node);
+ assertOut("\n/**\n * @const\n * @type {number}\n */\na = 42");
+ }
+
+ @Override
+ @Test
+ public void testConstDeclaration_withList()
+ {
+ IVariableNode node = (IVariableNode) getNode(
+ "const a:int = 4, b:int = 11, c:int = 42;", IVariableNode.class);
+ visitor.visitVariable(node);
+ assertOut("\n/**\n * @const\n * @type {number}\n */\na = 4, \n/**\n * @const\n * @type {number}\n */\nb = 11, \n/**\n * @const\n * @type {number}\n */\nc = 42");
+ }
+
+ //----------------------------------
+ // for () { }
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitFor_1a()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for (var i:int = 0; i < len; i++) { break; }",
+ IForLoopNode.class);
+ visitor.visitForLoop(node);
+ assertOut("for (var /** @type {number} */ i = 0; i < len; i++) {\n\tbreak;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitFor_1b()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for (var i:int = 0; i < len; i++) break;", IForLoopNode.class);
+ visitor.visitForLoop(node);
+ assertOut("for (var /** @type {number} */ i = 0; i < len; i++)\n\tbreak;");
+ }
+
+ @Override
+ @Test
+ public void testVisitForIn_1()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for (var i:int in obj) { break; }", IForLoopNode.class);
+ visitor.visitForLoop(node);
+ assertOut("for (var /** @type {number} */ i in obj) {\n\tbreak;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitForIn_1a()
+ {
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for (var i:int in obj) break; ", IForLoopNode.class);
+ visitor.visitForLoop(node);
+ assertOut("for (var /** @type {number} */ i in obj)\n\tbreak;");
+ }
+
+ @Ignore
+ @Override
+ @Test
+ public void testVisitForEach_1()
+ {
+ // TODO (erikdebruin) handle workaround for "for-each" loop
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for each(var i:int in obj) { break; }", IForLoopNode.class);
+ visitor.visitForLoop(node);
+ assertOut("for each (var i:int in obj) {\n\tbreak;\n}");
+ }
+
+ @Ignore
+ @Override
+ @Test
+ public void testVisitForEach_1a()
+ {
+ // TODO (erikdebruin) handle workaround for "for-each" loop
+ IForLoopNode node = (IForLoopNode) getNode(
+ "for each(var i:int in obj) break; ", IForLoopNode.class);
+ visitor.visitForLoop(node);
+ assertOut("for each (var i:int in obj)\n\tbreak;");
+ }
+
+ //----------------------------------
+ // try {} catch () {} finally {}
+ //----------------------------------
+
+ @Override
+ @Test
+ public void testVisitTry_Catch()
+ {
+ ITryNode node = (ITryNode) getNode("try { a; } catch (e:Error) { b; }",
+ ITryNode.class);
+ visitor.visitTry(node);
+ assertOut("try {\n\ta;\n} catch (e) {\n\tb;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitTry_Catch_Finally()
+ {
+ ITryNode node = (ITryNode) getNode(
+ "try { a; } catch (e:Error) { b; } finally { c; }",
+ ITryNode.class);
+ visitor.visitTry(node);
+ assertOut("try {\n\ta;\n} catch (e) {\n\tb;\n} finally {\n\tc;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitTry_Catch_Catch_Finally()
+ {
+ ITryNode node = (ITryNode) getNode(
+ "try { a; } catch (e:Error) { b; } catch (f:Error) { c; } finally { d; }",
+ ITryNode.class);
+ visitor.visitTry(node);
+ assertOut("try {\n\ta;\n} catch (e) {\n\tb;\n} catch (f) {\n\tc;\n} finally {\n\td;\n}");
+ }
+
+ @Override
+ @Test
+ public void testVisitTry_CatchEmpty_FinallyEmpty_()
+ {
+ ITryNode node = (ITryNode) getNode(
+ "try { a; } catch (e:Error) { } finally { }", ITryNode.class);
+ visitor.visitTry(node);
+ assertOut("try {\n\ta;\n} catch (e) {\n} finally {\n}");
+ }
+
+ //----------------------------------
+ // label : for () {}
+ //----------------------------------
+
+ @Ignore
+ @Override
+ @Test
+ public void testVisitLabel_1()
+ {
+ LabeledStatementNode node = (LabeledStatementNode) getNode(
+ "foo: for each(var i:int in obj) { break foo; }",
+ LabeledStatementNode.class);
+ visitor.visitLabeledStatement(node);
+ assertOut("foo : for each (var i:int in obj) {\n\tbreak foo;\n}");
+ }
+
+ @Ignore
+ @Override
+ @Test
+ public void testVisitLabel_1a()
+ {
+ // TODO LabelStatement messes up in finally{} block, something is wrong there
+ LabeledStatementNode node = (LabeledStatementNode) getNode(
+ "foo: for each(var i:int in obj) break foo;",
+ LabeledStatementNode.class);
+ visitor.visitLabeledStatement(node);
+ assertOut("foo : for each (var i:int in obj)\n\tbreak foo;");
+ }
+
+ //----------------------------------
+ // all together now!
+ //----------------------------------
+
+ @Ignore
+ @Override
+ @Test
+ public void testVisit()
+ {
+ IFileNode node = (IFileNode) getNode(
+ "try { a; } catch (e:Error) { if (a) { if (b) { if (c) b; else if (f) a; else e; }} } finally { }"
+ + "if (d) for (var i:int = 0; i < len; i++) break;"
+ + "if (a) { with (ab) { c(); } "
+ + "do {a++;do a++; while(a > b);} while(c > d); }"
+ + "if (b) { try { a; throw new Error('foo'); } catch (e:Error) { "
+ + " switch(i){case 1: break; default: return;}"
+ + " } catch (f:Error) { c; eee.dd; } finally { "
+ + " d; var a:Object = function(foo:int, bar:String = 'goo'):int{return -1;};"
+ + " eee.dd; eee.dd; eee.dd; eee.dd;} }"
+ + "foo: for each(var i:int in obj) break foo;",
+ IFileNode.class);
+ visitor.visitFile(node);
+ assertOut("");
+ }
+
+
+ protected IBackend createBackend()
+ {
+ return new GoogBackend();
+ }
+
+}
Propchange: flex/whiteboard/mschmalle/falconjx/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java
------------------------------------------------------------------------------
svn:eol-style = native
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=1431011&r1=1431010&r2=1431011&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 19:10:06 2013
@@ -22,13 +22,10 @@ package org.apache.flex.compiler.interna
import java.io.FilterWriter;
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.tree.as.IASNode;
import org.apache.flex.compiler.tree.as.IExpressionNode;
-import org.apache.flex.compiler.tree.as.IVariableNode;
/**
* @author Michael Schmalle
@@ -55,31 +52,4 @@ public class JSEmitter extends ASEmitter
emitFunctionScope(fnode.getScopedNode());
}
- @Override
- public void emitVarDeclaration(IVariableNode node)
- {
- if (!(node instanceof ChainedVariableNode))
- {
- emitMemberKeyword(node);
- }
-
- emitDeclarationName(node);
- emitAssignedValue(node.getAssignedValueNode());
-
- if (!(node instanceof ChainedVariableNode))
- {
- // check for chained variables
- int len = node.getChildCount();
- for (int i = 0; i < len; i++)
- {
- IASNode child = node.getChild(i);
- if (child instanceof ChainedVariableNode)
- {
- write(",");
- write(" ");
- emitVarDeclaration((IVariableNode) child);
- }
- }
- }
- }
}
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=1431011&r1=1431010&r2=1431011&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 19:10:06 2013
@@ -157,6 +157,23 @@ public class JSGoogDocEmitter extends JS
}
@Override
+ public void emitVarDoc(IVariableNode node)
+ {
+ if (!node.isConst())
+ {
+ emitTypeShort(node);
+ }
+ else
+ {
+ write("\n"); // TODO (erikdebruin) check if this is needed
+ begin();
+ emitConst(node);
+ emitType(node);
+ end();
+ }
+ }
+
+ @Override
public void emitConst(IVariableNode node)
{
write(" * @const\n");
@@ -259,12 +276,16 @@ public class JSGoogDocEmitter extends JS
@Override
public void emitType(IASNode node)
{
- //String type = SemanticUtils.getTypeOfStem(node, emitter.getProject());
String type = ((IVariableNode) node).getVariableType();
- // XXX need to map to js types
write(" * @type {" + convertASTypeToJS(type) + "}\n");
}
+ public void emitTypeShort(IASNode node)
+ {
+ String type = ((IVariableNode) node).getVariableType();
+ write("/** @type {" + convertASTypeToJS(type) + "} */ ");
+ }
+
@Override
public void emitTypedef(IASNode node)
{
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=1431011&r1=1431010&r2=1431011&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 19:10:06 2013
@@ -276,6 +276,47 @@ public class JSGoogEmitter extends JSEmi
}
@Override
+ public void emitVarDeclaration(IVariableNode node)
+ {
+ if (!(node instanceof ChainedVariableNode) && !node.isConst())
+ {
+ emitMemberKeyword(node);
+ }
+
+ IExpressionNode avnode = node.getAssignedValueNode();
+
+ if (avnode != null)
+ {
+ String opCode = avnode.getNodeID().getParaphrase();
+ if (opCode != "AnonymousFunction")
+ getDoc().emitVarDoc(node);
+ }
+ else
+ {
+ getDoc().emitVarDoc(node);
+ }
+
+ emitDeclarationName(node);
+ emitAssignedValue(avnode);
+
+ if (!(node instanceof ChainedVariableNode))
+ {
+ // check for chained variables
+ int len = node.getChildCount();
+ for (int i = 0; i < len; i++)
+ {
+ IASNode child = node.getChild(i);
+ if (child instanceof ChainedVariableNode)
+ {
+ write(",");
+ write(" ");
+ emitVarDeclaration((IVariableNode) child);
+ }
+ }
+ }
+ }
+
+ @Override
public void emitGetAccessor(IGetterNode node)
{
emitObjectDefineProperty(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=1431011&r1=1431010&r2=1431011&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 19:10:06 2013
@@ -53,6 +53,8 @@ public interface IJSGoogDocEmitter exten
void emitMethodDoc(IFunctionNode node, ICompilerProject project);
+ void emitVarDoc(IVariableNode node);
+
/*
* https://developers.google.com/closure/compiler/docs/js-for-compiler#types
*- @const - Marks a variable as read-only. The compiler can inline @const variables