Skip to content

Commit 36bdce2

Browse files
committed
GROOVY-5568, GROOVY-10815
1 parent 160d839 commit 36bdce2

6 files changed

Lines changed: 39 additions & 42 deletions

File tree

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/StaticCompilationTests.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7954,4 +7954,27 @@ public void testCompileStatic10807() {
79547954

79557955
runConformTest(sources, "[bar, baz, foo]");
79567956
}
7957+
7958+
@Test
7959+
public void testCompileStatic10815() {
7960+
//@formatter:off
7961+
String[] sources = {
7962+
"Main.groovy",
7963+
"@groovy.transform.CompileStatic\n" +
7964+
"void test() {\n" +
7965+
" Pogo pogo = new Pogo(name:'Frank Grimes')\n" +
7966+
" def props = pogo.properties\n" +
7967+
" print props.keySet().sort()\n" +
7968+
"}\n" +
7969+
"test()\n",
7970+
7971+
"Pogo.groovy",
7972+
"class Pogo {\n" +
7973+
" String name\n" +
7974+
"}\n",
7975+
};
7976+
//@formatter:on
7977+
7978+
runConformTest(sources, "[class, name]");
7979+
}
79577980
}

base/org.codehaus.groovy25/src/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565

6666
import static org.codehaus.groovy.ast.ClassHelper.BigDecimal_TYPE;
6767
import static org.codehaus.groovy.ast.ClassHelper.BigInteger_TYPE;
68-
import static org.codehaus.groovy.ast.ClassHelper.Boolean_TYPE;
6968
import static org.codehaus.groovy.ast.ClassHelper.CLASS_Type;
7069
import static org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE;
7170
import static org.codehaus.groovy.ast.ClassHelper.GROOVY_OBJECT_TYPE;
@@ -90,7 +89,6 @@
9089
import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
9190
import static org.codehaus.groovy.ast.tools.GeneralUtils.isOrImplements;
9291
import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
93-
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.chooseBestMethod;
9492
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.findDGMMethodsByNameAndArguments;
9593
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf;
9694
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isClassClassNodeWrappingConcreteType;
@@ -214,7 +212,7 @@ public void makeGetPropertySite(Expression receiver, final String propertyName,
214212
}
215213

216214
}
217-
215+
/* GRECLIPSE edit
218216
// GROOVY-5568, we would be facing a DGM call, but instead of foo.getText(), have foo.text
219217
List<MethodNode> methods = findDGMMethodsByNameAndArguments(controller.getSourceUnit().getClassLoader(), receiverType, getterName, ClassNode.EMPTY_ARRAY);
220218
for (MethodNode m: findDGMMethodsByNameAndArguments(controller.getSourceUnit().getClassLoader(), receiverType, altGetterName, ClassNode.EMPTY_ARRAY)) {
@@ -237,7 +235,7 @@ public void makeGetPropertySite(Expression receiver, final String propertyName,
237235
return;
238236
}
239237
}
240-
238+
*/
241239
if (!isStaticProperty && isOrImplements(receiverType, LIST_TYPE)) {
242240
writeListDotProperty(receiver, propertyName, safe);
243241
return;

base/org.codehaus.groovy30/src/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@
6161
import static org.apache.groovy.util.BeanUtils.capitalize;
6262
import static org.codehaus.groovy.ast.ClassHelper.BigDecimal_TYPE;
6363
import static org.codehaus.groovy.ast.ClassHelper.BigInteger_TYPE;
64-
import static org.codehaus.groovy.ast.ClassHelper.Boolean_TYPE;
6564
import static org.codehaus.groovy.ast.ClassHelper.CLASS_Type;
6665
import static org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE;
6766
import static org.codehaus.groovy.ast.ClassHelper.GROOVY_OBJECT_TYPE;
@@ -90,7 +89,6 @@
9089
import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
9190
import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
9291
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
93-
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.chooseBestMethod;
9492
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.findDGMMethodsByNameAndArguments;
9593
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf;
9694
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isClassClassNodeWrappingConcreteType;
@@ -201,7 +199,7 @@ public void makeGetPropertySite(final Expression receiver, final String property
201199
return;
202200
}
203201
}
204-
202+
/* GRECLIPSE edit
205203
// GROOVY-5568: we would be facing a DGM call, but instead of foo.getText(), have foo.text
206204
List<MethodNode> methods = findDGMMethodsByNameAndArguments(controller.getSourceUnit().getClassLoader(), receiverType, getterName, ClassNode.EMPTY_ARRAY);
207205
for (MethodNode dgm : findDGMMethodsByNameAndArguments(controller.getSourceUnit().getClassLoader(), receiverType, altGetterName, ClassNode.EMPTY_ARRAY)) {
@@ -222,7 +220,7 @@ public void makeGetPropertySite(final Expression receiver, final String property
222220
return;
223221
}
224222
}
225-
223+
*/
226224
if (!isStaticProperty && isOrImplements(receiverType, LIST_TYPE)) {
227225
writeListDotProperty(receiver, propertyName, safe);
228226
return;

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ public Expression transform(final Expression expr) {
125125

126126
MethodCallExpression mce = new MethodCallExpression(transform(pe.getObjectExpression()), pe.getPropertyAsString(), MethodCallExpression.NO_ARGUMENTS);
127127
mce.setImplicitThis(pe.isImplicitThis());
128-
mce.setSpreadSafe(pe.isSpreadSafe());
129128
mce.setMethodTarget(dmct);
130129
mce.setSourcePosition(pe);
130+
mce.setSpreadSafe(pe.isSpreadSafe());
131131
mce.setSafe(pe.isSafe());
132132
mce.copyNodeMetaData(pe);
133133
return mce;

base/org.codehaus.groovy40/src/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
import static org.codehaus.groovy.ast.ClassHelper.isClassType;
7676
import static org.codehaus.groovy.ast.ClassHelper.isGeneratedFunction;
7777
import static org.codehaus.groovy.ast.ClassHelper.isObjectType;
78-
import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveBoolean;
7978
import static org.codehaus.groovy.ast.ClassHelper.isPrimitiveType;
8079
import static org.codehaus.groovy.ast.ClassHelper.isStringType;
8180
import static org.codehaus.groovy.ast.ClassHelper.isWrapperInteger;
@@ -91,7 +90,6 @@
9190
import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
9291
import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
9392
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
94-
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.chooseBestMethod;
9593
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.findDGMMethodsByNameAndArguments;
9694
import static org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.isClassClassNodeWrappingConcreteType;
9795
import static groovyjarjarasm.asm.Opcodes.AALOAD;
@@ -225,24 +223,6 @@ public void makeGetPropertySite(final Expression receiver, final String property
225223
}
226224
}
227225

228-
// GROOVY-5568: we would be facing a DGM call, but instead of foo.getText(), have foo.text
229-
List<MethodNode> methods = findDGMMethodsByNameAndArguments(controller.getSourceUnit().getClassLoader(), receiverType, isserName, ClassNode.EMPTY_ARRAY);
230-
methods.removeIf(dgm -> !isPrimitiveBoolean(dgm.getReturnType()));
231-
findDGMMethodsByNameAndArguments(controller.getSourceUnit().getClassLoader(), receiverType, getterName, ClassNode.EMPTY_ARRAY, methods);
232-
if (!methods.isEmpty()) {
233-
List<MethodNode> methodNodes = chooseBestMethod(receiverType, methods, ClassNode.EMPTY_ARRAY);
234-
if (methodNodes.size() == 1) {
235-
MethodNode getter = methodNodes.get(0);
236-
MethodCallExpression call = callX(receiver, getter.getName());
237-
call.setImplicitThis(false);
238-
call.setMethodTarget(getter);
239-
call.setSafe(safe);
240-
call.setSourcePosition(receiver);
241-
call.visit(controller.getAcg());
242-
return;
243-
}
244-
}
245-
246226
if (!isStaticProperty && isOrImplements(receiverType, LIST_TYPE)) {
247227
writeListDotProperty(receiver, propertyName, safe);
248228
return;

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,17 @@ class PropertyExpressionTransformer {
3636
}
3737

3838
Expression transformPropertyExpression(final PropertyExpression pe) {
39-
if (isThisOrSuper(pe.getObjectExpression())) { // TODO: all obj exp
40-
MethodNode dmct = pe.getNodeMetaData(StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
41-
// NOTE: BinaryExpressionTransformer handles the setter
42-
if (dmct != null && dmct.getParameters().length == 0) {
43-
MethodCallExpression mce = callX(scTransformer.transform(pe.getObjectExpression()), pe.getPropertyAsString());
44-
mce.setImplicitThis(pe.isImplicitThis());
45-
mce.setSpreadSafe(pe.isSpreadSafe());
46-
mce.setMethodTarget(dmct);
47-
mce.setSourcePosition(pe);
48-
mce.copyNodeMetaData(pe);
49-
mce.setSafe(pe.isSafe());
50-
return mce;
51-
}
39+
MethodNode dmct = pe.getNodeMetaData(StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
40+
// NOTE: BinaryExpressionTransformer handles the setter
41+
if (dmct != null && dmct.getParameters().length == 0) {
42+
MethodCallExpression mce = callX(scTransformer.transform(pe.getObjectExpression()), pe.getPropertyAsString());
43+
mce.setImplicitThis(pe.isImplicitThis());
44+
mce.setMethodTarget(dmct);
45+
mce.setSourcePosition(pe);
46+
mce.setSpreadSafe(pe.isSpreadSafe());
47+
mce.setSafe(pe.isSafe());
48+
mce.copyNodeMetaData(pe);
49+
return mce;
5250
}
5351

5452
return scTransformer.superTransform(pe);

0 commit comments

Comments
 (0)