You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2023/06/08 22:08:54 UTC

[royale-compiler] branch develop updated: PackageFooterEmitter: fix null exception from getReturnTypeNode() on getter function node

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 bb927160e PackageFooterEmitter: fix null exception from getReturnTypeNode() on getter function node
bb927160e is described below

commit bb927160e17d033ebb227ea1cd23cf3ae2c7b2f7
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Thu Jun 8 15:08:33 2023 -0700

    PackageFooterEmitter: fix null exception from getReturnTypeNode() on getter function node
    
    Uses same approach for getters as regular functions to first check that the return type string isn't empty or void
    
    Also, passes to formatQualifiedName() for consistency
---
 .../codegen/js/jx/PackageFooterEmitter.java        |  6 +++-
 .../internal/codegen/as/TestAccessorMembers.java   | 24 +++++++++++++
 .../codegen/js/goog/TestGoogAccessorMembers.java   | 30 +++++++++++++++++
 .../js/royale/TestRoyaleAccessorMembers.java       | 39 ++++++++++++++++++++++
 4 files changed, 98 insertions(+), 1 deletion(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
index 64edb1331..6d1f5ca78 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/PackageFooterEmitter.java
@@ -426,7 +426,11 @@ public class PackageFooterEmitter extends JSSubEmitter implements
 					data.customNS = altNS;
                 	if (!accessorData.contains(data)) accessorData.add(data);
             	    if (dnode.getNodeID() == ASTNodeID.GetterID) {
-						data.type = fnNode.getReturnTypeNode().resolveType(getProject()).getQualifiedName();
+						String qualifiedTypeName =	fnNode.getReturnType();
+						if (!(qualifiedTypeName.equals("") || qualifiedTypeName.equals("void"))) {
+								qualifiedTypeName = fnNode.getReturnTypeNode().resolveType(getProject()).getQualifiedName();
+						}
+						data.type = fjs.formatQualifiedName(qualifiedTypeName, true);
 						if (data.access == null) {
 							data.access = "readonly";
 						} else data.access = "readwrite";
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/as/TestAccessorMembers.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/as/TestAccessorMembers.java
index 81749fc6e..a243f4515 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/as/TestAccessorMembers.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/as/TestAccessorMembers.java
@@ -67,6 +67,22 @@ public class TestAccessorMembers extends ASTestBase
         assertOut("public static function get foo():int {\n\treturn -1;\n}");
     }
 
+    @Test
+    public void testGetAccessor_withoutReturnType()
+    {
+        IAccessorNode node = getAccessor("function get foo(){return -1;}");
+        asBlockWalker.visitFunction(node);
+        assertOut("function get foo() {\n\treturn -1;\n}");
+    }
+
+    @Test
+    public void testGetAccessor_withNamespace_withoutReturnType()
+    {
+        IAccessorNode node = getAccessor("public function get foo(){return -1;}");
+        asBlockWalker.visitFunction(node);
+        assertOut("public function get foo() {\n\treturn -1;\n}");
+    }
+
     @Test
     public void testSetAccessor()
     {
@@ -98,4 +114,12 @@ public class TestAccessorMembers extends ASTestBase
         asBlockWalker.visitFunction(node);
         assertOut("public static function set foo(value:int):void {\n}");
     }
+
+    @Test
+    public void testSetAccessor_withoutParameterType()
+    {
+        IAccessorNode node = getAccessor("function set foo(value):void{}");
+        asBlockWalker.visitFunction(node);
+        assertOut("function set foo(value:*):void {\n}");
+    }
 }
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
index 69ae550d0..00b1fb135 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/goog/TestGoogAccessorMembers.java
@@ -85,6 +85,26 @@ public class TestGoogAccessorMembers extends TestAccessorMembers
         assertOut("Object.defineProperty(\n\tRoyaleTest_A, \n\t'foo', \n\t{get:function() {\n\t\treturn -1;\n\t}, configurable:true}\n)");
     }
 
+    @Override
+    @Test
+    public void testGetAccessor_withoutReturnType()
+    {
+        IGetterNode node = (IGetterNode) getAccessor("function get foo(){}");
+        asBlockWalker.visitGetter(node);
+        assertOut("Object.defineProperty(\n\tRoyaleTest_A.prototype, \n\t'foo', "
+                + "\n\t{get:function() {\n\t}, configurable:true}\n)");
+    }
+
+    @Override
+    @Test
+    public void testGetAccessor_withNamespace_withoutReturnType()
+    {
+        IGetterNode node = (IGetterNode) getAccessor("public function get foo(){}");
+        asBlockWalker.visitGetter(node);
+        assertOut("Object.defineProperty(\n\tRoyaleTest_A.prototype, \n\t'foo', "
+                + "\n\t{get:function() {\n\t}, configurable:true}\n)");
+    }
+
     @Override
     @Test
     public void testSetAccessor()
@@ -133,6 +153,16 @@ public class TestGoogAccessorMembers extends TestAccessorMembers
         assertOut("Object.defineProperty(\n\tRoyaleTest_A, \n\t'foo', \n\t{set:function(value) {\n\t}, configurable:true}\n)");
     }
 
+    @Override
+    @Test
+    public void testSetAccessor_withoutParameterType()
+    {
+        ISetterNode node = (ISetterNode) getAccessor("function set foo(value):void{}");
+        asBlockWalker.visitSetter(node);
+        assertOut("Object.defineProperty(\n\tRoyaleTest_A.prototype, \n\t'foo', \n\t{set:function(value)"
+                + " {\n\t}, configurable:true}\n)");
+    }
+
     @Override
     protected IBackend createBackend()
     {
diff --git a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleAccessorMembers.java b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleAccessorMembers.java
index 6aaac7394..1910d01d0 100644
--- a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleAccessorMembers.java
+++ b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/js/royale/TestRoyaleAccessorMembers.java
@@ -104,6 +104,32 @@ public class TestRoyaleAccessorMembers extends TestGoogAccessorMembers
           "RoyaleTest_A.get__foo = function() {\n  return -1;\n};\n\n\n" +
           "Object.defineProperties(RoyaleTest_A, /** @lends {RoyaleTest_A} */ {\n/**\n * @type {number}\n */\nfoo: {\nget: RoyaleTest_A.get__foo}}\n);");
     }
+    
+    @Override
+    @Test
+    public void testGetAccessor_withoutReturnType()
+    {
+        IClassNode node = (IClassNode) getNode("function get foo(){}",
+        		IClassNode.class, WRAP_LEVEL_CLASS);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() {\n};\n\n\n" +
+        "/**\n * @nocollapse\n * @type {*}\n */\nRoyaleTest_A.prototype.foo;\n\n\n" + 
+				"RoyaleTest_A.prototype.get__foo = function() {\n};\n\n\n" +
+        		"Object.defineProperties(RoyaleTest_A.prototype, /** @lends {RoyaleTest_A.prototype} */ {\n/**\n * @type {*}\n */\nfoo: {\nget: RoyaleTest_A.prototype.get__foo}}\n);");
+    }
+    
+    @Override
+    @Test
+    public void testGetAccessor_withNamespace_withoutReturnType()
+    {
+    	IClassNode node = (IClassNode) getNode("public function get foo(){return -1;}",
+        		IClassNode.class, WRAP_LEVEL_CLASS);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() {\n};\n\n\n" +
+        "/**\n * @nocollapse\n * @export\n * @type {*}\n */\nRoyaleTest_A.prototype.foo;\n\n\n" + 
+				"RoyaleTest_A.prototype.get__foo = function() {\n  return -1;\n};\n\n\n" +
+        		"Object.defineProperties(RoyaleTest_A.prototype, /** @lends {RoyaleTest_A.prototype} */ {\n/**\n * @type {*}\n */\nfoo: {\nget: RoyaleTest_A.prototype.get__foo}}\n);");
+    }
 
     @Override
     @Test
@@ -201,6 +227,19 @@ public class TestRoyaleAccessorMembers extends TestGoogAccessorMembers
         "B.prototype.set__foo = function(value) {\n  var /** @type {number} */ z = (function($value){B.superClass_.set__foo.apply(this, [$value]);return $value;}).apply(this, [value]);\n};\n\n\n" +
         		"Object.defineProperties(B.prototype, /** @lends {B.prototype} */ {\n/**\n * @type {number}\n */\nfoo: {\nget: A.prototype.get__foo,\nset: B.prototype.set__foo}}\n);");
     }
+
+    @Override
+    @Test
+    public void testSetAccessor_withoutParameterType()
+    {
+    	IClassNode node = (IClassNode) getNode("function set foo(value):void{}",
+        		IClassNode.class, WRAP_LEVEL_CLASS);
+        asBlockWalker.visitClass(node);
+        assertOut("/**\n * @constructor\n */\nRoyaleTest_A = function() {\n};\n\n\n" +
+        "/**\n * @nocollapse\n * @type {*}\n */\nRoyaleTest_A.prototype.foo;\n\n\n" + 
+				"RoyaleTest_A.prototype.set__foo = function(value) {\n};\n\n\n" +
+        		"Object.defineProperties(RoyaleTest_A.prototype, /** @lends {RoyaleTest_A.prototype} */ {\n/**\n * @type {*}\n */\nfoo: {\nset: RoyaleTest_A.prototype.set__foo}}\n);");
+    }
     
     @Override
     protected IBackend createBackend()