GROOVY-7953: property expressions for extension methods on primitives fail STC 
(closes #442)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/597a8d56
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/597a8d56
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/597a8d56

Branch: refs/heads/parrot
Commit: 597a8d563a013763b6866b5ce6b30851e19b0941
Parents: 7285ffc
Author: Shil Sinha <shil.si...@gmail.com>
Authored: Thu Oct 6 17:39:27 2016 -0400
Committer: Shil Sinha <sh...@apache.org>
Committed: Sun Oct 9 12:32:19 2016 -0400

----------------------------------------------------------------------
 .../stc/StaticTypeCheckingVisitor.java          | 33 +++++++++++---------
 .../org.codehaus.groovy.runtime.ExtensionModule |  2 +-
 .../org.codehaus.groovy.runtime.ExtensionModule |  2 +-
 .../stc/STCExtensionMethodsTest.groovy          |  6 ++++
 .../sc/StaticCompileExtensionMethodsTest.groovy | 24 ++++++++++++++
 .../m12n/TestPrimitiveWrapperExtension.java     | 25 +++++++++++++++
 6 files changed, 76 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/597a8d56/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
----------------------------------------------------------------------
diff --git 
a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java 
b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index df128eb..d5259b6 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1314,21 +1314,26 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
                 }
             }
             // GROOVY-5568, the property may be defined by DGM
-            List<MethodNode> methods = 
findDGMMethodsByNameAndArguments(getTransformLoader(), testClass, "get" + 
capName, ClassNode.EMPTY_ARRAY);
-            for (MethodNode m: 
findDGMMethodsByNameAndArguments(getTransformLoader(), testClass, "is" + 
capName, ClassNode.EMPTY_ARRAY)) {
-                if (Boolean_TYPE.equals(getWrapper(m.getReturnType()))) 
methods.add(m);
-            }
-            if (!methods.isEmpty()) {
-                List<MethodNode> methodNodes = chooseBestMethod(testClass, 
methods, ClassNode.EMPTY_ARRAY);
-                if (methodNodes.size() == 1) {
-                    MethodNode getter = methodNodes.get(0);
-                    if (visitor != null) {
-                        visitor.visitMethod(getter);
-                    }
-                    ClassNode cn = inferReturnTypeGenerics(testClass, getter, 
ArgumentListExpression.EMPTY_ARGUMENTS);
-                    storeInferredTypeForPropertyExpression(pexp, cn);
+            List<ClassNode> dgmReceivers = new ArrayList<ClassNode>(2);
+            dgmReceivers.add(testClass);
+            if (isPrimitiveType(testClass)) 
dgmReceivers.add(getWrapper(testClass));
+            for (ClassNode dgmReceiver: dgmReceivers) {
+                List<MethodNode> methods = 
findDGMMethodsByNameAndArguments(getTransformLoader(), dgmReceiver, "get" + 
capName, ClassNode.EMPTY_ARRAY);
+                for (MethodNode m : 
findDGMMethodsByNameAndArguments(getTransformLoader(), dgmReceiver, "is" + 
capName, ClassNode.EMPTY_ARRAY)) {
+                    if (Boolean_TYPE.equals(getWrapper(m.getReturnType()))) 
methods.add(m);
+                }
+                if (!methods.isEmpty()) {
+                    List<MethodNode> methodNodes = 
chooseBestMethod(dgmReceiver, methods, ClassNode.EMPTY_ARRAY);
+                    if (methodNodes.size() == 1) {
+                        MethodNode getter = methodNodes.get(0);
+                        if (visitor != null) {
+                            visitor.visitMethod(getter);
+                        }
+                        ClassNode cn = inferReturnTypeGenerics(dgmReceiver, 
getter, ArgumentListExpression.EMPTY_ARGUMENTS);
+                        storeInferredTypeForPropertyExpression(pexp, cn);
 
-                    return true;
+                        return true;
+                    }
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/groovy/blob/597a8d56/src/spec/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
----------------------------------------------------------------------
diff --git 
a/src/spec/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
 
b/src/spec/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
index 67205e0..4926633 100644
--- 
a/src/spec/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
+++ 
b/src/spec/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
@@ -17,5 +17,5 @@
 # IT IS A WORKAROUND FOR 2 DESCRIPTORS ON CLASSPATH!
 moduleName=Test module
 moduleVersion=1.0-test
-extensionClasses=support.MaxRetriesExtension,org.codehaus.groovy.runtime.m12n.TestStringExtension,org.codehaus.groovy.runtime.m12n.Groovy6496Extension
+extensionClasses=support.MaxRetriesExtension,org.codehaus.groovy.runtime.m12n.TestStringExtension,org.codehaus.groovy.runtime.m12n.Groovy6496Extension,org.codehaus.groovy.runtime.m12n.TestPrimitiveWrapperExtension
 
staticExtensionClasses=support.StaticStringExtension,org.codehaus.groovy.runtime.m12n.TestStaticStringExtension

http://git-wip-us.apache.org/repos/asf/groovy/blob/597a8d56/src/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
----------------------------------------------------------------------
diff --git 
a/src/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
 
b/src/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
index 69795a4..7287001 100644
--- 
a/src/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
+++ 
b/src/test-resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
@@ -16,5 +16,5 @@
 // This file is used to test the extension module framework
 moduleName=Test module
 moduleVersion=1.0-test
-extensionClasses=org.codehaus.groovy.runtime.m12n.TestStringExtension,org.codehaus.groovy.runtime.m12n.Groovy6496Extension
+extensionClasses=org.codehaus.groovy.runtime.m12n.TestStringExtension,org.codehaus.groovy.runtime.m12n.Groovy6496Extension,org.codehaus.groovy.runtime.m12n.TestPrimitiveWrapperExtension
 
staticExtensionClasses=org.codehaus.groovy.runtime.m12n.TestStaticStringExtension

http://git-wip-us.apache.org/repos/asf/groovy/blob/597a8d56/src/test/groovy/transform/stc/STCExtensionMethodsTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/transform/stc/STCExtensionMethodsTest.groovy 
b/src/test/groovy/transform/stc/STCExtensionMethodsTest.groovy
index 3794f65..0af35a0 100644
--- a/src/test/groovy/transform/stc/STCExtensionMethodsTest.groovy
+++ b/src/test/groovy/transform/stc/STCExtensionMethodsTest.groovy
@@ -69,4 +69,10 @@ class STCExtensionMethodsTest extends 
StaticTypeCheckingTestCase {
             assert 2d.groovy6496(2d) == 2d
     '''
     }
+
+    void testExtensionPropertyWithPrimitiveReceiver() {
+        assertScript '''
+            assert 4.even
+        '''
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/groovy/blob/597a8d56/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileExtensionMethodsTest.groovy
----------------------------------------------------------------------
diff --git 
a/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileExtensionMethodsTest.groovy
 
b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileExtensionMethodsTest.groovy
new file mode 100644
index 0000000..426bba5
--- /dev/null
+++ 
b/src/test/org/codehaus/groovy/classgen/asm/sc/StaticCompileExtensionMethodsTest.groovy
@@ -0,0 +1,24 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.classgen.asm.sc
+
+import groovy.transform.stc.STCExtensionMethodsTest
+
+class StaticCompileExtensionMethodsTest extends STCExtensionMethodsTest 
implements StaticCompilationTestSupport {
+}

http://git-wip-us.apache.org/repos/asf/groovy/blob/597a8d56/src/test/org/codehaus/groovy/runtime/m12n/TestPrimitiveWrapperExtension.java
----------------------------------------------------------------------
diff --git 
a/src/test/org/codehaus/groovy/runtime/m12n/TestPrimitiveWrapperExtension.java 
b/src/test/org/codehaus/groovy/runtime/m12n/TestPrimitiveWrapperExtension.java
new file mode 100644
index 0000000..1617f92
--- /dev/null
+++ 
b/src/test/org/codehaus/groovy/runtime/m12n/TestPrimitiveWrapperExtension.java
@@ -0,0 +1,25 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.runtime.m12n;
+
+public class TestPrimitiveWrapperExtension {
+    public static boolean isEven(Integer self) {
+        return self % 2 == 0;
+    }
+}

Reply via email to