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/master
Commit: 85a170101d19dcfe51a177fdb21e34bc9bc43c94
Parents: fde0386
Author: Alex Harui <[email protected]>
Authored: Tue Mar 7 22:34:21 2017 -0800
Committer: Alex Harui <[email protected]>
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
     //----------------------------------

Reply via email to