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