This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_4_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push: new 737ba5054e GROOVY-11488: STC: null check 737ba5054e is described below commit 737ba5054efc899270fba12cc9d6b184c582fb3e Author: Eric Milles <eric.mil...@thomsonreuters.com> AuthorDate: Tue Oct 1 15:09:37 2024 -0500 GROOVY-11488: STC: null check --- .../transform/stc/StaticTypeCheckingVisitor.java | 24 ++++++++++++---------- .../transform/stc/TypeInferenceSTCTest.groovy | 17 ++++++++++++++- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index a98c50f7d5..14462f47b9 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -4094,7 +4094,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { } else { // saving type of variables to restoring them after returning from block Map<VariableExpression, List<ClassNode>> oldTracker = pushAssignmentTracking(); - getTypeCheckingContext().pushTemporaryTypeInfo(); + typeCheckingContext.pushTemporaryTypeInfo(); typeCheckingContext.blockStatements2Types.put(currentBlock, oldTracker); } pushInstanceOfTypeInfo(be.getLeftExpression(), be.getRightExpression()); @@ -4114,11 +4114,11 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { @Deprecated public void visitClosingBlock(final BlockStatement block) { - BlockStatement peekBlock = typeCheckingContext.enclosingBlocks.removeFirst(); - boolean found = typeCheckingContext.blockStatements2Types.containsKey(peekBlock); + BlockStatement theBlock = typeCheckingContext.enclosingBlocks.pop(); + boolean found = typeCheckingContext.blockStatements2Types.containsKey(theBlock); if (found) { - Map<VariableExpression, List<ClassNode>> oldTracker = typeCheckingContext.blockStatements2Types.remove(peekBlock); - getTypeCheckingContext().popTemporaryTypeInfo(); + Map<VariableExpression, List<ClassNode>> oldTracker = typeCheckingContext.blockStatements2Types.remove(theBlock); + typeCheckingContext.popTemporaryTypeInfo(); popAssignmentTracking(oldTracker); } } @@ -4262,13 +4262,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { protected Map<VariableExpression, ClassNode> popAssignmentTracking(final Map<VariableExpression, List<ClassNode>> oldTracker) { Map<VariableExpression, ClassNode> assignments = new HashMap<>(); - typeCheckingContext.ifElseForWhileAssignmentTracker.forEach((var, types) -> { - types.stream().filter(t -> t != null && t != UNKNOWN_PARAMETER_TYPE) // GROOVY-6099, GROOVY-10294 - .reduce(WideningCategories::lowestUpperBound).ifPresent(type -> { - assignments.put(var, type); - storeType(var, type); + if (typeCheckingContext.ifElseForWhileAssignmentTracker != null){ // GROOVY-11488 + typeCheckingContext.ifElseForWhileAssignmentTracker.forEach((var, types) -> { + types.stream().filter(t -> t != null && t != UNKNOWN_PARAMETER_TYPE) // GROOVY-6099, GROOVY-10294 + .reduce(WideningCategories::lowestUpperBound).ifPresent(type -> { + assignments.put(var, type); + storeType(var, type); + }); }); - }); + } typeCheckingContext.ifElseForWhileAssignmentTracker = oldTracker; // GROOVY-9786, GROOVY-11450: nested conditional assignments if (oldTracker != null) { diff --git a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy index dd5a9cbc74..4f9069804c 100644 --- a/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy +++ b/src/test/groovy/transform/stc/TypeInferenceSTCTest.groovy @@ -614,6 +614,21 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase { ''', 'Cannot find matching method java.lang.Object#toUpperCase()' } + // GROOVY-11488 + void testNotInstanceOf7() { + assertScript ''' + def test(object) { + if (false) { + return 'not possible' + } else if (object !instanceof Object[]) { + return 'not array' + } + } + assert test(null) == 'not array' + assert test(new Object[0]) == null + ''' + } + // GROOVY-10217 void testInstanceOfThenSubscriptOperator() { assertScript ''' @@ -1401,7 +1416,7 @@ class TypeInferenceSTCTest extends StaticTypeCheckingTestCase { ''' } - // GROOVY- + // GROOVY-6207 void testGetAnnotationFails() { assertScript ''' import groovy.transform.*