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/20 16:59:32 UTC

svn commit: r1435869 - in /flex/falcon/trunk: compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/ compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/ compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ com...

Author: erikdebruin
Date: Sun Jan 20 15:59:32 2013
New Revision: 1435869

URL: http://svn.apache.org/viewvc?rev=1435869&view=rev
Log:
- cleared some TODOs
- removed some @Ignore and handles the newly 'liberated' requirements

Modified:
    flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestExpressions.java
    flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestGlobalClasses.java
    flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java
    flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogFieldMembers.java
    flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalClasses.java
    flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalFunctions.java
    flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java
    flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
    flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java
    flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java

Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestExpressions.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestExpressions.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestExpressions.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestExpressions.java Sun Jan 20 15:59:32 2013
@@ -696,8 +696,7 @@ public class TestExpressions extends Tes
     @Test
     public void testVisitUnaryOperatorNode_Typeof_NoParens()
     {
-    	// TODO (mschmalle) the notation without parenthesis is 
-    	//                  also valid in AS/JS
+    	// TODO (mschmalle) the notation without parenthesis is also valid in AS/JS
         IUnaryOperatorNode node = getUnaryNode("typeof a");
         visitor.visitUnaryOperator(node);
         assertOut("typeof a");
@@ -723,6 +722,7 @@ public class TestExpressions extends Tes
     @Test
     public void testVisitUnaryOperatorNode_Concate_2()
     {
+    	// TODO (mschmalle) what's up with the escaping of backslashes?
         IBinaryOperatorNode node = getBinaryNode("\"a\\\"\" + \"\\\"b\"");
         visitor.visitBinaryOperator(node);
         assertOut("\"a\\\"\" + \"\\\"b\"");

Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestGlobalClasses.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestGlobalClasses.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestGlobalClasses.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/as/codegen/TestGlobalClasses.java Sun Jan 20 15:59:32 2013
@@ -185,8 +185,7 @@ public class TestGlobalClasses extends T
     @Test
     public void testRegExp()
     {
-    	// TODO (erikdebruin) how to handle the escaping of backslashes in
-    	//                    strings in the tests?
+    	// TODO (mschmalle) the backslashes in don't match the backslashes out...
         IVariableNode node = getVariable("var a:RegExp = new RegExp('test-\\d', 'i');");
         visitor.visitVariable(node);
         assertOut("var a:RegExp = new RegExp('test-\\\\d', 'i')");

Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogExpressions.java Sun Jan 20 15:59:32 2013
@@ -27,7 +27,6 @@ import org.apache.flex.compiler.tree.as.
 import org.apache.flex.compiler.tree.as.IFunctionNode;
 import org.apache.flex.compiler.tree.as.IIfNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -147,30 +146,28 @@ public class TestGoogExpressions extends
         assertOut("is(a, b)");
     }
 
-    @Ignore
     @Override
     @Test
     public void testVisitBinaryOperator_NamespaceAccess_1()
     {
         // TODO (mschmalle) this needs INamespaceAccessExpressionNode interface
-    	// TODO (erikdebruin) JS implementation?
+    	// TODO (erikdebruin) we need a 'goog.require("a")' in the header
     	NamespaceAccessExpressionNode node = (NamespaceAccessExpressionNode) getExpressionNode(
                 "a::b", NamespaceAccessExpressionNode.class);
         visitor.visitNamespaceAccessExpression(node);
-        assertOut("");
+        assertOut("a.b");
     }
 
-    @Ignore
     @Override
     @Test
     public void testVisitBinaryOperator_NamespaceAccess_2()
     {
         // TODO (mschmalle) this needs INamespaceAccessExpressionNode interface
-    	// TODO (erikdebruin) JS implementation?
+    	// TODO (erikdebruin) we need a 'goog.require("a.b")' in the header
         NamespaceAccessExpressionNode node = (NamespaceAccessExpressionNode) getExpressionNode(
                 "a::b::c", NamespaceAccessExpressionNode.class);
         visitor.visitNamespaceAccessExpression(node);
-        assertOut("");
+        assertOut("a.b.c");
     }
 
     protected IBackend createBackend()

Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogFieldMembers.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogFieldMembers.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogFieldMembers.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogFieldMembers.java Sun Jan 20 15:59:32 2013
@@ -23,7 +23,6 @@ import org.apache.flex.compiler.clients.
 import org.apache.flex.compiler.internal.as.codegen.TestFieldMembers;
 import org.apache.flex.compiler.internal.js.driver.goog.GoogBackend;
 import org.apache.flex.compiler.tree.as.IVariableNode;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -98,18 +97,16 @@ public class TestGoogFieldMembers extend
     {
         IVariableNode node = getField("protected var foo:Vector.<Foo>;");
         visitor.visitVariable(node);
-        assertOut("/**\n * @protected\n * @type {Array.<Foo>}\n */\nA.prototype.foo");
+        assertOut("/**\n * @protected\n * @type {Vector.<Foo>}\n */\nA.prototype.foo");
     }
 
-    @Ignore
     @Override
     @Test
     public void testField_withNamespaceTypeCollectionComplex()
     {
-    	// TODO (erikdebruin) not sure how to annotate this using 'goog'
         IVariableNode node = getField("protected var foo:Vector.<Vector.<Vector.<Foo>>>;");
         visitor.visitVariable(node);
-        assertOut("");
+        assertOut("/**\n * @protected\n * @type {Vector.<Vector.<Vector.<Foo>>>}\n */\nA.prototype.foo");
     }
 
     @Override

Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalClasses.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalClasses.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalClasses.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalClasses.java Sun Jan 20 15:59:32 2013
@@ -277,15 +277,13 @@ public class TestGoogGlobalClasses exten
     	assertOut("var /** @type {URIError} */ a = new URIError()");
     }
     
-    @Ignore
     @Override
     @Test
     public void testVector()
     {
-    	// TODO (erikdebruin) loose the '.<String>' in the output: Vector.<String>
     	IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
     	visitor.visitVariable(node);
-    	assertOut("var /** @type {Array.<String>} */ a = new Vector.<String>(['Hello','World'])");
+    	assertOut("var /** @type {Vector.<string>} */ a = new Vector(['Hello','World'])");
     }
 
     @Override

Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalFunctions.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalFunctions.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalFunctions.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogGlobalFunctions.java Sun Jan 20 15:59:32 2013
@@ -24,7 +24,6 @@ import org.apache.flex.compiler.internal
 import org.apache.flex.compiler.internal.js.driver.goog.GoogBackend;
 import org.apache.flex.compiler.tree.as.IFunctionCallNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -204,16 +203,13 @@ public class TestGoogGlobalFunctions ext
     	assertOut("var /** @type {string} */ a = unescape('%25')");
     }
 
-	@Ignore
 	@Override
     @Test
     public void testVector()
     {
-		// TODO (erikdebruin) first create a Vector workaround, then revisit
-		//                    this test.
     	IVariableNode node = getVariable("var a:Vector.<String> = Vector.<String>(['Hello', 'World']);");
     	visitor.visitVariable(node);
-    	assertOut("var /** @type {Object.<string>} */ a = Vector(['Hello','World'])");
+    	assertOut("var /** @type {Vector.<string>} */ a = Vector(['Hello','World'])");
     }
 
 	@Override

Modified: flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java (original)
+++ flex/falcon/trunk/compiler.jx.tests/src/org/apache/flex/compiler/internal/js/codegen/goog/TestGoogStatements.java Sun Jan 20 15:59:32 2013
@@ -27,7 +27,6 @@ import org.apache.flex.compiler.tree.as.
 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;
 
 /**
@@ -167,27 +166,26 @@ public class TestGoogStatements extends 
         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
+    	// TODO (erikdebruin) the assert is a placeholder for the eventual workaround
         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}");
+        assertOut("for-each (var /** @type {number} */ i in obj) {\n\tbreak;\n}");
     }
 
-    @Ignore
     @Override
     @Test
     public void testVisitForEach_1a()
     {
+    	// TODO (erikdebruin) the assert is a placeholder for the eventual workaround
         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;");
+        assertOut("for-each (var /** @type {number} */ i in obj)\n\tbreak;");
     }
 
     //----------------------------------
@@ -248,19 +246,19 @@ public class TestGoogStatements extends 
                 "foo: for each(var i:int in obj) { break foo; }",
                 LabeledStatementNode.class);
         visitor.visitLabeledStatement(node);
-        assertOut("foo : for each (var /** @type {number} */ i in obj) {\n\tbreak foo;\n}");
+        assertOut("foo : for-each (var /** @type {number} */ i in obj) {\n\tbreak foo;\n}");
     }
 
     @Override
     @Test
     public void testVisitLabel_1a()
     {
-        // TODO LabelStatement messes up in finally{} block, something is wrong there
+        // TODO (mschmalle) 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 /** @type {number} */ i in obj)\n\tbreak foo;");
+        assertOut("foo : for-each (var /** @type {number} */ i in obj)\n\tbreak foo;");
     }
 
     //----------------------------------
@@ -285,7 +283,7 @@ public class TestGoogStatements extends 
                         + "foo: for each(var i:int in obj) break foo;",
                 IFileNode.class);
         visitor.visitFile(node);
-        assertOut("goog.provide('A');\n\n/**\n * @constructor\n */\nA = function() {\n};\n\nA.prototype.a = function() {\n\ttry {\n\t\ta;\n\t} catch (e) {\n\t\tif (a) {\n\t\t\tif (b) {\n\t\t\t\tif (c)\n\t\t\t\t\tb;\n\t\t\t\telse if (f)\n\t\t\t\t\ta;\n\t\t\t\telse\n\t\t\t\t\te;\n\t\t\t}\n\t\t}\n\t} finally {\n\t}\n\tif (d)\n\t\tfor (var /** @type {number} */ i = 0; i < len; i++)\n\t\t\tbreak;\n\tif (a) {\n\t\twith (ab) {\n\t\t\tc();\n\t\t}\n\t\tdo {\n\t\t\ta++;\n\t\t\tdo\n\t\t\t\ta++;\n\t\t\twhile (a > b);\n\t\t} while (c > d);\n\t}\n\tif (b) {\n\t\ttry {\n\t\t\ta;\n\t\t\tthrow new Error('foo');\n\t\t} catch (e) {\n\t\t\tswitch (i) {\n\t\t\t\tcase 1:\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t} catch (f) {\n\t\t\tc;\n\t\t\teee.dd;\n\t\t} finally {\n\t\t\td;\n\t\t\tvar /** @type {Object} */ a = function(foo, bar) {\n\t\t\t\tbar = typeof bar !== 'undefined' ? bar : 'goo';\n\t\t\t\treturn -1;\n\t\t\t};\n\t\t\teee.dd;\n\t\t\teee.dd;\n\t\t\teee.dd;\n\t\t\
 teee.dd;\n\t\t}\n\t}\n\tfoo : for each (var /** @type {number} */ i in obj)\n\t\tbreak foo;;\n};");
+        assertOut("goog.provide('A');\n\n/**\n * @constructor\n */\nA = function() {\n};\n\nA.prototype.a = function() {\n\ttry {\n\t\ta;\n\t} catch (e) {\n\t\tif (a) {\n\t\t\tif (b) {\n\t\t\t\tif (c)\n\t\t\t\t\tb;\n\t\t\t\telse if (f)\n\t\t\t\t\ta;\n\t\t\t\telse\n\t\t\t\t\te;\n\t\t\t}\n\t\t}\n\t} finally {\n\t}\n\tif (d)\n\t\tfor (var /** @type {number} */ i = 0; i < len; i++)\n\t\t\tbreak;\n\tif (a) {\n\t\twith (ab) {\n\t\t\tc();\n\t\t}\n\t\tdo {\n\t\t\ta++;\n\t\t\tdo\n\t\t\t\ta++;\n\t\t\twhile (a > b);\n\t\t} while (c > d);\n\t}\n\tif (b) {\n\t\ttry {\n\t\t\ta;\n\t\t\tthrow new Error('foo');\n\t\t} catch (e) {\n\t\t\tswitch (i) {\n\t\t\t\tcase 1:\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t} catch (f) {\n\t\t\tc;\n\t\t\teee.dd;\n\t\t} finally {\n\t\t\td;\n\t\t\tvar /** @type {Object} */ a = function(foo, bar) {\n\t\t\t\tbar = typeof bar !== 'undefined' ? bar : 'goo';\n\t\t\t\treturn -1;\n\t\t\t};\n\t\t\teee.dd;\n\t\t\teee.dd;\n\t\t\teee.dd;\n\t\t\
 teee.dd;\n\t\t}\n\t}\n\tfoo : for-each (var /** @type {number} */ i in obj)\n\t\tbreak foo;;\n};");
     }
 
 

Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/as/codegen/ASEmitter.java Sun Jan 20 15:59:32 2013
@@ -100,6 +100,7 @@ public class ASEmitter implements IASEmi
     public static final String COMMA = ",";
     public static final String CURLYBRACE_CLOSE = "}";
     public static final String CURLYBRACE_OPEN = "{";
+    public static final String DASH = "-";
     public static final String EQUALS = ASTNodeID.AssignmentExpressionID.getParaphrase();
     public static final String FUNCTION = IASKeywordConstants.FUNCTION.toLowerCase();
     public static final String INDENT = "\t";
@@ -1118,7 +1119,7 @@ public class ASEmitter implements IASEmi
         return -1;
     }
 
-    private static final boolean isImplicit(IContainerNode node)
+    protected static final boolean isImplicit(IContainerNode node)
     {
         return node.getContainerType() == ContainerType.IMPLICIT
                 || node.getContainerType() == ContainerType.SYNTHESIZED;

Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogDocEmitter.java Sun Jan 20 15:59:32 2013
@@ -408,9 +408,8 @@ public class JSGoogDocEmitter extends JS
     	else if (name.equals(IASLanguageConstants._int) || 
     			 name.equals(IASLanguageConstants.uint))
     		result = IASLanguageConstants.Number.toLowerCase();
-    	else if (name.matches("Vector.<.*>"))
-    		// TODO (erikdebruin) will this work with nested Vector declarations?
-        	result = name.replace(IASLanguageConstants.Vector, IASLanguageConstants.Array);
+       
+    	result = result.replace(IASLanguageConstants.String, IASLanguageConstants.String.toLowerCase());
     	
         return result;
     }

Modified: flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java
URL: http://svn.apache.org/viewvc/flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java?rev=1435869&r1=1435868&r2=1435869&view=diff
==============================================================================
--- flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java (original)
+++ flex/falcon/trunk/compiler.jx/src/org/apache/flex/compiler/internal/js/codegen/goog/JSGoogEmitter.java Sun Jan 20 15:59:32 2013
@@ -36,6 +36,7 @@ import org.apache.flex.compiler.internal
 import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode;
 import org.apache.flex.compiler.internal.tree.as.FunctionCallNode;
 import org.apache.flex.compiler.internal.tree.as.FunctionNode;
+import org.apache.flex.compiler.internal.tree.as.NamespaceAccessExpressionNode;
 import org.apache.flex.compiler.js.codegen.goog.IJSGoogDocEmitter;
 import org.apache.flex.compiler.js.codegen.goog.IJSGoogEmitter;
 import org.apache.flex.compiler.problems.ICompilerProblem;
@@ -45,8 +46,10 @@ import org.apache.flex.compiler.tree.as.
 import org.apache.flex.compiler.tree.as.IAccessorNode;
 import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IClassNode;
+import org.apache.flex.compiler.tree.as.IContainerNode;
 import org.apache.flex.compiler.tree.as.IDefinitionNode;
 import org.apache.flex.compiler.tree.as.IExpressionNode;
+import org.apache.flex.compiler.tree.as.IForLoopNode;
 import org.apache.flex.compiler.tree.as.IFunctionCallNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
 import org.apache.flex.compiler.tree.as.IGetterNode;
@@ -57,6 +60,7 @@ import org.apache.flex.compiler.tree.as.
 import org.apache.flex.compiler.tree.as.IScopedNode;
 import org.apache.flex.compiler.tree.as.ISetterNode;
 import org.apache.flex.compiler.tree.as.ITypeNode;
+import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
 
 /**
@@ -176,6 +180,10 @@ public class JSGoogEmitter extends JSEmi
         emitMethod((IFunctionNode) definition.getConstructor().getNode());
         write(SEMICOLON);
 
+        // TODO (erikdebruin) create a way to visit all members before actually
+        //					  emitting the members themselves. This will allow 
+        //                    us to write stuff like a 'shared' property for 
+        //                    all combinations of accessors, for instance.
         IDefinitionNode[] dnodes = node.getAllMemberNodes();
         for (IDefinitionNode dnode : dnodes)
         {
@@ -635,6 +643,33 @@ public class JSGoogEmitter extends JSEmi
         getWalker().walk(node.getNameExpressionNode());
     }
 
+    @Override
+    public void emitTypedExpression(ITypedExpressionNode node)
+    {
+        getWalker().walk(node.getCollectionNode());
+        // (erikdebruin) for 'goog', leave out the ".<WhateverType>" part
+    }
+
+    @Override
+    public void emitForEachLoop(IForLoopNode node)
+    {
+        IContainerNode xnode = (IContainerNode) node.getChild(1);
+        write(IASKeywordConstants.FOR);
+        write(DASH);
+        write(IASKeywordConstants.EACH);
+        write(SPACE);
+        write(PARENTHESES_OPEN);
+
+        IContainerNode cnode = node.getConditionalsContainerNode();
+        getWalker().walk(cnode.getChild(0));
+
+        write(PARENTHESES_CLOSE);
+        if (!isImplicit(xnode))
+        	write(SPACE);
+
+        getWalker().walk(node.getStatementContentsNode());
+    }
+
     public JSGoogEmitter(FilterWriter out)
     {
         super(out);
@@ -783,6 +818,14 @@ public class JSGoogEmitter extends JSEmi
     //--------------------------------------------------------------------------
 
     @Override
+    public void emitNamespaceAccessExpression(NamespaceAccessExpressionNode node)
+    {
+        getWalker().walk(node.getLeftOperandNode());
+        write(PERIOD);
+        getWalker().walk(node.getRightOperandNode());
+    }
+
+    @Override
     public void emitBinaryOperator(IBinaryOperatorNode node)
     {
     	ASTNodeID id = node.getNodeID();