You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2013/04/12 09:02:33 UTC

[7/8] git commit: Get more complex test case to compile and run

Get more complex test case to compile and run


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/83c2c12c
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/83c2c12c
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/83c2c12c

Branch: refs/heads/develop
Commit: 83c2c12c4db1ca716f1a096c18700b627ade6035
Parents: 57e7e08
Author: Alex Harui <ah...@apache.org>
Authored: Thu Apr 11 17:23:07 2013 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Apr 11 20:52:24 2013 -0700

----------------------------------------------------------------------
 .../js/flexjs/TestFlexJSAccessorMembers.java       |    2 +-
 .../codegen/js/flexjs/TestFlexJSGlobalClasses.java |   11 +
 .../js/flexjs/TestFlexJSGlobalFunctions.java       |    9 +
 .../codegen/js/flexjs/TestFlexJSMethodMembers.java |    2 +-
 .../codegen/js/flexjs/TestFlexJSStatements.java    |   69 ++++
 .../codegen/js/goog/TestGoogAccessorMembers.java   |    2 +-
 .../codegen/js/goog/TestGoogExpressions.java       |    4 +-
 .../codegen/js/goog/TestGoogMethodMembers.java     |    2 +-
 .../codegen/js/goog/TestGoogStatements.java        |    2 +-
 .../org/apache/flex/compiler/clients/MXMLJSC.java  |    2 +
 .../flex/compiler/codegen/as/IASEmitter.java       |    7 +
 .../internal/codegen/as/ASBlockWalker.java         |    4 +
 .../compiler/internal/codegen/as/ASEmitter.java    |   12 +
 .../internal/codegen/as/ASEmitterTokens.java       |    2 +-
 .../compiler/internal/codegen/js/JSEmitter.java    |   12 +
 .../codegen/js/flexjs/JSFlexJSEmitter.java         |  259 +++++++++++++--
 .../internal/codegen/js/goog/JSGoogEmitter.java    |   27 ++-
 .../codegen/js/goog/JSGoogEmitterTokens.java       |    2 +
 .../codegen/mxml/flexjs/MXMLFlexJSEmitter.java     |    7 +
 .../compiler/internal/projects/FlexJSProject.java  |    8 +-
 20 files changed, 409 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java
index 1035101..b58543f 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java
@@ -73,7 +73,7 @@ public class TestFlexJSAccessorMembers extends TestGoogAccessorMembers
     {
         IGetterNode node = (IGetterNode) getAccessor("public static function get foo():int{return -1;}");
         asBlockWalker.visitGetter(node);
-        assertOut("/**\n * @expose\n * @return {number}\n */\nA.get_foo = function() {\n\tvar self = this;\n\treturn -1;\n}");
+        assertOut("/**\n * @expose\n * @return {number}\n */\nA.get_foo = function() {\n\treturn -1;\n}");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
index 90e3d5b..f32283f 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalClasses.java
@@ -22,6 +22,8 @@ package org.apache.flex.compiler.internal.codegen.js.flexjs;
 import org.apache.flex.compiler.driver.IBackend;
 import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogGlobalClasses;
 import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
+import org.apache.flex.compiler.tree.as.IVariableNode;
+import org.junit.Test;
 
 /**
  * @author Erik de Bruin
@@ -35,4 +37,13 @@ public class TestFlexJSGlobalClasses extends TestGoogGlobalClasses
         return new FlexJSBackend();
     }
     
+    @Override
+    @Test
+    public void testVector()
+    {
+        IVariableNode node = getVariable("var a:Vector.<String> = new Vector.<String>(['Hello', 'World']);");
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {Vector.<string>} */ a = new Array(['Hello', 'World'])");
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java
index 0c896cc..9a4210d 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSGlobalFunctions.java
@@ -41,6 +41,15 @@ public class TestFlexJSGlobalFunctions extends TestGoogGlobalFunctions
     }
 
     @Override
+    @Test
+    public void testVector()
+    {
+        IVariableNode node = getVariable("var a:Vector.<String> = Vector.<String>(['Hello', 'World']);");
+        asBlockWalker.visitVariable(node);
+        assertOut("var /** @type {Vector.<string>} */ a = Array(['Hello', 'World'])");
+    }
+
+    @Override
     protected IBackend createBackend()
     {
         return new FlexJSBackend();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSMethodMembers.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSMethodMembers.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSMethodMembers.java
index 8ac1a71..c6b3560 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSMethodMembers.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSMethodMembers.java
@@ -82,7 +82,7 @@ public class TestFlexJSMethodMembers extends TestGoogMethodMembers
         // (erikdebruin) here we actually DO want to declare the method
         //               directly on the 'class' constructor instead of the
         //               prototype!
-        assertOut("/**\n * @expose\n * @param {string} bar\n * @param {number=} baz\n * @return {number}\n */\nA.foo = function(bar, baz) {\n\tvar self = this;\n\tbaz = typeof baz !== 'undefined' ? baz : null;\n\treturn -1;\n}");
+        assertOut("/**\n * @expose\n * @param {string} bar\n * @param {number=} baz\n * @return {number}\n */\nA.foo = function(bar, baz) {\n\tbaz = typeof baz !== 'undefined' ? baz : null;\n\treturn -1;\n}");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
index 5d8cafc..7c1e5c3 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSStatements.java
@@ -23,6 +23,10 @@ import org.apache.flex.compiler.driver.IBackend;
 import org.apache.flex.compiler.internal.codegen.js.goog.TestGoogStatements;
 import org.apache.flex.compiler.internal.driver.js.flexjs.FlexJSBackend;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
+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.junit.Test;
 
 /**
  * @author Erik de Bruin
@@ -37,6 +41,71 @@ public class TestFlexJSStatements extends TestGoogStatements
     }
     
     @Override
+    @Test
+    public void testVisitForEach_1()
+    {
+        // TODO (erikdebruin) we need to insert a "goog.require('goog.array')"
+        //                    into the header
+        IForLoopNode node = (IForLoopNode) getNode(
+                "for each(var i:int in obj) { break; }", IForLoopNode.class);
+        asBlockWalker.visitForLoop(node);
+        assertOut("for (var foreachiter0 in obj) \n{\nvar i = obj[foreachiter0];\n{\n\tbreak;\n}}\n");
+    }
+
+    @Override
+    @Test
+    public void testVisitForEach_1a()
+    {
+        IForLoopNode node = (IForLoopNode) getNode(
+                "for each(var i:int in obj)  break; ", IForLoopNode.class);
+        asBlockWalker.visitForLoop(node);
+        assertOut("for (var foreachiter0 in obj) \n{\nvar i = obj[foreachiter0];\n\n\tbreak;}\n");
+    }
+
+    @Override
+    @Test
+    public void testVisitLabel_1()
+    {
+        LabeledStatementNode node = (LabeledStatementNode) getNode(
+                "foo: for each(var i:int in obj) { break foo; }",
+                LabeledStatementNode.class);
+        asBlockWalker.visitLabeledStatement(node);
+        assertOut("foo : for (var foreachiter0 in obj) \n{\nvar i = obj[foreachiter0];\n{\n\tbreak foo;\n}}\n");
+    }
+
+    @Override
+    @Test
+    public void testVisitLabel_1a()
+    {
+        // 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);
+        asBlockWalker.visitLabeledStatement(node);
+        assertOut("foo : for (var foreachiter0 in obj) \n{\nvar i = obj[foreachiter0];\n\n\tbreak foo;}\n");
+    }
+
+    @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;}"
+                        + " } 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);
+        asBlockWalker.visitFile(node);
+        assertOut("goog.provide('A');\n\n/**\n * @constructor\n */\nA = function() {\n};\n\nA.prototype.a = function() {\n\tvar self = this;\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} 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 : fo
 r (var foreachiter0 in obj) \n\t{\n\tvar i = obj[foreachiter0];\n\t\n\t\tbreak foo;}\n\t;\n};");
+    }
+
+    @Override
     protected IBackend createBackend()
     {
         return new FlexJSBackend();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
index d335130..128a2e7 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
@@ -82,7 +82,7 @@ public class TestGoogAccessorMembers extends TestAccessorMembers
     {
         IGetterNode node = (IGetterNode) getAccessor("public static function get foo():int{return -1;}");
         asBlockWalker.visitGetter(node);
-        assertOut("Object.defineProperty(\n\tA, \n\t'foo', \n\t{get:function() {\n\t\tvar self = this;\n\t\treturn -1;\n\t}, configurable:true}\n)");
+        assertOut("Object.defineProperty(\n\tA, \n\t'foo', \n\t{get:function() {\n\t\treturn -1;\n\t}, configurable:true}\n)");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogExpressions.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogExpressions.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogExpressions.java
index 39ad702..5c7a5da 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogExpressions.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogExpressions.java
@@ -128,7 +128,7 @@ public class TestGoogExpressions extends TestExpressions
                 "var a:Object = function(foo:int, bar:String = 'goo'):int{return -1;};",
                 IVariableNode.class);
         asBlockWalker.visitVariable(node);
-        assertOut("var /** @type {Object} */ a = function(foo, bar) {\n\tvar self = this;\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
@@ -140,7 +140,7 @@ public class TestGoogExpressions extends TestExpressions
                 "if (a) {addListener('foo', function(event:Object):void{doit();});}",
                 IIfNode.class);
         asBlockWalker.visitIf(node);
-        assertOut("if (a) {\n\taddListener('foo', function(event) {\n\t\tvar self = this;\n\t\tdoit();\n\t});\n}");
+        assertOut("if (a) {\n\taddListener('foo', function(event) {\n\t\tdoit();\n\t});\n}");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogMethodMembers.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogMethodMembers.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogMethodMembers.java
index 76a1a73..acf6bea 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogMethodMembers.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogMethodMembers.java
@@ -125,7 +125,7 @@ public class TestGoogMethodMembers extends TestMethodMembers
         // (erikdebruin) here we actually DO want to declare the method
         //               directly on the 'class' constructor instead of the
         //               prototype!
-        assertOut("/**\n * @param {string} bar\n * @param {number=} baz\n * @return {number}\n */\nA.foo = function(bar, baz) {\n\tvar self = this;\n\tbaz = typeof baz !== 'undefined' ? baz : null;\n\treturn -1;\n}");
+        assertOut("/**\n * @param {string} bar\n * @param {number=} baz\n * @return {number}\n */\nA.foo = function(bar, baz) {\n\tbaz = typeof baz !== 'undefined' ? baz : null;\n\treturn -1;\n}");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogStatements.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogStatements.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogStatements.java
index 19cd3cd..e49d2a4 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogStatements.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/goog/TestGoogStatements.java
@@ -285,7 +285,7 @@ public class TestGoogStatements extends TestStatements
                         + "foo: for each(var i:int in obj) break foo;",
                 IFileNode.class);
         asBlockWalker.visitFile(node);
-        assertOut("goog.provide('A');\n\n/**\n * @constructor\n */\nA = function() {\n};\n\nA.prototype.a = function() {\n\tvar self = this;\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} finally {\n\t\t\td;\n\t\t\tvar /** @type {Object} */ a = function(foo, bar) {\n\t\t\t\tvar self = this;\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.d
 d;\n\t\t}\n\t}\n\tfoo : goog.array.forEach(obj, function (i) {\n\t\tbreak foo;\n\t});\n};");
+        assertOut("goog.provide('A');\n\n/**\n * @constructor\n */\nA = function() {\n};\n\nA.prototype.a = function() {\n\tvar self = this;\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} 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 : go
 og.array.forEach(obj, function (i) {\n\t\tbreak foo;\n\t});\n};");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java b/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
index 6ea2385..7bfd437 100644
--- a/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
+++ b/compiler.jx/src/org/apache/flex/compiler/clients/MXMLJSC.java
@@ -465,6 +465,8 @@ public class MXMLJSC
     {
         final List<ICompilerProblem> problemsBuildingSWF = new ArrayList<ICompilerProblem>();
 
+        String qname = config.getMainDefinition();
+        ((FlexJSProject)project).alreadyRequired.put(qname, mainCU);
         final IJSApplication app = buildApplication(project,
                 config.getMainDefinition(), mainCU, problemsBuildingSWF);
         problems.addAll(problemsBuildingSWF);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java b/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java
index 6ff39ca..4a084c7 100644
--- a/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/codegen/as/IASEmitter.java
@@ -283,6 +283,13 @@ public interface IASEmitter extends IEmitter
     void emitFunctionObject(IFunctionObjectNode node);
 
     /**
+     * Emit an local named function {@link IFunctionNode}.
+     * 
+     * @param node The local named function {@link IFunctionNode}.
+     */
+    void emitLocalNamedFunction(IFunctionNode node);
+
+    /**
      * Emit a header at the start of a function block.
      * 
      * @param node The {@link IFunctionNode} node.

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java
index 3fd9ee5..2650aaf 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASBlockWalker.java
@@ -239,6 +239,10 @@ public class ASBlockWalker implements IASBlockVisitor, IASBlockWalker
         {
             emitter.emitMethod(node);
         }
+        else
+        {
+        	emitter.emitLocalNamedFunction(node);
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java
index e15da37..f7d6620 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitter.java
@@ -634,6 +634,18 @@ public class ASEmitter implements IASEmitter, IEmitter
     }
 
     @Override
+    public void emitLocalNamedFunction(IFunctionNode node)
+    {
+        FunctionNode fnode = (FunctionNode)node;
+        write(ASEmitterTokens.FUNCTION);
+        write(ASEmitterTokens.SPACE);
+        write(fnode.getName());
+        emitParamters(fnode.getParameterNodes());
+        emitType(fnode.getTypeNode());
+        emitFunctionScope(fnode.getScopedNode());
+    }
+
+    @Override
     public void emitFunctionObject(IFunctionObjectNode node)
     {
         FunctionNode fnode = node.getFunctionNode();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitterTokens.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitterTokens.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitterTokens.java
index 776a2de..119c38a 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitterTokens.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/as/ASEmitterTokens.java
@@ -90,7 +90,7 @@ public enum ASEmitterTokens implements IEmitterTokens
     RETURN("return"),
     THROW("throw"),
     FOR("for"),
-    //    int TOKEN_KEYWORD_IN = 58;
+    IN("in"),
     DO("do"),
     WHILE("while"),
     //    int TOKEN_KEYWORD_CONTINUE = 61;

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java
index 22846b6..99e8b24 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSEmitter.java
@@ -25,6 +25,7 @@ import org.apache.flex.compiler.codegen.js.IJSEmitter;
 import org.apache.flex.compiler.internal.codegen.as.ASEmitter;
 import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.flex.compiler.internal.tree.as.FunctionNode;
+import org.apache.flex.compiler.tree.as.IFunctionNode;
 import org.apache.flex.compiler.tree.as.IFunctionObjectNode;
 
 /**
@@ -39,6 +40,17 @@ public class JSEmitter extends ASEmitter implements IJSEmitter
     }
 
     @Override
+    public void emitLocalNamedFunction(IFunctionNode node)
+    {
+        FunctionNode fnode = (FunctionNode)node;
+        write(ASEmitterTokens.FUNCTION);
+        write(ASEmitterTokens.SPACE);
+        write(fnode.getName());
+        emitParamters(fnode.getParameterNodes());
+        emitFunctionScope(fnode.getScopedNode());
+    }
+    
+    @Override
     public void emitFunctionObject(IFunctionObjectNode node)
     {
         FunctionNode fnode = node.getFunctionNode();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index 7a4e7fe..989595f 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -39,6 +39,7 @@ import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
 import org.apache.flex.compiler.internal.definitions.AccessorDefinition;
 import org.apache.flex.compiler.internal.definitions.ClassDefinition;
 import org.apache.flex.compiler.internal.definitions.ClassTraitsDefinition;
+import org.apache.flex.compiler.internal.definitions.FunctionDefinition;
 import org.apache.flex.compiler.internal.definitions.ParameterDefinition;
 import org.apache.flex.compiler.internal.definitions.VariableDefinition;
 import org.apache.flex.compiler.internal.projects.FlexJSProject;
@@ -56,15 +57,20 @@ import org.apache.flex.compiler.tree.as.IASNode;
 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;
 import org.apache.flex.compiler.tree.as.IIdentifierNode;
+import org.apache.flex.compiler.tree.as.IIterationFlowNode;
 import org.apache.flex.compiler.tree.as.ILanguageIdentifierNode;
 import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode;
 import org.apache.flex.compiler.tree.as.ISetterNode;
+import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
+import org.apache.flex.compiler.tree.as.IVariableExpressionNode;
 import org.apache.flex.compiler.tree.as.IVariableNode;
 import org.apache.flex.compiler.units.ICompilationUnit;
 import org.apache.flex.compiler.utils.ASNodeUtils;
@@ -84,6 +90,22 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         super(out);
     }
 
+    public IDefinition thisClass;
+
+    @Override
+    protected void emitMemberName(IDefinitionNode node)
+    {
+        write(node.getName());
+    }
+
+    @Override
+    public void emitClass(IClassNode node)
+    {
+    	thisClass = node.getDefinition();
+    	
+    	super.emitClass(node);
+    }
+    
     @Override
     public void emitField(IVariableNode node)
     {
@@ -175,7 +197,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
             else
             {
                 project = getWalker().getProject();
-                def = ((IExpressionNode) cnode).resolve(project);
+                def = node.getNameNode().resolve(project);
 
                 isClassCast = def instanceof ClassDefinition
                         && !(NativeUtils.isNative(def.getBaseName()));
@@ -213,6 +235,18 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         }
     }
 
+    private boolean isSameClass(IDefinition pdef, IDefinition thisClass2, ICompilerProject project)
+    {
+    	if (pdef == thisClass2)
+    		return true;
+    
+    	// needs to be a loop
+    	if (((ClassDefinition) thisClass2).resolveBaseClass(project) == pdef)
+    		return true;
+    	
+    	return false;
+    }
+    
     @Override
     public void emitIdentifier(IIdentifierNode node)
     {
@@ -224,11 +258,6 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         String name = node.getName();
         
         IDefinition def = ((IIdentifierNode) node).resolve(project);
-        boolean bindable = false;
-        if (def instanceof VariableDefinition)
-        {
-        	bindable = ((VariableDefinition)def).isBindable();
-        }
         
         ITypeDefinition type = ((IIdentifierNode) node).resolveType(project);
 
@@ -250,12 +279,25 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
                     if (!(pnode instanceof FunctionNode)
                             && inode != ASTNodeID.MemberAccessExpressionID)
                     {
-                        writeSelf = true;
+                    	if (def instanceof FunctionDefinition)
+                    	{
+                    		if (((FunctionDefinition)def).getFunctionClassification() !=
+                    			IFunctionDefinition.FunctionClassification.LOCAL)
+                    			writeSelf = true;
+                    	}
+                    	else
+                    		writeSelf = true;
                         break;
                     }
                     else if (inode == ASTNodeID.MemberAccessExpressionID
-                            && !def.isStatic())
+                            && !def.isStatic() && 
+                            (pnode.getChild(0) == node ||
+                            	(pnode.getChild(0) instanceof ILanguageIdentifierNode &&
+                            			((ILanguageIdentifierNode) pnode.getChild(0))
+                                        .getKind() == ILanguageIdentifierNode.LanguageIdentifierKind.THIS)))
                     {
+                    	// we are in a member access expression and it isn't a static
+                    	// and we are the left node, or the left node is 'this'
                         String tname = type.getQualifiedName();
                         writeSelf = !tname.equalsIgnoreCase(cnode
                                 .getQualifiedName())
@@ -271,30 +313,37 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
             //               well enough alone!
             if (def instanceof VariableDefinition)
             {
+        		VariableDefinition vardef = (VariableDefinition)def;
+        		IDefinition pdef = vardef.getParent();
                 if (inode == ASTNodeID.MemberAccessExpressionID)
                 {
-                    writeSelf = true;
+                	if (pdef == thisClass && pnode.getChild(0) == node)
+                		writeSelf = true;
                 }
                 else if (inode == ASTNodeID.ContainerID)
                 {
-                    writeSelf = true;
-                    writeThis = true;
+                	if (isSameClass(pdef, thisClass, project))
+                	{
+                		writeSelf = true;
+                		writeThis = true;
+                	}
                 }
                 else if (!(pnode instanceof ParameterNode))
                 {
-                	if (def instanceof VariableDefinition)
-                	{
-                		VariableDefinition vardef = (VariableDefinition)def;
-                        if (SemanticUtils.isMemberDefinition(vardef))
-                        	writeSelf = true;
-                	}
-                	else
+                	if (pdef == thisClass)
                 		writeSelf = true;
                 }
             }
             else if (inode == ASTNodeID.ContainerID)
             {
-                writeSelf = true;
+            	if (def instanceof FunctionDefinition)
+            	{
+            		if (((FunctionDefinition)def).getFunctionClassification() !=
+            			IFunctionDefinition.FunctionClassification.LOCAL)
+            			writeSelf = true;
+            	}
+            	else
+            		writeSelf = true;
             }
             else if (inode == ASTNodeID.FunctionCallID
                     && !(def instanceof AccessorDefinition)
@@ -315,7 +364,9 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
 
         if (writeSelf && !isRunningInTestMode)
         {
-            boolean useGoogBind = inode == ASTNodeID.ContainerID && !writeThis;
+            boolean useGoogBind = inode == ASTNodeID.ContainerID && !writeThis 
+            							&& def instanceof FunctionDefinition &&
+            							!def.isStatic();
 
             if (useGoogBind)
             {
@@ -325,6 +376,11 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
 
             if (writeThis)
                 write(ASEmitterTokens.THIS);
+            else if (def.isStatic())
+            {
+            	String sname = def.getParent().getQualifiedName();
+            	write(sname);
+            }
             else
                 write(JSGoogEmitterTokens.SELF);
             write(ASEmitterTokens.MEMBER_ACCESS);
@@ -340,8 +396,16 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
                 emitName = false;
             }
         }
+        else if (def != null && def.isStatic())
+        {
+        	String sname = def.getParent().getQualifiedName();
+        	write(sname);
+            write(ASEmitterTokens.MEMBER_ACCESS);
+        }
 
-        if (def instanceof AccessorDefinition || 
+        IDefinition parentDef = (def != null) ? def.getParent() : null;
+        boolean isNative = (parentDef != null) && NativeUtils.isNative(parentDef.getBaseName());
+        if ((def instanceof AccessorDefinition && !isNative) || 
         		(def instanceof VariableDefinition && 
         				((VariableDefinition)def).isBindable()))
         {
@@ -443,7 +507,7 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
 
             writeArguments = anodes.length > 0;
         }
-        else if (fnode.isConstructor())
+        else if (fnode != null && fnode.isConstructor())
         {
             anodes = fnode.getParameterNodes();
 
@@ -536,7 +600,13 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
     {
         IASNode leftNode = node.getLeftOperandNode();
 
-        if (!(leftNode instanceof ILanguageIdentifierNode && ((ILanguageIdentifierNode) leftNode)
+        ICompilerProject project = getWalker().getProject();
+        IDefinition def = node.resolve(project);
+        boolean isStatic = false;
+        if (def != null && def.isStatic())
+        	isStatic = true;
+        
+        if (!isStatic && !(leftNode instanceof ILanguageIdentifierNode && ((ILanguageIdentifierNode) leftNode)
                 .getKind() == ILanguageIdentifierNode.LanguageIdentifierKind.THIS))
         {
             getWalker().walk(node.getLeftOperandNode());
@@ -679,4 +749,147 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         }
     }
 
+    private int foreachLoopCounter = 0;
+    
+    @Override
+    public void emitForEachLoop(IForLoopNode node)
+    {
+        IContainerNode xnode = (IContainerNode) node.getChild(1);
+        IBinaryOperatorNode bnode = (IBinaryOperatorNode) node
+                .getConditionalsContainerNode().getChild(0);
+        IASNode childNode = bnode.getChild(0);
+        
+        String iterName = "foreachiter" + new Integer(foreachLoopCounter).toString();
+        foreachLoopCounter++;
+
+        write(ASEmitterTokens.FOR);
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.PAREN_OPEN);
+        write(ASEmitterTokens.VAR);
+        write(ASEmitterTokens.SPACE);
+        write(iterName);
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.IN);
+        write(ASEmitterTokens.SPACE);
+        getWalker().walk(bnode.getChild(1));
+        writeToken(ASEmitterTokens.PAREN_CLOSE);
+        writeNewline();
+        write(ASEmitterTokens.BLOCK_OPEN);
+        writeNewline();
+        if (childNode instanceof IVariableExpressionNode)
+        {
+        	write(ASEmitterTokens.VAR);
+            write(ASEmitterTokens.SPACE);
+        	write(((IVariableNode) childNode.getChild(0)).getName());
+        }
+        else
+        	write(((IIdentifierNode) childNode).getName());
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.EQUAL);
+        write(ASEmitterTokens.SPACE);
+        getWalker().walk(bnode.getChild(1));
+        write(ASEmitterTokens.SQUARE_OPEN);
+        write(iterName);
+        write(ASEmitterTokens.SQUARE_CLOSE);
+        write(ASEmitterTokens.SEMICOLON);
+        writeNewline();
+        getWalker().walk(node.getStatementContentsNode());
+        write(ASEmitterTokens.BLOCK_CLOSE);
+        writeNewline();
+        
+    }
+
+    /*
+    @Override
+    public void emitForEachLoop(IForLoopNode node)
+    {
+        IContainerNode xnode = (IContainerNode) node.getChild(1);
+        IBinaryOperatorNode bnode = (IBinaryOperatorNode) node
+                .getConditionalsContainerNode().getChild(0);
+        IASNode childNode = bnode.getChild(0);
+
+        write(ASEmitterTokens.TRY);
+        write(ASEmitterTokens.BLOCK_OPEN);
+        writeNewline();
+        
+        write(JSGoogEmitterTokens.GOOG_ARRAY_FOREACH);
+        write(ASEmitterTokens.PAREN_OPEN);
+        getWalker().walk(bnode.getChild(1));
+        writeToken(ASEmitterTokens.COMMA);
+        writeToken(ASEmitterTokens.FUNCTION);
+        write(ASEmitterTokens.PAREN_OPEN);
+        if (childNode instanceof IVariableExpressionNode)
+        	write(((IVariableNode) childNode.getChild(0)).getName());
+        else
+        	write(((IIdentifierNode) childNode).getName());
+        writeToken(ASEmitterTokens.PAREN_CLOSE);
+        if (isImplicit(xnode))
+            write(ASEmitterTokens.BLOCK_OPEN);
+        getWalker().walk(node.getStatementContentsNode());
+        if (isImplicit(xnode))
+        {
+            writeNewline();
+            write(ASEmitterTokens.BLOCK_CLOSE);
+        }
+        write(ASEmitterTokens.PAREN_CLOSE);
+        writeNewline();
+        write(ASEmitterTokens.BLOCK_CLOSE);
+        writeNewline();
+        write(ASEmitterTokens.CATCH);
+        write(ASEmitterTokens.PAREN_OPEN);
+        write("foreachbreakerror");
+        write(ASEmitterTokens.PAREN_CLOSE);
+        write(ASEmitterTokens.SPACE);
+        write(ASEmitterTokens.BLOCK_OPEN);
+        write(ASEmitterTokens.BLOCK_CLOSE);
+        writeNewline();
+        
+    }
+
+    @Override
+    public void emitIterationFlow(IIterationFlowNode node)
+    {
+    	// look for break in foreach and throw error instead
+    	if (node.getKind() == IIterationFlowNode.IterationFlowKind.BREAK)
+    	{
+    		IASNode pNode = node.getParent();
+    		while (pNode != null)
+    		{
+    			ASTNodeID id = pNode.getNodeID();
+    			if (id == ASTNodeID.ForEachLoopID)
+    			{
+    				write(ASEmitterTokens.THROW);
+    				write(ASEmitterTokens.SPACE);
+    				write(ASEmitterTokens.NEW);
+    				write(ASEmitterTokens.SPACE);
+    				write(JSGoogEmitterTokens.ERROR);
+    				write(ASEmitterTokens.PAREN_OPEN);
+    				write(ASEmitterTokens.PAREN_CLOSE);
+    				write(ASEmitterTokens.SEMICOLON);
+    				return;
+    			}
+    			else if (id == ASTNodeID.ForLoopID ||
+    					id == ASTNodeID.DoWhileLoopID ||
+    					id == ASTNodeID.WhileLoopID)
+    				break;
+    			pNode = pNode.getParent();
+    		}
+    	}
+        write(node.getKind().toString().toLowerCase());
+        IIdentifierNode lnode = node.getLabelNode();
+        if (lnode != null)
+        {
+            write(ASEmitterTokens.SPACE);
+            getWalker().walk(lnode);
+        }
+    }
+    */
+    
+    @Override
+    public void emitTypedExpression(ITypedExpressionNode node)
+    {
+        write(JSGoogEmitterTokens.ARRAY);
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java
index 613dc4b..063a22e 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java
@@ -198,6 +198,24 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter
 		        emitMethod(ctorNode);
 		        write(ASEmitterTokens.SEMICOLON);
         	}
+        	else
+        	{
+                String qname = definition.getQualifiedName();
+                if (qname != null && !qname.equals(""))
+                {
+                    write(qname);
+                    write(ASEmitterTokens.SPACE);
+                    writeToken(ASEmitterTokens.EQUAL);
+                    write(ASEmitterTokens.FUNCTION);
+                    write(ASEmitterTokens.PAREN_OPEN);
+                    write(ASEmitterTokens.PAREN_CLOSE);
+                    write(ASEmitterTokens.SPACE);
+                    write(ASEmitterTokens.BLOCK_OPEN);
+                    writeNewline();
+                    write(ASEmitterTokens.BLOCK_CLOSE);
+                    write(ASEmitterTokens.SEMICOLON);
+                }
+        	}
         }
 
         IDefinitionNode[] dnodes = node.getAllMemberNodes();
@@ -574,7 +592,14 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter
     @Override
     public void emitFunctionBlockHeader(IFunctionNode node)
     {
-        if (hasBody(node))
+    	IDefinition def = node.getDefinition();
+    	boolean isStatic = false;
+    	if (def != null && def.isStatic())
+    		isStatic = true;
+    	boolean isLocal = false;
+    	if (node.getFunctionClassification() == IFunctionDefinition.FunctionClassification.LOCAL)
+    		isLocal = true;
+        if (hasBody(node) && !isStatic && !isLocal)
             emitSelfReference(node);
 
         if (node.isConstructor()

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java
index 5229395..043f4ec 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitterTokens.java
@@ -12,6 +12,8 @@ public enum JSGoogEmitterTokens implements IEmitterTokens
     GOOG_PROVIDE("goog.provide"),
     GOOG_REQUIRE("goog.require"),
     OBJECT("Object"),
+    ARRAY("Array"),
+    ERROR("Error"),
     SELF("self");
 
     private String token;

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
index 7496ef5..6a13004 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/MXMLFlexJSEmitter.java
@@ -47,6 +47,7 @@ import org.apache.flex.compiler.tree.mxml.IMXMLStringNode;
 import org.apache.flex.compiler.tree.mxml.IMXMLStyleSpecifierNode;
 import org.apache.flex.compiler.units.ICompilationUnit;
 import org.apache.flex.compiler.visitor.mxml.IMXMLBlockWalker;
+import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter;
 
 /**
  * @author Erik de Bruin
@@ -110,6 +111,12 @@ public class MXMLFlexJSEmitter extends MXMLEmitter implements
         }
 
         // visit MXML
+        IClassDefinition cdef = node.getClassDefinition();
+        IASEmitter asEmitter = ((IMXMLBlockWalker) getMXMLWalker())
+        .getASEmitter();
+        ((JSFlexJSEmitter)asEmitter).thisClass = cdef;
+
+        // visit tags
         final int len = node.getChildCount();
         for (int i = 0; i < len; i++)
         {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/83c2c12c/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
index f00cf64..c4cf0cf 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/projects/FlexJSProject.java
@@ -30,7 +30,7 @@ public class FlexJSProject extends FlexProject
     }
 
     private HashMap<ICompilationUnit, ArrayList<String>> requires = new HashMap<ICompilationUnit, ArrayList<String>>();
-    private HashMap<String, String> already = new HashMap<String, String>();
+    public HashMap<String, ICompilationUnit> alreadyRequired = new HashMap<String, ICompilationUnit>();
     
     @Override
     public void addDependency(ICompilationUnit from, ICompilationUnit to, DependencyType dt, String qname)
@@ -46,16 +46,16 @@ public class FlexJSProject extends FlexProject
     	// if the class is already required by some other class
     	// don't add it.  Otherwise we can get circular
     	// dependencies.
-    	boolean circular = false;
+    	boolean circular = (from == to);
     	if (requires.containsKey(to))
     	{
-    		if (already.containsKey(qname))
+    		if (alreadyRequired.containsKey(qname))
     			circular = true;
     	}
     	if (!circular || dt == DependencyType.INHERITANCE)
     	{
     		reqs.add(qname);
-    		already.put(qname, qname);
+    		alreadyRequired.put(qname, from);
     	}
         super.addDependency(from, to, dt, qname);
     }