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 2015/11/19 23:28:36 UTC

git commit: [flex-falcon] [refs/heads/develop] - internal classes

Repository: flex-falcon
Updated Branches:
  refs/heads/develop 22fa6defa -> face6d2ee


internal classes


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

Branch: refs/heads/develop
Commit: face6d2eebbac08fb37b288f4d9e3ee367c51b3e
Parents: 22fa6de
Author: Alex Harui <ah...@apache.org>
Authored: Thu Nov 19 14:28:26 2015 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Nov 19 14:28:26 2015 -0800

----------------------------------------------------------------------
 .../codegen/js/flexjs/TestFlexJSEmiter.java     |   6 +-
 .../codegen/js/flexjs/TestFlexJSFile.java       |   6 +-
 .../codegen/js/flexjs/TestFlexJSPackage.java    | 155 +++++++++++++++++-
 .../codegen/js/flexjs/TestFlexJSStatements.java |   2 +-
 .../codegen/js/vf2js/TestVF2JSStatements.java   |   2 +-
 .../mxml/flexjs/TestFlexJSMXMLApplication.java  |   6 +-
 .../mxml/flexjs/TestFlexJSMXMLScript.java       |   4 +-
 .../mxml/vf2js/TestVF2JSMXMLApplication.java    |   2 +-
 .../flex/compiler/internal/test/TestBase.java   |  24 ++-
 .../internal/codegen/js/JSSessionModel.java     |  16 ++
 .../codegen/js/flexjs/JSFlexJSDocEmitter.java   |   9 +-
 .../codegen/js/flexjs/JSFlexJSEmitter.java      |  40 ++++-
 .../internal/codegen/js/jx/ClassEmitter.java    |   2 +
 .../codegen/js/jx/InterfaceEmitter.java         |   1 +
 .../codegen/js/jx/PackageFooterEmitter.java     | 156 ++++++++++---------
 15 files changed, 326 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSEmiter.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSEmiter.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSEmiter.java
index 914b2f4..c92254c 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSEmiter.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSEmiter.java
@@ -54,7 +54,7 @@ public class TestFlexJSEmiter extends TestGoogEmiter
                 + "return \"Don't \" + _privateVar + value; }";
         IFileNode node = compileAS(code);
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * com.example.components.MyEventTarget\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('com.example.components.MyEventTarget');\n\n\n\n/**\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ncom.example.components.MyEventTarget = function() {\n  com.example.components.MyEventTarget.base(this, 'constructor');\n  if (foo() != 42) {\n    bar();\n  }\n};\ngoog.inherits(com.example.components.MyEventTarget, goog.events.EventTarget);\n\n\n/**\n * @private\n * @type {string}\n */\ncom.example.components.MyEventTarget.prototype._privateVar = \"do \";\n\n\n/**\n * @export\n * @type {number}\n */\ncom.example.components.MyEventTarget.prototype.publicProperty = 100;\n\n\n/**\n * @export\n * @param {string} value\n * @return {string}\n */\ncom.example.components.MyEventTarget.prototype.myFunction = function(value) {\n  return \"Don't \" + this._privateVar + value;\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>
 >}\n */\ncom.example.components.MyEventTarget.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'MyEventTarget', qName: 'com.example.components.MyEventTarget'}] };\n");
+        assertOutWithMetadata("/**\n * com.example.components.MyEventTarget\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('com.example.components.MyEventTarget');\n\n\n\n/**\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ncom.example.components.MyEventTarget = function() {\n  com.example.components.MyEventTarget.base(this, 'constructor');\n  if (foo() != 42) {\n    bar();\n  }\n};\ngoog.inherits(com.example.components.MyEventTarget, goog.events.EventTarget);\n\n\n/**\n * @private\n * @type {string}\n */\ncom.example.components.MyEventTarget.prototype._privateVar = \"do \";\n\n\n/**\n * @export\n * @type {number}\n */\ncom.example.components.MyEventTarget.prototype.publicProperty = 100;\n\n\n/**\n * @export\n * @param {string} value\n * @return {string}\n */\ncom.example.components.MyEventTarget.prototype.myFunction = function(value) {\n  return \"Don't \" + this._privateVar + value;\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Ar
 ray.<Object>>}\n */\ncom.example.components.MyEventTarget.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'MyEventTarget', qName: 'com.example.components.MyEventTarget'}] };\n");
     }
 
     @Override
@@ -65,7 +65,7 @@ public class TestFlexJSEmiter extends TestGoogEmiter
                 + "public interface TestInterface { } }";
         IFileNode node = compileAS(code);
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * com.example.components.TestInterface\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('com.example.components.TestInterface');\n\n\n\n/**\n * @interface\n */\ncom.example.components.TestInterface = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\ncom.example.components.TestInterface.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'TestInterface', qName: 'com.example.components.TestInterface'}] };\n");
+        assertOutWithMetadata("/**\n * com.example.components.TestInterface\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('com.example.components.TestInterface');\n\n\n\n/**\n * @interface\n */\ncom.example.components.TestInterface = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\ncom.example.components.TestInterface.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'TestInterface', qName: 'com.example.components.TestInterface'}] };\n");
     }
 
     @Override
@@ -76,7 +76,7 @@ public class TestFlexJSEmiter extends TestGoogEmiter
                 + "public class TestClass { } }";
         IFileNode node = compileAS(code);
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * com.example.components.TestClass\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('com.example.components.TestClass');\n\n\n\n/**\n * @constructor\n */\ncom.example.components.TestClass = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\ncom.example.components.TestClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'TestClass', qName: 'com.example.components.TestClass'}] };\n");
+        assertOutWithMetadata("/**\n * com.example.components.TestClass\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('com.example.components.TestClass');\n\n\n\n/**\n * @constructor\n */\ncom.example.components.TestClass = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\ncom.example.components.TestClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'TestClass', qName: 'com.example.components.TestClass'}] };\n");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFile.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFile.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFile.java
index 4524844..660f44b 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFile.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFile.java
@@ -49,7 +49,7 @@ public class TestFlexJSFile extends FlexJSTestBase
         
         //writeResultToFile(writer.toString(), fileName);
         
-        assertOut(getCodeFromFile(fileName + "_result", true,
+        assertOutWithMetadata(getCodeFromFile(fileName + "_result", true,
                 "flexjs" + File.separator + "files"));
     }
 
@@ -67,7 +67,7 @@ public class TestFlexJSFile extends FlexJSTestBase
         
         //writeResultToFile(writer.toString(), fileName);
         
-        assertOut(getCodeFromFile(fileName + "_result", true,
+        assertOutWithMetadata(getCodeFromFile(fileName + "_result", true,
                 "flexjs" + File.separator + "files"));
     }
 
@@ -83,7 +83,7 @@ public class TestFlexJSFile extends FlexJSTestBase
         
         //writeResultToFile(writer.toString(), fileName);
         
-        assertOut(getCodeFromFile(fileName + "_result", true,
+        assertOutWithMetadata(getCodeFromFile(fileName + "_result", true,
                 "flexjs" + File.separator + "files"));
     }
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
index 48759f6..9bc13ca 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSPackage.java
@@ -53,7 +53,7 @@ public class TestFlexJSPackage extends TestGoogPackage
 
         IFileNode node = compileAS("package {public class A{}}");
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('A');\n\n\n\n/**\n * @constructor\n */\nA = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nA.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'A'}] };\n");
+        assertOutWithMetadata("/**\n * A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('A');\n\n\n\n/**\n * @constructor\n */\nA = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nA.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'A'}] };\n");
     }
 
     @Override
@@ -62,7 +62,7 @@ public class TestFlexJSPackage extends TestGoogPackage
     {
         IFileNode node = compileAS("package foo.bar.baz {public class A{}}");
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * foo.bar.baz.A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('foo.bar.baz.A');\n\n\n\n/**\n * @constructor\n */\nfoo.bar.baz.A = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nfoo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n");
+        assertOutWithMetadata("/**\n * foo.bar.baz.A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('foo.bar.baz.A');\n\n\n\n/**\n * @constructor\n */\nfoo.bar.baz.A = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nfoo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n");
     }
 
     @Override
@@ -71,7 +71,7 @@ public class TestFlexJSPackage extends TestGoogPackage
     {
         IFileNode node = compileAS("package foo.bar.baz {public class A{public function A(){}}}");
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * foo.bar.baz.A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('foo.bar.baz.A');\n\n\n\n/**\n * @constructor\n */\nfoo.bar.baz.A = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nfoo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n");
+        assertOutWithMetadata("/**\n * foo.bar.baz.A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('foo.bar.baz.A');\n\n\n\n/**\n * @constructor\n */\nfoo.bar.baz.A = function() {\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nfoo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n");
     }
 
     @Override
@@ -80,9 +80,156 @@ public class TestFlexJSPackage extends TestGoogPackage
     {
         IFileNode node = compileAS("package foo.bar.baz {public class A{public function A(){if (a){for (var i:Object in obj){doit();}}}}}");
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * foo.bar.baz.A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('foo.bar.baz.A');\n\n\n\n/**\n * @constructor\n */\nfoo.bar.baz.A = function() {\n  if (a) {\n    for (var /** @type {Object} */ i in obj) {\n      doit();\n    }\n  }\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nfoo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n");
+        assertOutWithMetadata("/**\n * foo.bar.baz.A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('foo.bar.baz.A');\n\n\n\n/**\n * @constructor\n */\nfoo.bar.baz.A = function() {\n  if (a) {\n    for (var /** @type {Object} */ i in obj) {\n      doit();\n    }\n  }\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nfoo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n");
     }
 
+    @Test
+    public void testPackageQualified_ClassAndInternalClass()
+    {
+        IFileNode node = compileAS("package foo.bar.baz {\n" + 
+        							  "public class A {\n" +
+        							  "public function A(){\n" +
+        							      "var internalClass:InternalClass = new InternalClass();\n" +
+        							  "}}}\n" +
+        							  "class InternalClass {\n" +
+        							      "public function InternalClass(){}\n" +
+        							  "}");
+        asBlockWalker.visitFile(node);
+        assertOutWithMetadata("/**\n" +
+        		  " * foo.bar.baz.A\n" +
+        		  " *\n" +
+        		  " * @fileoverview\n" +
+        		  " *\n" +
+        		  " * @suppress {checkTypes}\n" +
+        		  " */\n" +
+        		  "\n" +
+        		  "goog.provide('foo.bar.baz.A');\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * @constructor\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A = function() {\n" +
+        		  "  var /** @type {foo.bar.baz.A.InternalClass} */ internalClass = new foo.bar.baz.A.InternalClass();\n" +
+        		  "};\n" +
+        		  "\n" +
+        		  "\n/" +
+        		  "**\n" +
+        		  " * Metadata\n" +
+        		  " *\n" +
+        		  " * @type {Object.<string, Array.<Object>>}\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * @constructor\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.InternalClass = function() {\n" +
+        		  "};\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * Metadata\n" +
+        		  " *\n" +
+        		  " * @type {Object.<string, Array.<Object>>}\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.InternalClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'InternalClass', qName: 'foo.bar.baz.A.InternalClass'}] };\n");
+    }
+
+    @Test
+    public void testPackageQualified_ClassAndInternalClassMethods()
+    {
+        IFileNode node = compileAS("package foo.bar.baz {\n" + 
+        							  "public class A {\n" +
+        							  "public function A(){\n" +
+        							      "var internalClass:InternalClass = new InternalClass();\n" +
+        							      "var myString:String = InternalClass.someString;\n" +
+        							      "myString = InternalClass.someStaticFunction();\n" +
+        							      "myString = internalClass.someMethod();\n" +
+        							  "}}}\n" +
+        							  "class InternalClass {\n" +
+        							      "public function InternalClass(){\n" +
+        							      "}\n" +
+       							          "public static var someString:String = \"foo\";\n" +
+    							          "public static function someStaticFunction():String { return \"bar\";}\n" +
+    							          "public function someMethod():String { return \"baz\";}\n" +
+        							  "}");
+        asBlockWalker.visitFile(node);
+        assertOutWithMetadata("/**\n" +
+        		  " * foo.bar.baz.A\n" +
+        		  " *\n" +
+        		  " * @fileoverview\n" +
+        		  " *\n" +
+        		  " * @suppress {checkTypes}\n" +
+        		  " */\n" +
+        		  "\n" +
+        		  "goog.provide('foo.bar.baz.A');\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * @constructor\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A = function() {\n" +
+        		  "  var /** @type {foo.bar.baz.A.InternalClass} */ internalClass = new foo.bar.baz.A.InternalClass();\n" +
+        		  "  var /** @type {string} */ myString = foo.bar.baz.A.InternalClass.someString;\n" +
+        		  "  myString = foo.bar.baz.A.InternalClass.someStaticFunction();\n" +
+        		  "  myString = internalClass.someMethod();\n" +
+        		  "};\n" +
+        		  "\n" +
+        		  "\n/" +
+        		  "**\n" +
+        		  " * Metadata\n" +
+        		  " *\n" +
+        		  " * @type {Object.<string, Array.<Object>>}\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'A', qName: 'foo.bar.baz.A'}] };\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * @constructor\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.InternalClass = function() {\n" +
+        		  "};\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * @export\n" +
+        		  " * @type {string}\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.InternalClass.someString = \"foo\";\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * @export\n" +
+        		  " * @return {string}\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.InternalClass.someStaticFunction = function() {\n" +
+        		  "  return \"bar\";\n" +
+        		  "};\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * @export\n" +
+        		  " * @return {string}\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.InternalClass.prototype.someMethod = function() {\n" +
+        		  "  return \"baz\";\n" +
+        		  "};\n" +
+        		  "\n" +
+        		  "\n" +
+        		  "/**\n" +
+        		  " * Metadata\n" +
+        		  " *\n" +
+        		  " * @type {Object.<string, Array.<Object>>}\n" +
+        		  " */\n" +
+        		  "foo.bar.baz.A.InternalClass.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'InternalClass', qName: 'foo.bar.baz.A.InternalClass'}] };\n");
+    }
+    
     @Override
     protected IBackend createBackend()
     {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/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 7d8e725..e8cccb7 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
@@ -458,7 +458,7 @@ public class TestFlexJSStatements extends TestGoogStatements
                         + "foo: for each(var i:int in obj) break foo;",
                 IFileNode.class);
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * FalconTest_A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('FalconTest_A');\n\n\n\n/**\n * @constructor\n */\nFalconTest_A = function() {\n};\n\n\nFalconTest_A.prototype.falconTest_a = function() {\n  var self = this;\n  try {\n    a;\n  } catch (e) {\n    if (a) {\n      if (b) {\n        if (c)\n          b;\n        else if (f)\n          a;\n        else\n          e;\n      }\n    }\n  } finally {\n  }\n  if (d)\n    for (var /** @type {number} */ i = 0; i < len; i++)\n      break;\n  if (a) {\n    with (ab) {\n      c();\n    }\n    do {\n      a++;\n      do\n        a++;\n      while (a > b);\n    } while (c > d);\n  }\n  if (b) {\n    try {\n      a;\n      throw new Error('foo');\n    } catch (e) {\n      switch (i) {\n        case 1:\n          break;\n        default:\n          return;\n      }\n    } finally {\n      d;\n      var /** @type {Object} */ a = function(foo, bar) {\n        bar = typeof bar !== 'undefin
 ed' ? bar : 'goo';\n        return -1;\n      };\n      eee.dd;\n      eee.dd;\n      eee.dd;\n      eee.dd;\n    }\n  }\n  foo : for (var foreachiter0 in obj) \n  {\n  var i = obj[foreachiter0];\n  \n    break foo;}\n  ;\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nFalconTest_A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'FalconTest_A', qName: 'FalconTest_A'}] };\n");
+        assertOutWithMetadata("/**\n * FalconTest_A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('FalconTest_A');\n\n\n\n/**\n * @constructor\n */\nFalconTest_A = function() {\n};\n\n\nFalconTest_A.prototype.falconTest_a = function() {\n  var self = this;\n  try {\n    a;\n  } catch (e) {\n    if (a) {\n      if (b) {\n        if (c)\n          b;\n        else if (f)\n          a;\n        else\n          e;\n      }\n    }\n  } finally {\n  }\n  if (d)\n    for (var /** @type {number} */ i = 0; i < len; i++)\n      break;\n  if (a) {\n    with (ab) {\n      c();\n    }\n    do {\n      a++;\n      do\n        a++;\n      while (a > b);\n    } while (c > d);\n  }\n  if (b) {\n    try {\n      a;\n      throw new Error('foo');\n    } catch (e) {\n      switch (i) {\n        case 1:\n          break;\n        default:\n          return;\n      }\n    } finally {\n      d;\n      var /** @type {Object} */ a = function(foo, bar) {\n        bar = typeof bar 
 !== 'undefined' ? bar : 'goo';\n        return -1;\n      };\n      eee.dd;\n      eee.dd;\n      eee.dd;\n      eee.dd;\n    }\n  }\n  foo : for (var foreachiter0 in obj) \n  {\n  var i = obj[foreachiter0];\n  \n    break foo;}\n  ;\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nFalconTest_A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'FalconTest_A', qName: 'FalconTest_A'}] };\n");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/vf2js/TestVF2JSStatements.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/vf2js/TestVF2JSStatements.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/vf2js/TestVF2JSStatements.java
index 431d01d..2d59b6a 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/vf2js/TestVF2JSStatements.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/js/vf2js/TestVF2JSStatements.java
@@ -537,7 +537,7 @@ public class TestVF2JSStatements extends TestGoogStatements
                         + "foo: for each(var i:int in obj) break foo;",
                 IFileNode.class);
         asBlockWalker.visitFile(node);
-        assertOut("/**\n * FalconTest_A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('FalconTest_A');\n\n\n\n/**\n * @constructor\n */\nFalconTest_A = function() {};\n\n\nFalconTest_A.prototype.falconTest_a = function() {\n  try {\n    a;\n  } catch (e) {\n    if (a) {\n      if (b) {\n        if (c)\n          b;\n        else if (f)\n          a;\n        else\n          e;\n      }\n    }\n  } finally {\n  }\n  if (d)\n    for (var /** @type {number} */ i = 0; i < len; i++)\n      break;\n  if (a) {\n    with (ab) {\n      c();\n    }\n    do {\n      a++;\n      do\n        a++;\n      while (a > b);\n    } while (c > d);\n  }\n  if (b) {\n    try {\n      a;\n      throw new Error('foo');\n    } catch (e) {\n      switch (i) {\n        case 1:\n          break;\n        default:\n          return;\n      }\n    } finally {\n      d;\n      var /** @type {Object} */ a = function(foo, bar) {\n        bar = typeof bar !== 'undefined' ? bar : 'goo';\n  
       return -1;\n      };\n      eee.dd;\n      eee.dd;\n      eee.dd;\n      eee.dd;\n    }\n  }\n  foo : for (var foreachiter0 in obj) \n  {\n  var i = obj[foreachiter0];\n  \n    break foo;}\n  ;\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nFalconTest_A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'FalconTest_A', qName: 'FalconTest_A'}] };\n");
+        assertOutWithMetadata("/**\n * FalconTest_A\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('FalconTest_A');\n\n\n\n/**\n * @constructor\n */\nFalconTest_A = function() {};\n\n\nFalconTest_A.prototype.falconTest_a = function() {\n  try {\n    a;\n  } catch (e) {\n    if (a) {\n      if (b) {\n        if (c)\n          b;\n        else if (f)\n          a;\n        else\n          e;\n      }\n    }\n  } finally {\n  }\n  if (d)\n    for (var /** @type {number} */ i = 0; i < len; i++)\n      break;\n  if (a) {\n    with (ab) {\n      c();\n    }\n    do {\n      a++;\n      do\n        a++;\n      while (a > b);\n    } while (c > d);\n  }\n  if (b) {\n    try {\n      a;\n      throw new Error('foo');\n    } catch (e) {\n      switch (i) {\n        case 1:\n          break;\n        default:\n          return;\n      }\n    } finally {\n      d;\n      var /** @type {Object} */ a = function(foo, bar) {\n        bar = typeof bar !== 'undefined' ? bar 
 : 'goo';\n        return -1;\n      };\n      eee.dd;\n      eee.dd;\n      eee.dd;\n      eee.dd;\n    }\n  }\n  foo : for (var foreachiter0 in obj) \n  {\n  var i = obj[foreachiter0];\n  \n    break foo;}\n  ;\n};\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nFalconTest_A.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'FalconTest_A', qName: 'FalconTest_A'}] };\n");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java
index 3d67bc3..da0359f 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLApplication.java
@@ -37,7 +37,7 @@ public class TestFlexJSMXMLApplication extends FlexJSTestBase
         
         //writeResultToFile(writer.toString(), fileName);
 
-        assertOut(getCodeFromFile(fileName + "_result", true, "flexjs/files"));
+        assertOutWithMetadata(getCodeFromFile(fileName + "_result", true, "flexjs/files"));
     }
 
     @Test
@@ -52,7 +52,7 @@ public class TestFlexJSMXMLApplication extends FlexJSTestBase
 
         //writeResultToFile(writer.toString(), fileName);
 
-        assertOut(getCodeFromFile(fileName + "_result", true, "flexjs/files"));
+        assertOutWithMetadata(getCodeFromFile(fileName + "_result", true, "flexjs/files"));
     }
 
     @Test
@@ -67,7 +67,7 @@ public class TestFlexJSMXMLApplication extends FlexJSTestBase
 
         //writeResultToFile(writer.toString(), fileName);
 
-        assertOut(getCodeFromFile(fileName + "_result", true, "flexjs/files"));
+        assertOutWithMetadata(getCodeFromFile(fileName + "_result", true, "flexjs/files"));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLScript.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLScript.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLScript.java
index a0d6c5d..daad01e 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLScript.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/flexjs/TestFlexJSMXMLScript.java
@@ -45,7 +45,7 @@ public class TestFlexJSMXMLScript extends FlexJSTestBase
         String appName = dnode.getQualifiedName();
         String outTemplate = "/**\n * AppName\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('AppName');\n\ngoog.require('org.apache.flex.core.Application');\n\n\n\n\n/**\n * @constructor\n * @extends {org.apache.flex.core.Application}\n */\nAppName = function() {\n  AppName.base(this, 'constructor');\n  \n  /**\n   * @private\n   * @type {Array}\n   */\n  this.mxmldd;\n  \n  /**\n   * @private\n   * @type {Array}\n   */\n  this.mxmldp;\n};\ngoog.inherits(AppName, org.apache.flex.core.Application);\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nAppName.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'AppName', qName: 'AppName' }] };\n\n\n/**\n * @export\n * @override\n */\nAppName.prototype.addedToParent = function() {\n  AppName.base(this, 'addedToParent');\n};\n\n\n";
         	
-        assertOut(outTemplate.replaceAll("AppName", appName));
+        assertOutWithMetadata(outTemplate.replaceAll("AppName", appName));
     }
 
     @Test
@@ -65,6 +65,6 @@ public class TestFlexJSMXMLScript extends FlexJSTestBase
         String appName = dnode.getQualifiedName();
         String outTemplate = "/**\n * AppName\n *\n * @fileoverview\n *\n * @suppress {checkTypes}\n */\n\ngoog.provide('AppName');\n\ngoog.require('org.apache.flex.core.Application');\n\n\n\n\n/**\n * @constructor\n * @extends {org.apache.flex.core.Application}\n */\nAppName = function() {\n  AppName.base(this, 'constructor');\n  \n  this.foo = ['foo'];\n  /**\n   * @private\n   * @type {Array}\n   */\n  this.mxmldd;\n  \n  /**\n   * @private\n   * @type {Array}\n   */\n  this.mxmldp;\n};\ngoog.inherits(AppName, org.apache.flex.core.Application);\n\n\n/**\n * Metadata\n *\n * @type {Object.<string, Array.<Object>>}\n */\nAppName.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'AppName', qName: 'AppName' }] };\n\n\n/**\n * @export\n * @type {Array}\n */\nAppName.prototype.foo;\n\n\n";
         	
-        assertOut(outTemplate.replaceAll("AppName", appName));
+        assertOutWithMetadata(outTemplate.replaceAll("AppName", appName));
     }
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/vf2js/TestVF2JSMXMLApplication.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/vf2js/TestVF2JSMXMLApplication.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/vf2js/TestVF2JSMXMLApplication.java
index 4aa4856..086b554 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/vf2js/TestVF2JSMXMLApplication.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/codegen/mxml/vf2js/TestVF2JSMXMLApplication.java
@@ -53,7 +53,7 @@ public class TestVF2JSMXMLApplication extends VF2JSMXMLTestBase
         
         //writeResultToFile(writer.toxString(), fileName);
 
-        assertOut(getCodeFromFile(fileName + "_result", true, "vf2js/files"));
+        assertOutWithMetadata(getCodeFromFile(fileName + "_result", true, "vf2js/files"));
     }
 
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
----------------------------------------------------------------------
diff --git a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
index 7894d85..d09322e 100644
--- a/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
+++ b/compiler.jx.tests/src/org/apache/flex/compiler/internal/test/TestBase.java
@@ -146,12 +146,32 @@ public class TestBase implements ITestBase
         return null;
     }
 
-    protected void assertOut(String code)
+    protected void assertOut(String code, boolean keepMetadata)
     {
-        mCode = removeGeneratedString(writer.toString());
+    	mCode = removeGeneratedString(writer.toString());
+    	if (!keepMetadata)
+    		mCode = removeMetadata(mCode);
         //System.out.println(mCode);
         assertThat(mCode, is(code));
     }
+    
+    protected void assertOut(String code)
+    {
+        assertOut(code, false);
+    }
+    
+    protected void assertOutWithMetadata(String code)
+    {
+        assertOut(code, true);
+    }
+    
+    protected String removeMetadata(String code)
+    {
+    	int c = code.indexOf("\n\n\n/**\n * Metadata");
+    	if (c != -1)
+    		return code.substring(0, c);
+    	return code;
+    }
 
     protected String removeGeneratedString(String code)
     {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
index 86b0408..5f3f768 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/JSSessionModel.java
@@ -64,6 +64,8 @@ public class JSSessionModel
 
     private ArrayList<String> bindableVars = new ArrayList<String>();
 
+    private HashMap<String, String> internalClasses;
+    
     private int foreachLoopCount = 0;
 
     public IClassDefinition getCurrentClass()
@@ -127,6 +129,20 @@ public class JSSessionModel
         return bindableVars;
     }
 
+    public HashMap<String, String> getInternalClasses()
+    {
+    	if (internalClasses == null)
+    		internalClasses = new HashMap<String, String>();
+        return internalClasses;
+    }
+
+    public boolean isInternalClass(String className)
+    {
+    	if (internalClasses == null) return false;
+    	
+        return internalClasses.containsKey(className);
+    }
+
     public final void incForeachLoopCount()
     {
         foreachLoopCount++;

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java
index 5c555a1..85a9aca 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSDocEmitter.java
@@ -88,14 +88,7 @@ public class JSFlexJSDocEmitter extends JSGoogDocEmitter
     @Override
     protected String formatQualifiedName(String name)
     {
-    	/*
-        if (name.contains("goog.") || name.startsWith("Vector."))
-            return name;
-        name = name.replaceAll("\\.", "_");
-        */
-    	if (name.startsWith("window."))
-    		name = name.substring(7);
-        return name;
+    	return ((JSFlexJSEmitter)emitter).formatQualifiedName(name);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/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 f0431af..57eb309 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
@@ -26,7 +26,6 @@ import org.apache.flex.compiler.codegen.js.goog.IJSGoogDocEmitter;
 import org.apache.flex.compiler.definitions.IClassDefinition;
 import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.IPackageDefinition;
-import org.apache.flex.compiler.definitions.ITypeDefinition;
 import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitter;
 import org.apache.flex.compiler.internal.codegen.js.goog.JSGoogEmitterTokens;
@@ -65,6 +64,7 @@ import org.apache.flex.compiler.tree.as.IBinaryOperatorNode;
 import org.apache.flex.compiler.tree.as.IClassNode;
 import org.apache.flex.compiler.tree.as.IDefinitionNode;
 import org.apache.flex.compiler.tree.as.IExpressionNode;
+import org.apache.flex.compiler.tree.as.IFileNode;
 import org.apache.flex.compiler.tree.as.IForLoopNode;
 import org.apache.flex.compiler.tree.as.IFunctionCallNode;
 import org.apache.flex.compiler.tree.as.IFunctionNode;
@@ -74,6 +74,8 @@ import org.apache.flex.compiler.tree.as.IInterfaceNode;
 import org.apache.flex.compiler.tree.as.ILiteralContainerNode;
 import org.apache.flex.compiler.tree.as.ILiteralNode;
 import org.apache.flex.compiler.tree.as.IMemberAccessExpressionNode;
+import org.apache.flex.compiler.tree.as.IPackageNode;
+import org.apache.flex.compiler.tree.as.IScopedNode;
 import org.apache.flex.compiler.tree.as.ISetterNode;
 import org.apache.flex.compiler.tree.as.ITypedExpressionNode;
 import org.apache.flex.compiler.tree.as.IUnaryOperatorNode;
@@ -132,6 +134,11 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         return accessorEmitter;
     }
 
+    public PackageFooterEmitter getPackageFooterEmitter()
+    {
+        return packageFooterEmitter;
+    }
+
     // TODO (mschmalle) Fix; this is not using the backend doc strategy for replacement
     @Override
     public IJSGoogDocEmitter getDocEmitter()
@@ -233,6 +240,8 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
             return name;
         name = name.replaceAll("\\.", "_");
         */
+    	if (getModel().isInternalClass(name))
+    		return getModel().getInternalClasses().get(name);
     	if (name.startsWith("window."))
     		name = name.substring(7);
         return name;
@@ -245,6 +254,35 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
     @Override
     public void emitPackageHeader(IPackageDefinition definition)
     {
+    	IPackageNode packageNode = definition.getNode();
+    	IFileNode fileNode = (IFileNode) packageNode.getAncestorOfType(IFileNode.class);
+        int nodeCount = fileNode.getChildCount();
+        String mainClassName = null;
+        for (int i = 0; i < nodeCount; i++)
+        {
+	        IASNode pnode = fileNode.getChild(i);
+	        
+	        if (pnode instanceof IPackageNode)
+	        {
+	        	IScopedNode snode = ((IPackageNode)pnode).getScopedNode();
+	            int snodeCount = snode.getChildCount();
+	            for (int j = 0; j < snodeCount; j++)
+	            {
+	    	        IASNode cnode = snode.getChild(j);
+	    	        if (cnode instanceof IClassNode)
+	    	        {
+	    	        	mainClassName = ((IClassNode)cnode).getQualifiedName();
+	    	        	break;
+	    	        }
+	            }
+	        }
+	        else if (pnode instanceof IClassNode)
+	        {
+	        	String className = ((IClassNode)pnode).getQualifiedName();
+	        	getModel().getInternalClasses().put(className, mainClassName + "." + className);
+	        }
+        }
+
         packageHeaderEmitter.emit(definition);
     }
 

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java
index 15fdf2e..6f8a127 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java
@@ -139,6 +139,8 @@ public class ClassEmitter extends JSSubEmitter implements
 
         fjs.getBindableEmitter().emit(definition);
         fjs.getAccessorEmitter().emit(definition);
+        
+        fjs.getPackageFooterEmitter().emitClassInfo(node);
     }
     
     public void emitComplexInitializers(IClassNode node)

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/InterfaceEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/InterfaceEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/InterfaceEmitter.java
index ce9f1c6..a557d78 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/InterfaceEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/InterfaceEmitter.java
@@ -125,6 +125,7 @@ public class InterfaceEmitter extends JSSubEmitter implements
                 write(ASEmitterTokens.SEMICOLON);
             }
         }
+        fjs.getPackageFooterEmitter().emitClassInfo(node);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/face6d2e/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
index 1b4b729..1110448 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
@@ -21,6 +21,7 @@ package org.apache.flex.compiler.internal.codegen.js.jx;
 
 import org.apache.flex.compiler.codegen.ISubEmitter;
 import org.apache.flex.compiler.codegen.js.IJSEmitter;
+import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.IPackageDefinition;
 import org.apache.flex.compiler.definitions.ITypeDefinition;
 import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens;
@@ -53,84 +54,87 @@ public class PackageFooterEmitter extends JSSubEmitter implements
         if (type == null)
             return;
 
-        JSFlexJSDocEmitter doc = (JSFlexJSDocEmitter) getEmitter()
-                .getDocEmitter();
-
-        ITypeNode tnode = EmitterUtils.findTypeNode(definition.getNode());
-        if (tnode != null)
-        {
-            /*
-             * Metadata
-             * 
-             * @type {Object.<string, Array.<Object>>}
-             */
-            writeNewline();
-            writeNewline();
-            writeNewline();
-            doc.begin();
-            writeNewline(" * Metadata");
-            writeNewline(" *");
-            writeNewline(" * @type {Object.<string, Array.<Object>>}");
-            doc.end();
-
-            // a.B.prototype.AFJS_CLASS_INFO = {  };
-            write(getEmitter().formatQualifiedName(type.getQualifiedName()));
-            write(ASEmitterTokens.MEMBER_ACCESS);
-            write(JSEmitterTokens.PROTOTYPE);
-            write(ASEmitterTokens.MEMBER_ACCESS);
-            writeToken(JSFlexJSEmitterTokens.FLEXJS_CLASS_INFO);
-            writeToken(ASEmitterTokens.EQUAL);
-            writeToken(ASEmitterTokens.BLOCK_OPEN);
-
-            // names: [{ name: '', qName: '' }]
-            write(JSFlexJSEmitterTokens.NAMES);
-            writeToken(ASEmitterTokens.COLON);
-            write(ASEmitterTokens.SQUARE_OPEN);
-            writeToken(ASEmitterTokens.BLOCK_OPEN);
-            write(JSFlexJSEmitterTokens.NAME);
-            writeToken(ASEmitterTokens.COLON);
-            write(ASEmitterTokens.SINGLE_QUOTE);
-            write(tnode.getName());
-            write(ASEmitterTokens.SINGLE_QUOTE);
-            writeToken(ASEmitterTokens.COMMA);
-            write(JSFlexJSEmitterTokens.QNAME);
-            writeToken(ASEmitterTokens.COLON);
-            write(ASEmitterTokens.SINGLE_QUOTE);
-            write(getEmitter().formatQualifiedName(tnode.getQualifiedName()));
-            write(ASEmitterTokens.SINGLE_QUOTE);
-            write(ASEmitterTokens.BLOCK_CLOSE);
-            write(ASEmitterTokens.SQUARE_CLOSE);
-
-            IExpressionNode[] enodes;
-            if (tnode instanceof IClassNode)
-                enodes = ((IClassNode) tnode).getImplementedInterfaceNodes();
-            else
-                enodes = ((IInterfaceNode) tnode).getExtendedInterfaceNodes();
+    }
 
-            if (enodes.length > 0)
-            {
-                writeToken(ASEmitterTokens.COMMA);
+    public void emitClassInfo(ITypeNode tnode)
+    {
+        JSFlexJSDocEmitter doc = (JSFlexJSDocEmitter) getEmitter()
+        .getDocEmitter();
 
-                // interfaces: [a.IC, a.ID]
-                write(JSFlexJSEmitterTokens.INTERFACES);
-                writeToken(ASEmitterTokens.COLON);
-                write(ASEmitterTokens.SQUARE_OPEN);
-                int i = 0;
-                for (IExpressionNode enode : enodes)
-                {
-                    write(getEmitter().formatQualifiedName(
-                            enode.resolve(getProject()).getQualifiedName()));
-                    if (i < enodes.length - 1)
-                        writeToken(ASEmitterTokens.COMMA);
-                    i++;
-                }
-                write(ASEmitterTokens.SQUARE_CLOSE);
-            }
+	    /*
+	     * Metadata
+	     * 
+	     * @type {Object.<string, Array.<Object>>}
+	     */
+	    writeNewline();
+	    writeNewline();
+	    writeNewline();
+	    doc.begin();
+	    writeNewline(" * Metadata");
+	    writeNewline(" *");
+	    writeNewline(" * @type {Object.<string, Array.<Object>>}");
+	    doc.end();
+	
+	    // a.B.prototype.AFJS_CLASS_INFO = {  };
+	    write(getEmitter().formatQualifiedName(tnode.getQualifiedName()));
+	    write(ASEmitterTokens.MEMBER_ACCESS);
+	    write(JSEmitterTokens.PROTOTYPE);
+	    write(ASEmitterTokens.MEMBER_ACCESS);
+	    writeToken(JSFlexJSEmitterTokens.FLEXJS_CLASS_INFO);
+	    writeToken(ASEmitterTokens.EQUAL);
+	    writeToken(ASEmitterTokens.BLOCK_OPEN);
+	
+	    // names: [{ name: '', qName: '' }]
+	    write(JSFlexJSEmitterTokens.NAMES);
+	    writeToken(ASEmitterTokens.COLON);
+	    write(ASEmitterTokens.SQUARE_OPEN);
+	    writeToken(ASEmitterTokens.BLOCK_OPEN);
+	    write(JSFlexJSEmitterTokens.NAME);
+	    writeToken(ASEmitterTokens.COLON);
+	    write(ASEmitterTokens.SINGLE_QUOTE);
+	    write(tnode.getName());
+	    write(ASEmitterTokens.SINGLE_QUOTE);
+	    writeToken(ASEmitterTokens.COMMA);
+	    write(JSFlexJSEmitterTokens.QNAME);
+	    writeToken(ASEmitterTokens.COLON);
+	    write(ASEmitterTokens.SINGLE_QUOTE);
+	    write(getEmitter().formatQualifiedName(tnode.getQualifiedName()));
+	    write(ASEmitterTokens.SINGLE_QUOTE);
+	    write(ASEmitterTokens.BLOCK_CLOSE);
+	    write(ASEmitterTokens.SQUARE_CLOSE);
+	
+	    IExpressionNode[] enodes;
+	    if (tnode instanceof IClassNode)
+	        enodes = ((IClassNode) tnode).getImplementedInterfaceNodes();
+	    else
+	        enodes = ((IInterfaceNode) tnode).getExtendedInterfaceNodes();
+	
+	    if (enodes.length > 0)
+	    {
+	        writeToken(ASEmitterTokens.COMMA);
+	
+	        // interfaces: [a.IC, a.ID]
+	        write(JSFlexJSEmitterTokens.INTERFACES);
+	        writeToken(ASEmitterTokens.COLON);
+	        write(ASEmitterTokens.SQUARE_OPEN);
+	        int i = 0;
+	        for (IExpressionNode enode : enodes)
+	        {
+	        	IDefinition edef = enode.resolve(getProject());
+	        	if (edef == null)
+	        		continue;
+	            write(getEmitter().formatQualifiedName(
+	                    edef.getQualifiedName()));
+	            if (i < enodes.length - 1)
+	                writeToken(ASEmitterTokens.COMMA);
+	            i++;
+	        }
+	        write(ASEmitterTokens.SQUARE_CLOSE);
+	    }
+	
+	    write(ASEmitterTokens.SPACE);
+	    write(ASEmitterTokens.BLOCK_CLOSE);
+	    writeNewline(ASEmitterTokens.SEMICOLON);
 
-            write(ASEmitterTokens.SPACE);
-            write(ASEmitterTokens.BLOCK_CLOSE);
-            writeNewline(ASEmitterTokens.SEMICOLON);
-        }
     }
-
 }