Skip to content

Commit b141d4e

Browse files
committed
GROOVY-7333, GROOVY-9769
1 parent 15659f6 commit b141d4e

File tree

4 files changed

+86
-14
lines changed

4 files changed

+86
-14
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.builder/src/org/eclipse/jdt/core/groovy/tests/search/InferencingTests.java

+18
Original file line numberDiff line numberDiff line change
@@ -3457,6 +3457,24 @@ public void testInstanceOf16() {
34573457
assertType(contents, "value", "java.lang.Object");
34583458
}
34593459

3460+
@Test // GROOVY-9769
3461+
public void testInstanceOf17() {
3462+
String contents =
3463+
"interface A {\n" +
3464+
"}\n" +
3465+
"interface B extends A {\n" +
3466+
" def foo()\n" +
3467+
"}\n" +
3468+
"@groovy.transform.CompileStatic\n" +
3469+
"void test(A a) {\n" +
3470+
" if (a instanceof B) {\n" +
3471+
" a.foo()\n" +
3472+
" }\n" +
3473+
"}\n";
3474+
3475+
assertType(contents, "a", "B"); // not <UnionType:A+B>
3476+
}
3477+
34603478
@Test // https://github.com/groovy/groovy-eclipse/issues/1101
34613479
public void testEqualsClassTest1() {
34623480
String contents =

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

+33-14
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,27 @@ public void testTypeChecked9() {
214214
runNegativeTest(sources, "");
215215
}
216216

217-
@Test // GROOVY-7363: don't match bridge method
218-
public void testTypeChecked10() {
217+
@Test
218+
public void testTypeChecked7333() {
219+
//@formatter:off
220+
String[] sources = {
221+
"Main.groovy",
222+
"int len(byte[] bytes) { bytes.length }\n" +
223+
"@groovy.transform.TypeChecked\n" +
224+
"void test(arg) {\n" +
225+
" if (arg instanceof byte[]) {\n" +
226+
" print(len(arg))\n" +
227+
" }\n" +
228+
"}\n" +
229+
"test(new byte[3])\n",
230+
};
231+
//@formatter:on
232+
233+
runConformTest(sources, "3");
234+
}
235+
236+
@Test // don't match bridge method
237+
public void testTypeChecked7363() {
219238
//@formatter:off
220239
String[] sources = {
221240
"Face.java",
@@ -244,8 +263,8 @@ public void testTypeChecked10() {
244263
runNegativeTest(sources, "");
245264
}
246265

247-
@Test // GROOVY-8103
248-
public void testTypeChecked11() {
266+
@Test
267+
public void testTypeChecked8103() {
249268
//@formatter:off
250269
String[] sources = {
251270
"Script.groovy",
@@ -282,8 +301,8 @@ public void testTypeChecked11() {
282301
runNegativeTest(sources, "");
283302
}
284303

285-
@Test // GROOVY-9460
286-
public void testTypeChecked12() {
304+
@Test
305+
public void testTypeChecked9460() {
287306
//@formatter:off
288307
String[] sources = {
289308
"G.groovy",
@@ -305,8 +324,8 @@ public void testTypeChecked12() {
305324
runNegativeTest(sources, "");
306325
}
307326

308-
@Test // GROOVY-9570
309-
public void testTypeChecked13() {
327+
@Test
328+
public void testTypeChecked9570() {
310329
//@formatter:off
311330
String[] sources = {
312331
"Main.groovy",
@@ -332,8 +351,8 @@ public void testTypeChecked13() {
332351
runNegativeTest(sources, "");
333352
}
334353

335-
@Test // GROOVY-9735
336-
public void testTypeChecked14() {
354+
@Test
355+
public void testTypeChecked9735() {
337356
//@formatter:off
338357
String[] sources = {
339358
"Main.groovy",
@@ -362,8 +381,8 @@ public void testTypeChecked14() {
362381
runNegativeTest(sources, "");
363382
}
364383

365-
@Test // GROOVY-9735
366-
public void testTypeChecked15() {
384+
@Test
385+
public void testTypeChecked9735a() {
367386
//@formatter:off
368387
String[] sources = {
369388
"Main.groovy",
@@ -392,8 +411,8 @@ public void testTypeChecked15() {
392411
runNegativeTest(sources, "");
393412
}
394413

395-
@Test // GROOVY-9751
396-
public void testTypeChecked16() {
414+
@Test
415+
public void testTypeChecked9751() {
397416
//@formatter:off
398417
String[] sources = {
399418
"Main.groovy",

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+26
Original file line numberDiff line numberDiff line change
@@ -2475,6 +2475,7 @@ protected ClassNode[] getArgumentTypes(ArgumentListExpression args) {
24752475
return ret;
24762476
}
24772477

2478+
/* GRECLIPSE edit -- GROOVY-9769
24782479
private ClassNode getInferredTypeFromTempInfo(Expression exp, ClassNode result) {
24792480
Map<Object, List<ClassNode>> info = typeCheckingContext.temporaryIfBranchTypeInformation.empty() ? null : typeCheckingContext.temporaryIfBranchTypeInformation.peek();
24802481
if (exp instanceof VariableExpression && info != null) {
@@ -2502,6 +2503,31 @@ private ClassNode getInferredTypeFromTempInfo(Expression exp, ClassNode result)
25022503
}
25032504
return result;
25042505
}
2506+
*/
2507+
private ClassNode getInferredTypeFromTempInfo(final Expression expression, final ClassNode expressionType) {
2508+
Map<Object, List<ClassNode>> info = (!typeCheckingContext.temporaryIfBranchTypeInformation.empty() ? typeCheckingContext.temporaryIfBranchTypeInformation.peek() : null);
2509+
if (expression instanceof VariableExpression && info != null) {
2510+
List<ClassNode> tempTypes = getTemporaryTypesForExpression(expression);
2511+
if (tempTypes != null && !tempTypes.isEmpty()) {
2512+
List<ClassNode> types = new ArrayList<ClassNode>(tempTypes.size() + 1);
2513+
if (expressionType != null && !expressionType.equals(ClassHelper.OBJECT_TYPE) // GROOVY-7333
2514+
/*&& tempTypes.stream().noneMatch(t -> implementsInterfaceOrIsSubclassOf(t, expressionType))*/) {
2515+
types.add(expressionType);
2516+
}
2517+
types.addAll(tempTypes);
2518+
2519+
if (types.isEmpty()) {
2520+
return ClassHelper.OBJECT_TYPE;
2521+
} else if (types.size() == 1) {
2522+
return types.get(0);
2523+
} else {
2524+
return new UnionTypeClassNode(types.toArray(ClassNode.EMPTY_ARRAY));
2525+
}
2526+
}
2527+
}
2528+
return expressionType;
2529+
}
2530+
// GRECLIPSE end
25052531

25062532
@Override
25072533
public void visitClosureExpression(final ClosureExpression expression) {

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+9
Original file line numberDiff line numberDiff line change
@@ -2292,10 +2292,19 @@ private ClassNode getInferredTypeFromTempInfo(final Expression exp, ClassNode re
22922292
List<ClassNode> classNodes = getTemporaryTypesForExpression(exp);
22932293
if (classNodes != null && !classNodes.isEmpty()) {
22942294
List<ClassNode> types = new ArrayList<>(classNodes.size() + 1);
2295+
/* GRECLIPSE edit -- GROOVY-9769
22952296
if (result != null && !classNodes.contains(result)) types.add(result);
22962297
types.addAll(classNodes);
22972298
// GROOVY-7333: filter out Object
22982299
types.removeIf(OBJECT_TYPE::equals);
2300+
*/
2301+
ClassNode expressionType = result;
2302+
if (expressionType != null && !expressionType.equals(ClassHelper.OBJECT_TYPE) // GROOVY-7333
2303+
&& classNodes.stream().noneMatch(t -> implementsInterfaceOrIsSubclassOf(t, expressionType))) {
2304+
types.add(expressionType);
2305+
}
2306+
types.addAll(classNodes);
2307+
// GRECLIPSE end
22992308

23002309
if (types.isEmpty()) {
23012310
result = OBJECT_TYPE.getPlainNodeReference();

0 commit comments

Comments
 (0)