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