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 2016/10/07 04:22:08 UTC

[1/2] git commit: [flex-falcon] [refs/heads/develop] - static accessors are now accessed via class['someStaticProperty'] instead of class.someStaticProperty

Repository: flex-falcon
Updated Branches:
  refs/heads/develop 386112843 -> 73fd82c7c


static accessors are now accessed via class['someStaticProperty'] instead of class.someStaticProperty


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

Branch: refs/heads/develop
Commit: ecd8e1cf2d0247277186433f064e636c8266eb45
Parents: 3861128
Author: Alex Harui <ah...@apache.org>
Authored: Wed Oct 5 10:55:55 2016 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Oct 6 21:22:02 2016 -0700

----------------------------------------------------------------------
 .../internal/codegen/js/jx/AccessorEmitter.java  |  6 +-----
 .../internal/codegen/js/jx/BindableEmitter.java  | 19 +++----------------
 .../codegen/js/jx/IdentifierEmitter.java         | 13 +++++++++++--
 .../js/flexjs/TestFlexJSAccessorMembers.java     |  4 ++--
 .../codegen/js/flexjs/TestFlexJSExpressions.java | 10 +++++-----
 5 files changed, 22 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ecd8e1cf/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java
index de8e86b..0b82abb 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/AccessorEmitter.java
@@ -438,11 +438,7 @@ public class AccessorEmitter extends JSSubEmitter implements
                         propName);
                 IGetterNode getterNode = p.getter;
                 ISetterNode setterNode = p.setter;
-                // @expose is supposed to be deprecated, so this isn't ideal,
-                // but @export and/or @nocollapse were not working in a release
-                // build with ADVANCED_OPTIMIZATIONS, so I don't know what else
-                // to do. maybe it's a bug in closure compiler... -JT
-                writeNewline("/** @expose */");
+                writeNewline("/** @export */");
                 write(propName);
                 write(ASEmitterTokens.COLON);
                 write(ASEmitterTokens.SPACE);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ecd8e1cf/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java
index 8625733..8f26835 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/BindableEmitter.java
@@ -279,11 +279,7 @@ public class BindableEmitter extends JSSubEmitter implements
         // export above did not work in the release build for the static getter/setter bindables,
         // solution below:
         //Commented by JT, in AccessorEmitter:
-        // @expose is supposed to be deprecated, so this isn't ideal,
-        // but @export and/or @nocollapse were not working in a release
-        // build with ADVANCED_OPTIMIZATIONS, so I don't know what else
-        // to do. maybe it's a bug in closure compiler... -JT
-        writeNewline("/** @expose");
+        writeNewline("/** @export");
         writeNewline("  * @type {"+DISPATCHER_CLASS_QNAME+"} */");
         write(STATIC_DISPATCHER_GETTER);
         write(ASEmitterTokens.COLON);
@@ -361,20 +357,11 @@ public class BindableEmitter extends JSSubEmitter implements
         String qname = fjs.formatQualifiedName(cdef.getQualifiedName());
         // 'PropName': {
 
-        //writeNewline("/** @export */");
-        // export above did not work in the release build for the static getter/setter bindables,
-        // solution below:
-        //Commented by JT, in AccessorEmitter:
-        // @expose is supposed to be deprecated, so this isn't ideal,
-        // but @export and/or @nocollapse were not working in a release
-        // build with ADVANCED_OPTIMIZATIONS, so I don't know what else
-        // to do. maybe it's a bug in closure compiler... -JT
-
         if (info.namespace != "public") {
-            writeNewline("/** @expose");
+            writeNewline("/** @export");
             writeNewline("  * @private");
         } else {
-            writeNewline("/** @expose");
+            writeNewline("/** @export");
         }
 
         writeNewline("  * @type {"+convertASTypeToJS(info.type)+"} */");

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ecd8e1cf/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java
index 89f0c00..7573db4 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/IdentifierEmitter.java
@@ -76,11 +76,12 @@ public class IdentifierEmitter extends JSSubEmitter implements
         boolean emitName = true;
     	JSFlexJSEmitter fjs = (JSFlexJSEmitter)getEmitter();
     	boolean isCustomNamespace = false;
+    	boolean isStatic = nodeDef != null && nodeDef.isStatic();
         if (nodeDef instanceof FunctionDefinition &&
           	  fjs.isCustomNamespace((FunctionDefinition)nodeDef))
           	isCustomNamespace = true;
 
-        if (nodeDef != null && nodeDef.isStatic())
+        if (isStatic)
         {
             String sname = nodeDef.getParent().getQualifiedName();
             if (sname.equals("Array"))
@@ -175,7 +176,7 @@ public class IdentifierEmitter extends JSSubEmitter implements
                     endMapping(prevSibling);
                     startMapping(parentNode, prevSibling);
                 }
-                if (!isCustomNamespace)
+                if (!isCustomNamespace && (!(identifierIsAccessorFunction && isStatic)))
                 	write(ASEmitterTokens.MEMBER_ACCESS);
                 endMapping(parentNode);
             }
@@ -293,6 +294,10 @@ public class IdentifierEmitter extends JSSubEmitter implements
                     	String ns = ((FunctionDefinition)nodeDef).getNamespaceReference().resolveAETNamespace(getProject()).getName();
                     	write("[\"" + ns + "::" + qname + "\"]");
                     }
+                    else if (identifierIsAccessorFunction && isStatic)
+                    {
+                    	write("[\"" +node.getName() + "\"]");                    	
+                    }
                 	else
                 	{
                 		write(node.getName());
@@ -307,6 +312,10 @@ public class IdentifierEmitter extends JSSubEmitter implements
                 	String ns = ((FunctionDefinition)nodeDef).getNamespaceReference().resolveAETNamespace(getProject()).getName();
                 	write("[\"" + ns + "::" + qname + "\"]");
                 }
+                else if (identifierIsAccessorFunction && isStatic)
+                {
+                	write("[\"" + qname + "\"]");                    	
+                }
                 else
                     write(qname);
                 endMapping(node);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ecd8e1cf/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java
index f4b0513..e7ad931 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSAccessorMembers.java
@@ -98,7 +98,7 @@ public class TestFlexJSAccessorMembers extends TestGoogAccessorMembers
         asBlockWalker.visitClass(node);
         assertOut("/**\n * @constructor\n */\nFalconTest_A = function() {\n};\n\n\n" +
 				"FalconTest_A.get__foo = function() {\n  return -1;\n};\n\n\n" +
-        		"Object.defineProperties(FalconTest_A, /** @lends {FalconTest_A} */ {\n/** @expose */\nfoo: {\nget: FalconTest_A.get__foo}}\n);");
+        		"Object.defineProperties(FalconTest_A, /** @lends {FalconTest_A} */ {\n/** @export */\nfoo: {\nget: FalconTest_A.get__foo}}\n);");
     }
 
     @Override
@@ -158,7 +158,7 @@ public class TestFlexJSAccessorMembers extends TestGoogAccessorMembers
         asBlockWalker.visitClass(node);
         assertOut("/**\n * @constructor\n */\nFalconTest_A = function() {\n};\n\n\n" +
 				"FalconTest_A.set__foo = function(value) {\n};\n\n\n" +
-        		"Object.defineProperties(FalconTest_A, /** @lends {FalconTest_A} */ {\n/** @expose */\nfoo: {\nset: FalconTest_A.set__foo}}\n);");
+        		"Object.defineProperties(FalconTest_A, /** @lends {FalconTest_A} */ {\n/** @export */\nfoo: {\nset: FalconTest_A.set__foo}}\n);");
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/ecd8e1cf/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
index def28f7..60fdb20 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSExpressions.java
@@ -465,7 +465,7 @@ public class TestFlexJSExpressions extends TestGoogExpressions
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
         asBlockWalker.visitBinaryOperator(bnode);
-        assertOut("foo.bar.B.b = 1");
+        assertOut("foo.bar.B[\"b\"] = 1");
     }
 
     @Test
@@ -477,7 +477,7 @@ public class TestFlexJSExpressions extends TestGoogExpressions
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
         asBlockWalker.visitBinaryOperator(bnode);
-        assertOut("foo.bar.B.b = 1");
+        assertOut("foo.bar.B[\"b\"] = 1");
     }
 
     @Test
@@ -489,7 +489,7 @@ public class TestFlexJSExpressions extends TestGoogExpressions
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
         asBlockWalker.visitBinaryOperator(bnode);
-        assertOut("foo.bar.B.d.b = 1");
+        assertOut("foo.bar.B[\"d\"].b = 1");
     }
 
     @Test
@@ -513,7 +513,7 @@ public class TestFlexJSExpressions extends TestGoogExpressions
 
         ((JSFlexJSEmitter)asEmitter).getModel().setCurrentClass(def);
         asBlockWalker.visitBinaryOperator(bnode);
-        assertOut("foo.bar.B.d.b = 1");
+        assertOut("foo.bar.B[\"d\"].b = 1");
     }
 
     @Test
@@ -525,7 +525,7 @@ public class TestFlexJSExpressions extends TestGoogExpressions
         IBinaryOperatorNode bnode = (IBinaryOperatorNode) findFirstDescendantOfType(
                 node, IBinaryOperatorNode.class);
         asBlockWalker.visitBinaryOperator(bnode);
-        assertOut("foo.bar.B.b = foo.bar.B.b + 1");
+        assertOut("foo.bar.B[\"b\"] = foo.bar.B[\"b\"] + 1");
     }
 
     @Test


[2/2] git commit: [flex-falcon] [refs/heads/develop] - handle complex static initializers especially when the initializer is defined after the variable

Posted by ah...@apache.org.
handle complex static initializers especially when the initializer is defined after the variable


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

Branch: refs/heads/develop
Commit: 73fd82c7ce826857fd30d4201459c64d856ff7c7
Parents: ecd8e1c
Author: Alex Harui <ah...@apache.org>
Authored: Thu Oct 6 21:21:51 2016 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Oct 6 21:22:03 2016 -0700

----------------------------------------------------------------------
 .../codegen/js/flexjs/JSFlexJSEmitter.java      |  5 ++
 .../internal/codegen/js/jx/ClassEmitter.java    | 19 +++++
 .../internal/codegen/js/jx/FieldEmitter.java    | 78 +++++++++++++++++---
 .../internal/codegen/js/utils/EmitterUtils.java | 12 +++
 .../codegen/js/flexjs/TestFlexJSClass.java      |  9 +++
 .../js/flexjs/TestFlexJSFieldMembers.java       |  2 +-
 6 files changed, 114 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/73fd82c7/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
index 443bbbd..a74b346 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/flexjs/JSFlexJSEmitter.java
@@ -293,6 +293,11 @@ public class JSFlexJSEmitter extends JSGoogEmitter implements IJSFlexJSEmitter
         return bindableEmitter;
     }
 
+    public FieldEmitter getFieldEmitter()
+    {
+        return fieldEmitter;
+    }
+
     public ClassEmitter getClassEmitter()
     {
         return classEmitter;

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/73fd82c7/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java
index fe0bc7e..3b28e5f 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/ClassEmitter.java
@@ -146,6 +146,25 @@ public class ClassEmitter extends JSSubEmitter implements
         fjs.getBindableEmitter().emit(definition);
         fjs.getAccessorEmitter().emit(definition);
         
+        if (fjs.getFieldEmitter().hasComplexStaticInitializers)
+        {
+            writeNewline();
+            
+	        for (IDefinitionNode dnode : dnodes)
+	        {
+	            if (dnode.getNodeID() == ASTNodeID.VariableID)
+	            {
+	                writeNewline();
+	                fjs.getFieldEmitter().emitFieldInitializer((IVariableNode) dnode);
+	            }
+	            else if (dnode.getNodeID() == ASTNodeID.BindableVariableID)
+	            {
+	                writeNewline();
+	                fjs.getFieldEmitter().emitFieldInitializer((IVariableNode) dnode);
+	            }
+	        }
+        }
+        
         fjs.getPackageFooterEmitter().emitClassInfo(node);
 
         getEmitter().popSourceMapName();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/73fd82c7/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FieldEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FieldEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FieldEmitter.java
index 1906b21..23459c4 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FieldEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/FieldEmitter.java
@@ -51,6 +51,8 @@ public class FieldEmitter extends JSSubEmitter implements
         super(emitter);
     }
 
+    public boolean hasComplexStaticInitializers = false;
+    
     @Override
     public void emit(IVariableNode node)
     {
@@ -71,13 +73,15 @@ public class FieldEmitter extends JSSubEmitter implements
 
         IDefinition ndef = node.getDefinition();
 
+        String className = null;
         String root = "";
         IVariableDefinition.VariableClassification classification = node.getVariableClassification();
         boolean isPackageOrFileMember = classification == IVariableDefinition.VariableClassification.PACKAGE_MEMBER ||
                 classification == IVariableDefinition.VariableClassification.FILE_MEMBER;
         if (isPackageOrFileMember)
         {
-            write(getEmitter().formatQualifiedName(node.getQualifiedName()));
+        	className = getEmitter().formatQualifiedName(node.getQualifiedName());
+            write(className);
         }
         else
         {
@@ -92,7 +96,8 @@ public class FieldEmitter extends JSSubEmitter implements
                 definition = ndef.getContainingScope().getDefinition();
 
             startMapping(node.getNameExpressionNode());
-            write(getEmitter().formatQualifiedName(definition.getQualifiedName())
+            className = getEmitter().formatQualifiedName(definition.getQualifiedName());
+            write(className
                     + ASEmitterTokens.MEMBER_ACCESS.getToken() + root);
             write(node.getName());
             endMapping(node.getNameExpressionNode());
@@ -105,15 +110,24 @@ public class FieldEmitter extends JSSubEmitter implements
             write("_");
         }
         IExpressionNode vnode = node.getAssignedValueNode();
-        if (vnode != null &&
-                (ndef.isStatic() || EmitterUtils.isScalar(vnode) || isPackageOrFileMember))
+        if (vnode != null)
         {
-            startMapping(node);
-            write(ASEmitterTokens.SPACE);
-            writeToken(ASEmitterTokens.EQUAL);
-            endMapping(node);
-            getEmitter().getWalker().walk(vnode);
-        }
+            String vnodeString = getEmitter().stringifyNode(vnode);
+        	if ((ndef.isStatic() && !EmitterUtils.needsStaticInitializer(vnodeString, className)) || 
+        			(!ndef.isStatic() && EmitterUtils.isScalar(vnode)) ||
+        			isPackageOrFileMember)
+	        {
+	            startMapping(node);
+	            write(ASEmitterTokens.SPACE);
+	            writeToken(ASEmitterTokens.EQUAL);
+	            endMapping(node);
+	            write(vnodeString);
+	        }
+	        else if (ndef.isStatic() && EmitterUtils.needsStaticInitializer(vnodeString, className))
+	        {
+	        	hasComplexStaticInitializers = true;
+	        }
+        }        
         if (vnode == null && def != null)
         {
             String defName = def.getQualifiedName();
@@ -157,4 +171,48 @@ public class FieldEmitter extends JSSubEmitter implements
         }
     }
 
+    public void emitFieldInitializer(IVariableNode node)
+    {
+        IDefinition definition = EmitterUtils.getClassDefinition(node);
+
+        IDefinition def = null;
+        IExpressionNode enode = node.getVariableTypeNode();//getAssignedValueNode();
+        if (enode != null)
+        {
+            def = enode.resolveType(getProject());
+        }
+
+        IDefinition ndef = node.getDefinition();
+        String className = null;
+
+        IVariableDefinition.VariableClassification classification = node.getVariableClassification();
+        boolean isPackageOrFileMember = classification == IVariableDefinition.VariableClassification.PACKAGE_MEMBER ||
+                classification == IVariableDefinition.VariableClassification.FILE_MEMBER;
+        IExpressionNode vnode = node.getAssignedValueNode();
+        if (vnode != null)
+        {
+            String vnodeString = getEmitter().stringifyNode(vnode);
+            if (definition == null)
+                definition = ndef.getContainingScope().getDefinition();
+            className = getEmitter().formatQualifiedName(definition.getQualifiedName());
+        	if (ndef.isStatic() && EmitterUtils.needsStaticInitializer(vnodeString, className) && !isPackageOrFileMember)
+	        {
+                write(className
+                        + ASEmitterTokens.MEMBER_ACCESS.getToken());
+                write(node.getName());
+	
+	            if (node.getNodeID() == ASTNodeID.BindableVariableID)
+	            {
+	                // add an underscore to convert this var to be the
+	                // backing var for the get/set pair that will be generated later.
+	                write("_");
+	            }
+	            write(ASEmitterTokens.SPACE);
+	            writeToken(ASEmitterTokens.EQUAL);
+	            write(vnodeString);
+	            write(ASEmitterTokens.SEMICOLON);
+	
+	        }
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/73fd82c7/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java
index 9ca2829..635c6c0 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/utils/EmitterUtils.java
@@ -464,6 +464,18 @@ public class EmitterUtils
         return false;
     }
 
+    // return true if the node is an expression that may not work
+    // as the initial value of a static var at
+    // static initialization time.  Such as a function call to
+    // another static method in the class.
+    // Non-static initializers have different rules: even simple object
+    // and arrays need to be created for each instance, but for statics
+    // simple objects and arras are ok.
+    public static boolean needsStaticInitializer(String node, String className)
+    {
+    	return node.contains(className);
+    }
+
     public static IContainerNode insertArgumentsBefore(IContainerNode argumentsNode, IASNode... nodes)
     {
         int originalLength = argumentsNode.getChildCount();

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/73fd82c7/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java
index f03414d..8b91070 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSClass.java
@@ -224,6 +224,15 @@ public class TestFlexJSClass extends TestGoogClass
         assertOut("/**\n * @constructor\n */\norg.apache.flex.A = function() {\n};\n\n\n/**\n * @export\n * @type {Object}\n */\norg.apache.flex.A.prototype.a;\n\n\n/**\n * @protected\n * @type {string}\n */\norg.apache.flex.A.prototype.b;\n\n\n/**\n * @private\n * @type {number}\n */\norg.apache.flex.A.prototype.c = 0;\n\n\n/**\n * @export\n * @type {number}\n */\norg.apache.flex.A.prototype.d = 0;\n\n\n/**\n * @export\n * @type {number}\n */\norg.apache.flex.A.prototype.e;");
     }
 
+    @Test
+    public void testFieldsWithStaticInitializers()
+    {
+        IClassNode node = getClassNode("public class A {public static var a:int = 10;public static var b:String = initStatic(); "
+                + "private static function initStatic():String { return \"foo\"; }}");
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\norg.apache.flex.A = function() {\n};\n\n\n/**\n * @export\n * @type {number}\n */\norg.apache.flex.A.a = 10;\n\n\n/**\n * @export\n * @type {string}\n */\norg.apache.flex.A.b;\n\n\n/**\n * @private\n * @return {string}\n */\norg.apache.flex.A.initStatic = function() {\n  return \"foo\";\n};\n\n\norg.apache.flex.A.b = org.apache.flex.A.initStatic();");
+    }
+    
     @Override
     @Test
     public void testConstants()

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/73fd82c7/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java
index cee8429..dddfab6 100644
--- a/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java
+++ b/compiler-jx/src/test/java/org/apache/flex/compiler/internal/codegen/js/flexjs/TestFlexJSFieldMembers.java
@@ -185,7 +185,7 @@ public class TestFlexJSFieldMembers extends TestGoogFieldMembers
     	IClassNode node = (IClassNode) getNode("import flash.utils.flash_proxy;use namespace flash_proxy;public static var foo:Object = initFoo(); flash_proxy static function initFoo():Object { return null; }",
         		IClassNode.class, WRAP_LEVEL_CLASS);
         asBlockWalker.visitClass(node);
-        assertOut("/**\n * @constructor\n */\nFalconTest_A = function() {\n};\n\n\n/**\n * @export\n * @type {Object}\n */\nFalconTest_A.foo = FalconTest_A[\"http://www.adobe.com/2006/actionscript/flash/proxy::initFoo\"]();\n\n\n/**\n * @export\n * @return {Object}\n */\nFalconTest_A[\"http://www.adobe.com/2006/actionscript/flash/proxy::initFoo\"] = function() {\n  return null;\n};");
+        assertOut("/**\n * @constructor\n */\nFalconTest_A = function() {\n};\n\n\n/**\n * @export\n * @type {Object}\n */\nFalconTest_A.foo;\n\n\n/**\n * @export\n * @return {Object}\n */\nFalconTest_A[\"http://www.adobe.com/2006/actionscript/flash/proxy::initFoo\"] = function() {\n  return null;\n};\n\nFalconTest_A.foo = FalconTest_A[\"http://www.adobe.com/2006/actionscript/flash/proxy::initFoo\"]();");
     }
     
     @Test