You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2016/10/21 15:16:48 UTC

[10/44] git commit: [flex-falcon] [refs/heads/feature-autobuild/maven-archetypes] - handle complex static initializers especially when the initializer is defined after the variable

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/feature-autobuild/maven-archetypes
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