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 2017/03/08 06:34:41 UTC

[2/2] git commit: [flex-falcon] [refs/heads/develop] - handle a few more cases with super

handle a few more cases with super


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

Branch: refs/heads/develop
Commit: 85a170101d19dcfe51a177fdb21e34bc9bc43c94
Parents: fde0386
Author: Alex Harui <ah...@apache.org>
Authored: Tue Mar 7 22:34:21 2017 -0800
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Mar 7 22:34:21 2017 -0800

----------------------------------------------------------------------
 .../internal/codegen/js/goog/JSGoogEmitter.java |  3 +-
 .../codegen/js/jx/MemberAccessEmitter.java      | 16 ++++++-
 .../js/flexjs/TestFlexJSExpressions.java        | 45 ++++++++++++++++++++
 3 files changed, 62 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/85a17010/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java
index 8486ab0..98a4015 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/goog/JSGoogEmitter.java
@@ -909,7 +909,8 @@ public class JSGoogEmitter extends JSEmitter implements IJSGoogEmitter
             if (definition instanceof FunctionDefinition &&
                     !((FunctionDefinition)definition).isStatic() &&
                     (!(definition instanceof AccessorDefinition)) &&
-                    node instanceof MemberAccessExpressionNode)
+                    node instanceof MemberAccessExpressionNode &&
+                    ((MemberAccessExpressionNode)node).getLeftOperandNode().getNodeID() != ASTNodeID.SuperID)
             {
                 emitClosureStart();
                 getWalker().walk(node);

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/85a17010/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
----------------------------------------------------------------------
diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index 0c37490..2f5f278 100644
--- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -269,7 +269,10 @@ public class MemberAccessEmitter extends JSSubEmitter implements
         {
         	write(ASEmitterTokens.COMMA);
         	write(ASEmitterTokens.SPACE);
-        	writeLeftSide(node, leftNode, rightNode);
+        	if (leftNode.getNodeID() == ASTNodeID.SuperID)
+        		write(ASEmitterTokens.THIS);
+        	else
+        		writeLeftSide(node, leftNode, rightNode);
         	getEmitter().emitClosureEnd(node, def);
         }
         
@@ -311,6 +314,17 @@ public class MemberAccessEmitter extends JSSubEmitter implements
                 write(ASEmitterTokens.PAREN_CLOSE);
                 return false;
             }
+            else if (leftNode.getNodeID() == ASTNodeID.SuperID
+                    && (rightDef != null && rightDef instanceof FunctionDefinition))
+            {
+                write(getEmitter().formatQualifiedName(
+                        getEmitter().getModel().getCurrentClass().getQualifiedName()));
+                write(ASEmitterTokens.MEMBER_ACCESS);
+                write(JSGoogEmitterTokens.SUPERCLASS);
+                write(ASEmitterTokens.MEMBER_ACCESS);
+                write(rightDef.getBaseName());
+                return false;
+            }
         }
         else
         {

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/85a17010/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 3331fc6..17c9940 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
@@ -102,6 +102,51 @@ public class TestFlexJSExpressions extends TestGoogExpressions
         assertOut("/**\n */\nFalconTest_A.prototype[\"http://www.adobe.com/2006/actionscript/flash/proxy::foo\"] = function() {\n  if (a)\n    FalconTest_A.superClass_['http://www.adobe.com/2006/actionscript/flash/proxy::setProperty'].apply(this, [ a, b] );\n}");
     }
 
+    @Test
+    public void testVisitLanguageIdentifierNode_SuperMethodAsFunctionReference()
+    {
+        IFileNode node = (IFileNode)getNode("package { public class FalconTest_A extends Base { override public function foo() {var f:Function = super.foo;} } }\n" +
+        		"class Base { public function foo(){} }", IFileNode.class, 0, false);
+        IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType(
+                node, IFunctionNode.class);
+        IClassNode classnode = (IClassNode) findFirstDescendantOfType(
+                node, IClassNode.class);
+        IClassDefinition def = classnode.getDefinition();
+        ((JSFlexJSEmitter)asEmitter).getModel().setCurrentClass(def);
+        asBlockWalker.visitFunction(fnode);
+        assertOut("/**\n * @export\n * @override\n */\nFalconTest_A.prototype.foo = function() {\n  var /** @type {Function} */ f = org.apache.flex.utils.Language.closure(FalconTest_A.superClass_.foo, this, 'foo');\n}");
+    }
+    
+    @Test
+    public void testVisitLanguageIdentifierNode_SuperMethodAsVarFunctionReference()
+    {
+    	IFileNode node = (IFileNode)getNode("package { public class FalconTest_A extends Base { override public function foo() {var f:Function; f = super.foo;} } }\n" +
+        		"class Base { public function foo(){} }", IFileNode.class, 0, false);
+        IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType(
+                node, IFunctionNode.class);
+        IClassNode classnode = (IClassNode) findFirstDescendantOfType(
+                node, IClassNode.class);
+        IClassDefinition def = classnode.getDefinition();
+        ((JSFlexJSEmitter)asEmitter).getModel().setCurrentClass(def);
+        asBlockWalker.visitFunction(fnode);
+        assertOut("/**\n * @export\n * @override\n */\nFalconTest_A.prototype.foo = function() {\n  var /** @type {Function} */ f;\n  f = org.apache.flex.utils.Language.closure(FalconTest_A.superClass_.foo, this, 'foo');\n}");
+    }
+    
+    @Test
+    public void testVisitLanguageIdentifierNode_SuperMethodInApply()
+    {
+    	IFileNode node = (IFileNode)getNode("package { public class FalconTest_A extends Base { override public function foo() {super.foo.apply(this, [a, b, c]);} } }\n" +
+        		"class Base { public function foo(){} }", IFileNode.class, 0, false);
+        IFunctionNode fnode = (IFunctionNode) findFirstDescendantOfType(
+                node, IFunctionNode.class);
+        IClassNode classnode = (IClassNode) findFirstDescendantOfType(
+                node, IClassNode.class);
+        IClassDefinition def = classnode.getDefinition();
+        ((JSFlexJSEmitter)asEmitter).getModel().setCurrentClass(def);
+        asBlockWalker.visitFunction(fnode);
+        assertOut("/**\n * @export\n * @override\n */\nFalconTest_A.prototype.foo = function() {\n  FalconTest_A.superClass_.foo.apply(this, [a, b, c]);\n}");
+    }
+    
     //----------------------------------
     // Primary expression keywords
     //----------------------------------