Skip to content

Commit 9fd1b83

Browse files
committed
GROOVY-7300 (pt.2)
1 parent 8713913 commit 9fd1b83

File tree

3 files changed

+113
-37
lines changed

3 files changed

+113
-37
lines changed

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

+69-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2009-2021 the original author or authors.
2+
* Copyright 2009-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -662,6 +662,74 @@ public void testCompileStatic24() {
662662
"----------\n");
663663
}
664664

665+
@Test
666+
public void testCompileStatic25() {
667+
//@formatter:off
668+
String[] sources = {
669+
"Main.groovy",
670+
"class C<T> {\n" +
671+
" T t\n" +
672+
" T getT() {\n" +
673+
" this.t\n" +
674+
" }\n" +
675+
"}\n" +
676+
"@groovy.transform.CompileStatic\n" +
677+
"void test(C<Map<String,Object>> p) {\n" +
678+
" print p.t.u\n" + // Access to T#x is forbidden
679+
"}\n" +
680+
"test(new C<>(t:[u:'v']))\n",
681+
};
682+
//@formatter:on
683+
684+
runConformTest(sources, "v");
685+
}
686+
687+
@Test
688+
public void testCompileStatic26() {
689+
//@formatter:off
690+
String[] sources = {
691+
"Main.groovy",
692+
"class C<T> {\n" +
693+
" T t\n" +
694+
" T getT() {\n" +
695+
" this.t\n" +
696+
" }\n" +
697+
"}\n" +
698+
"@groovy.transform.CompileStatic\n" +
699+
"void test(C<Map<String,Object>> p) {\n" +
700+
" print p.with { t.u }\n" +
701+
"}\n" +
702+
"test(new C<>(t:[u:'v']))\n",
703+
};
704+
//@formatter:on
705+
706+
runConformTest(sources, "v");
707+
}
708+
709+
@Test
710+
public void testCompileStatic27() {
711+
//@formatter:off
712+
String[] sources = {
713+
"Main.groovy",
714+
"class C<T> {\n" +
715+
" T t\n" +
716+
" T getT() {\n" +
717+
" this.t\n" +
718+
" }\n" +
719+
"}\n" +
720+
"class D extends C<Map<String,Object>> {\n" +
721+
" @groovy.transform.CompileStatic\n" +
722+
" void test() {\n" +
723+
" print t.u\n" +
724+
" }\n" +
725+
"}\n" +
726+
"new D(t:[u:'v']).test()\n",
727+
};
728+
//@formatter:on
729+
730+
runConformTest(sources, "v");
731+
}
732+
665733
@Test
666734
public void testCompileStatic1505() {
667735
//@formatter:off

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

+22-18
Original file line numberDiff line numberDiff line change
@@ -113,24 +113,6 @@ public void visitClassCodeContainer(final Statement code) {
113113

114114
@Override
115115
public Expression transform(Expression expr) {
116-
// GRECLIPSE add -- GROOVY-6097, GROOVY-7300, et al.
117-
if (expr instanceof PropertyExpression) {
118-
MethodNode dmct = expr.getNodeMetaData(org.codehaus.groovy.transform.stc.StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
119-
// NOTE: BinaryExpressionTransformer handles the setter
120-
if (dmct != null && dmct.getParameters().length == 0) {
121-
PropertyExpression pe = (PropertyExpression) expr;
122-
123-
MethodCallExpression mce = new MethodCallExpression(transform(pe.getObjectExpression()), dmct.getName(), MethodCallExpression.NO_ARGUMENTS);
124-
mce.setImplicitThis(pe.isImplicitThis());
125-
mce.setSpreadSafe(pe.isSpreadSafe());
126-
mce.setMethodTarget(dmct);
127-
mce.setSourcePosition(pe);
128-
mce.setSafe(pe.isSafe());
129-
return mce;
130-
}
131-
return super.transform(expr);
132-
}
133-
// GRECLIPSE end
134116
if (expr instanceof StaticMethodCallExpression) {
135117
return staticMethodCallExpressionTransformer.transformStaticMethodCallExpression((StaticMethodCallExpression) expr);
136118
}
@@ -149,6 +131,28 @@ public Expression transform(Expression expr) {
149131
if (expr instanceof BooleanExpression) {
150132
return booleanExpressionTransformer.transformBooleanExpression((BooleanExpression)expr);
151133
}
134+
// GRECLIPSE add -- GROOVY-6097, GROOVY-7300, et al.
135+
if (expr instanceof PropertyExpression) {
136+
MethodNode dmct = expr.getNodeMetaData(org.codehaus.groovy.transform.stc.StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
137+
// NOTE: BinaryExpressionTransformer handles the setter
138+
if (dmct != null && dmct.getParameters().length == 0) {
139+
PropertyExpression pe = (PropertyExpression) expr;
140+
141+
MethodCallExpression mce = new MethodCallExpression(transform(pe.getObjectExpression()), dmct.getName(), MethodCallExpression.NO_ARGUMENTS);
142+
mce.setImplicitThis(pe.isImplicitThis());
143+
mce.setSpreadSafe(pe.isSpreadSafe());
144+
mce.setMethodTarget(dmct);
145+
mce.setSourcePosition(pe);
146+
mce.setSafe(pe.isSafe());
147+
// check if method return type is incomplete
148+
if (org.codehaus.groovy.ast.tools.GenericsUtils.hasPlaceHolders(mce.getType()))
149+
mce.putNodeMetaData(org.codehaus.groovy.transform.stc.StaticTypesMarker.INFERRED_TYPE,
150+
pe.getNodeMetaData(org.codehaus.groovy.transform.stc.StaticTypesMarker.INFERRED_TYPE));
151+
return mce;
152+
}
153+
return super.transform(expr);
154+
}
155+
// GRECLIPSE end
152156
if (expr instanceof VariableExpression) {
153157
// GRECLIPSE edit -- GROOVY-6097, GROOVY-7300, et al.
154158
Expression exp2 = variableExpressionTransformer.transformVariableExpression((VariableExpression)expr);

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

+22-18
Original file line numberDiff line numberDiff line change
@@ -107,24 +107,6 @@ public void visitClassCodeContainer(final Statement code) {
107107

108108
@Override
109109
public Expression transform(Expression expr) {
110-
// GRECLIPSE add -- GROOVY-6097, GROOVY-7300, et al.
111-
if (expr instanceof PropertyExpression) {
112-
MethodNode dmct = expr.getNodeMetaData(org.codehaus.groovy.transform.stc.StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
113-
// NOTE: BinaryExpressionTransformer handles the setter
114-
if (dmct != null && dmct.getParameters().length == 0) {
115-
PropertyExpression pe = (PropertyExpression) expr;
116-
117-
MethodCallExpression mce = new MethodCallExpression(transform(pe.getObjectExpression()), dmct.getName(), MethodCallExpression.NO_ARGUMENTS);
118-
mce.setImplicitThis(pe.isImplicitThis());
119-
mce.setSpreadSafe(pe.isSpreadSafe());
120-
mce.setMethodTarget(dmct);
121-
mce.setSourcePosition(pe);
122-
mce.setSafe(pe.isSafe());
123-
return mce;
124-
}
125-
return super.transform(expr);
126-
}
127-
// GRECLIPSE end
128110
if (expr instanceof StaticMethodCallExpression) {
129111
return staticMethodCallExpressionTransformer.transformStaticMethodCallExpression((StaticMethodCallExpression) expr);
130112
}
@@ -143,6 +125,28 @@ public Expression transform(Expression expr) {
143125
if (expr instanceof BooleanExpression) {
144126
return booleanExpressionTransformer.transformBooleanExpression((BooleanExpression)expr);
145127
}
128+
// GRECLIPSE add -- GROOVY-6097, GROOVY-7300, et al.
129+
if (expr instanceof PropertyExpression) {
130+
MethodNode dmct = expr.getNodeMetaData(org.codehaus.groovy.transform.stc.StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
131+
// NOTE: BinaryExpressionTransformer handles the setter
132+
if (dmct != null && dmct.getParameters().length == 0) {
133+
PropertyExpression pe = (PropertyExpression) expr;
134+
135+
MethodCallExpression mce = new MethodCallExpression(transform(pe.getObjectExpression()), dmct.getName(), MethodCallExpression.NO_ARGUMENTS);
136+
mce.setImplicitThis(pe.isImplicitThis());
137+
mce.setSpreadSafe(pe.isSpreadSafe());
138+
mce.setMethodTarget(dmct);
139+
mce.setSourcePosition(pe);
140+
mce.setSafe(pe.isSafe());
141+
// check if method return type is incomplete
142+
if (org.codehaus.groovy.ast.tools.GenericsUtils.hasPlaceHolders(mce.getType()))
143+
mce.putNodeMetaData(org.codehaus.groovy.transform.stc.StaticTypesMarker.INFERRED_TYPE,
144+
pe.getNodeMetaData(org.codehaus.groovy.transform.stc.StaticTypesMarker.INFERRED_TYPE));
145+
return mce;
146+
}
147+
return super.transform(expr);
148+
}
149+
// GRECLIPSE end
146150
if (expr instanceof VariableExpression) {
147151
// GRECLIPSE edit -- GROOVY-6097, GROOVY-7300, et al.
148152
Expression exp2 = variableExpressionTransformer.transformVariableExpression((VariableExpression)expr);

0 commit comments

Comments
 (0)