Skip to content

Commit 737ba50

Browse files
committed
GROOVY-11488: STC: null check
1 parent 7e94be4 commit 737ba50

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+13-11
Original file line numberDiff line numberDiff line change
@@ -4094,7 +4094,7 @@ protected void visitInstanceofNot(final BinaryExpression be) {
40944094
} else {
40954095
// saving type of variables to restoring them after returning from block
40964096
Map<VariableExpression, List<ClassNode>> oldTracker = pushAssignmentTracking();
4097-
getTypeCheckingContext().pushTemporaryTypeInfo();
4097+
typeCheckingContext.pushTemporaryTypeInfo();
40984098
typeCheckingContext.blockStatements2Types.put(currentBlock, oldTracker);
40994099
}
41004100
pushInstanceOfTypeInfo(be.getLeftExpression(), be.getRightExpression());
@@ -4114,11 +4114,11 @@ public void visitBlockStatement(final BlockStatement block) {
41144114

41154115
@Deprecated
41164116
public void visitClosingBlock(final BlockStatement block) {
4117-
BlockStatement peekBlock = typeCheckingContext.enclosingBlocks.removeFirst();
4118-
boolean found = typeCheckingContext.blockStatements2Types.containsKey(peekBlock);
4117+
BlockStatement theBlock = typeCheckingContext.enclosingBlocks.pop();
4118+
boolean found = typeCheckingContext.blockStatements2Types.containsKey(theBlock);
41194119
if (found) {
4120-
Map<VariableExpression, List<ClassNode>> oldTracker = typeCheckingContext.blockStatements2Types.remove(peekBlock);
4121-
getTypeCheckingContext().popTemporaryTypeInfo();
4120+
Map<VariableExpression, List<ClassNode>> oldTracker = typeCheckingContext.blockStatements2Types.remove(theBlock);
4121+
typeCheckingContext.popTemporaryTypeInfo();
41224122
popAssignmentTracking(oldTracker);
41234123
}
41244124
}
@@ -4262,13 +4262,15 @@ protected Map<VariableExpression, List<ClassNode>> pushAssignmentTracking() {
42624262

42634263
protected Map<VariableExpression, ClassNode> popAssignmentTracking(final Map<VariableExpression, List<ClassNode>> oldTracker) {
42644264
Map<VariableExpression, ClassNode> assignments = new HashMap<>();
4265-
typeCheckingContext.ifElseForWhileAssignmentTracker.forEach((var, types) -> {
4266-
types.stream().filter(t -> t != null && t != UNKNOWN_PARAMETER_TYPE) // GROOVY-6099, GROOVY-10294
4267-
.reduce(WideningCategories::lowestUpperBound).ifPresent(type -> {
4268-
assignments.put(var, type);
4269-
storeType(var, type);
4265+
if (typeCheckingContext.ifElseForWhileAssignmentTracker != null){ // GROOVY-11488
4266+
typeCheckingContext.ifElseForWhileAssignmentTracker.forEach((var, types) -> {
4267+
types.stream().filter(t -> t != null && t != UNKNOWN_PARAMETER_TYPE) // GROOVY-6099, GROOVY-10294
4268+
.reduce(WideningCategories::lowestUpperBound).ifPresent(type -> {
4269+
assignments.put(var, type);
4270+
storeType(var, type);
4271+
});
42704272
});
4271-
});
4273+
}
42724274
typeCheckingContext.ifElseForWhileAssignmentTracker = oldTracker;
42734275
// GROOVY-9786, GROOVY-11450: nested conditional assignments
42744276
if (oldTracker != null) {

src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy

+16-1
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,21 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
614614
''', 'Cannot find matching method java.lang.Object#toUpperCase()'
615615
}
616616

617+
// GROOVY-11488
618+
void testNotInstanceOf7() {
619+
assertScript '''
620+
def test(object) {
621+
if (false) {
622+
return 'not possible'
623+
} else if (object !instanceof Object[]) {
624+
return 'not array'
625+
}
626+
}
627+
assert test(null) == 'not array'
628+
assert test(new Object[0]) == null
629+
'''
630+
}
631+
617632
// GROOVY-10217
618633
void testInstanceOfThenSubscriptOperator() {
619634
assertScript '''
@@ -1401,7 +1416,7 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase {
14011416
'''
14021417
}
14031418

1404-
// GROOVY-
1419+
// GROOVY-6207
14051420
void testGetAnnotationFails() {
14061421
assertScript '''
14071422
import groovy.transform.*

0 commit comments

Comments
 (0)