This is an automated email from the ASF dual-hosted git repository.

joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git


The following commit(s) were added to refs/heads/develop by this push:
     new 9acc79a  MemberAccessEmitter: fix issue where accessing (getting) a 
member variable from a superclass with super would fail in JS (closes #162)
9acc79a is described below

commit 9acc79aa5639ae0960bf0154fb233bfb80de91da
Author: Josh Tynjala <[email protected]>
AuthorDate: Mon Apr 26 14:17:52 2021 -0700

    MemberAccessEmitter: fix issue where accessing (getting) a member variable 
from a superclass with super would fail in JS (closes #162)
    
    In the generated JS, super is replaced by this when accessing a variable. 
This fixes the error and brings parity with SWF output.
---
 .../codegen/js/jx/MemberAccessEmitter.java         | 70 ++++++++++++----------
 1 file changed, 39 insertions(+), 31 deletions(-)

diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
index 1a18c26..fdb18a3 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MemberAccessEmitter.java
@@ -575,37 +575,45 @@ public class MemberAccessEmitter extends JSSubEmitter 
implements
             {
                 getWalker().walk(node.getLeftOperandNode());
             }
-            else if (leftNode.getNodeID() == ASTNodeID.SuperID
-                    && (rightNode.getNodeID() == ASTNodeID.GetterID || 
(rightDef != null && rightDef instanceof AccessorDefinition)))
-            {
-                write(getEmitter().formatQualifiedName(
-                        
getEmitter().getModel().getCurrentClass().getQualifiedName()));
-                write(ASEmitterTokens.MEMBER_ACCESS);
-                write(JSGoogEmitterTokens.SUPERCLASS);
-                write(ASEmitterTokens.MEMBER_ACCESS);
-                write(JSRoyaleEmitterTokens.GETTER_PREFIX);
-                if (rightDef != null)
-                    write(rightDef.getBaseName());
-                else
-                    write(((GetterNode) rightNode).getName());
-                write(ASEmitterTokens.MEMBER_ACCESS);
-                write(JSEmitterTokens.APPLY);
-                write(ASEmitterTokens.PAREN_OPEN);
-                write(ASEmitterTokens.THIS);
-                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
+                       {
+                               if (rightNode.getNodeID() == ASTNodeID.GetterID 
|| (rightDef != null && rightDef instanceof AccessorDefinition))
+                               {
+                                       write(getEmitter().formatQualifiedName(
+                                                       
getEmitter().getModel().getCurrentClass().getQualifiedName()));
+                                       write(ASEmitterTokens.MEMBER_ACCESS);
+                                       write(JSGoogEmitterTokens.SUPERCLASS);
+                                       write(ASEmitterTokens.MEMBER_ACCESS);
+                                       
write(JSRoyaleEmitterTokens.GETTER_PREFIX);
+                                       if (rightDef != null)
+                                               write(rightDef.getBaseName());
+                                       else
+                                               write(((GetterNode) 
rightNode).getName());
+                                       write(ASEmitterTokens.MEMBER_ACCESS);
+                                       write(JSEmitterTokens.APPLY);
+                                       write(ASEmitterTokens.PAREN_OPEN);
+                                       write(ASEmitterTokens.THIS);
+                                       write(ASEmitterTokens.PAREN_CLOSE);
+                                       return false;
+                               }
+                               else if (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 if (rightDef != null && rightDef 
instanceof VariableDefinition)
+                               {
+                                       //for variables, replace super with this
+                                       startMapping(leftNode);
+                                       write(ASEmitterTokens.THIS);
+                                       endMapping(leftNode);
+                               }
+                       }
         }
         else
         {

Reply via email to