You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/11/09 20:03:45 UTC

[groovy] 02/02: GROOVY-5568, GROOVY-10815: SC: groovy method as property

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

emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 9210cfab6aac681a865c57dd97e96aac73f38fd4
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Nov 9 13:57:31 2022 -0600

    GROOVY-5568, GROOVY-10815: SC: groovy method as property
---
 .../classgen/asm/sc/StaticTypesCallSiteWriter.java | 20 -----------------
 .../PropertyExpressionTransformer.java             | 25 ++++++++++------------
 .../stc/DefaultGroovyMethodsSTCTest.groovy         |  9 +++++++-
 3 files changed, 19 insertions(+), 35 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
index c62659d25e..c08999c381 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
@@ -75,7 +75,6 @@ import static org.codehaus.groovy.ast.ClassHelper.isBigIntegerType;
 import static org.codehaus.groovy.ast.ClassHelper.isClassType;
 import static org.codehaus.groovy.ast.ClassHelper.isGeneratedFunction;
 import static org.codehaus.groovy.ast.ClassHelper.isObjectType;
-import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveBoolean;
 import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveType;
 import static org.codehaus.groovy.ast.ClassHelper.isStringType;
 import static org.codehaus.groovy.ast.ClassHelper.isWrapperInteger;
@@ -91,7 +90,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.isOrImplements;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
-import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.chooseBestMethod;
 import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.findDGMMethodsByNameAndArguments;
 import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isClassClassNodeWrappingConcreteType;
 import static org.objectweb.asm.Opcodes.AALOAD;
@@ -227,24 +225,6 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter {
             }
         }
 
-        // GROOVY-5568: we would be facing a DGM call, but instead of foo.getText(), have foo.text
-        List<MethodNode> methods = findDGMMethodsByNameAndArguments(controller.getSourceUnit().getClassLoader(), receiverType, isserName, ClassNode.EMPTY_ARRAY);
-        methods.removeIf(dgm -> !isPrimitiveBoolean(dgm.getReturnType()));
-        findDGMMethodsByNameAndArguments(controller.getSourceUnit().getClassLoader(), receiverType, getterName, ClassNode.EMPTY_ARRAY, methods);
-        if (!methods.isEmpty()) {
-            List<MethodNode> methodNodes = chooseBestMethod(receiverType, methods, ClassNode.EMPTY_ARRAY);
-            if (methodNodes.size() == 1) {
-                MethodNode getter = methodNodes.get(0);
-                MethodCallExpression call = callX(receiver, getter.getName());
-                call.setImplicitThis(false);
-                call.setMethodTarget(getter);
-                call.setSafe(safe);
-                call.setSourcePosition(receiver);
-                call.visit(controller.getAcg());
-                return;
-            }
-        }
-
         if (!isStaticProperty && isOrImplements(receiverType, LIST_TYPE)) {
             writeListDotProperty(receiver, propertyName, safe);
             return;
diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java
index bc3d3aa07d..fc54a954f9 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java
@@ -24,7 +24,6 @@ import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.PropertyExpression;
 import org.codehaus.groovy.transform.stc.StaticTypesMarker;
 
-import static org.apache.groovy.ast.tools.ExpressionUtils.isThisOrSuper;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 
 class PropertyExpressionTransformer {
@@ -36,19 +35,17 @@ class PropertyExpressionTransformer {
     }
 
     Expression transformPropertyExpression(final PropertyExpression pe) {
-        if (isThisOrSuper(pe.getObjectExpression())) { // TODO: all obj exp
-            MethodNode dmct = pe.getNodeMetaData(StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
-            // NOTE: BinaryExpressionTransformer handles the setter
-            if (dmct != null && dmct.getParameters().length == 0) {
-                MethodCallExpression mce = callX(scTransformer.transform(pe.getObjectExpression()), dmct.getName());
-                mce.setImplicitThis(pe.isImplicitThis());
-                mce.setSpreadSafe(pe.isSpreadSafe());
-                mce.setMethodTarget(dmct);
-                mce.setSourcePosition(pe);
-                mce.copyNodeMetaData(pe);
-                mce.setSafe(pe.isSafe());
-                return mce;
-            }
+        MethodNode dmct = pe.getNodeMetaData(StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
+        // NOTE: BinaryExpressionTransformer handles the setter
+        if (dmct != null && dmct.getParameters().length == 0) {
+            MethodCallExpression mce = callX(scTransformer.transform(pe.getObjectExpression()), dmct.getName());
+            mce.setImplicitThis(pe.isImplicitThis());
+            mce.setMethodTarget(dmct);
+            mce.setSourcePosition(pe);
+            mce.setSpreadSafe(pe.isSpreadSafe());
+            mce.setSafe(pe.isSafe());
+            mce.copyNodeMetaData(pe);
+            return mce;
         }
 
         return scTransformer.superTransform(pe);
diff --git a/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy b/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
index 68eb4fb838..ea46a0674c 100644
--- a/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/DefaultGroovyMethodsSTCTest.groovy
@@ -77,7 +77,7 @@ class DefaultGroovyMethodsSTCTest extends StaticTypeCheckingTestCase {
       '''
     }
 
-    // GROOVY-5568
+    // GROOVY-5568, GROOVY-10815
     void testPropertySemantics1() {
         assertScript '''
             String test(InputStream input) {
@@ -95,6 +95,13 @@ class DefaultGroovyMethodsSTCTest extends StaticTypeCheckingTestCase {
             def a = Character.valueOf((char) 'a')
             assert a.letter // DefaultGroovyMethods#isLetter(Character)
         '''
+
+        assertScript '''
+            class Pogo { String name } // Groovy type
+            Pogo pogo = new Pogo(name:'Frank Grimes')
+            def props = pogo.properties // DefaultGroovyMethods#getProperties(Object)
+            assert props.keySet() == ['name','class'] as Set
+        '''
     }
 
     // GROOVY-10075