GROOVY-6207: Fix flow typing reset after if branch
diff --git a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index f732fed..4d84fd2 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -2479,9 +2479,9 @@
// DECLARATION_INFERRED_TYPE is the type which should be used for the initial type declaration
ClassNode oldDIT = (ClassNode) exp.getNodeMetaData(StaticTypesMarker.DECLARATION_INFERRED_TYPE);
if (oldDIT != null) {
- exp.putNodeMetaData(StaticTypesMarker.DECLARATION_INFERRED_TYPE, lowestUpperBound(oldDIT, cn));
+ exp.putNodeMetaData(StaticTypesMarker.DECLARATION_INFERRED_TYPE, cn==null?oldDIT : lowestUpperBound(oldDIT, cn));
} else {
- exp.putNodeMetaData(StaticTypesMarker.DECLARATION_INFERRED_TYPE, lowestUpperBound(oldValue, cn));
+ exp.putNodeMetaData(StaticTypesMarker.DECLARATION_INFERRED_TYPE, cn==null?oldValue : lowestUpperBound(oldValue, cn));
}
}
if (exp instanceof VariableExpression) {
diff --git a/src/test/org/codehaus/groovy/classgen/asm/sc/TypeInferenceStaticCompileTest.groovy b/src/test/org/codehaus/groovy/classgen/asm/sc/TypeInferenceStaticCompileTest.groovy
index c2cff57..92eddc7 100644
--- a/src/test/org/codehaus/groovy/classgen/asm/sc/TypeInferenceStaticCompileTest.groovy
+++ b/src/test/org/codehaus/groovy/classgen/asm/sc/TypeInferenceStaticCompileTest.groovy
@@ -50,5 +50,54 @@
println astTrees
}
}
+
+ // GROOVY-
+ void testGetAnnotationFail() {
+ try {
+ assertScript '''import groovy.transform.*
+ import java.lang.annotation.ElementType;
+ import java.lang.annotation.Retention;
+ import java.lang.annotation.RetentionPolicy;
+ import java.lang.annotation.Target;
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target([ElementType.FIELD])
+ @interface Ann1 {}
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target([ElementType.FIELD])
+ @interface Ann2 {}
+
+ class A {
+ @Ann2
+ String field
+ }
+
+ @ASTTest(phase=INSTRUCTION_SELECTION,value={
+ lookup('second').each {
+ assert it.expression.getNodeMetaData(INFERRED_TYPE).name == 'Ann2'
+ }
+ })
+ def doit(obj, String propName) {
+ def field = obj.getClass().getDeclaredField propName
+ println field
+ if(field) {
+ @ASTTest(phase=INSTRUCTION_SELECTION,value={
+ assert node.getNodeMetaData(INFERRED_TYPE).name == 'Ann1'
+ })
+ def annotation = field.getAnnotation Ann1
+ if(true) {
+ second: annotation = field.getAnnotation Ann2
+ }
+ return annotation
+ }
+ return null
+ }
+
+ assert Ann2.isAssignableFrom (doit(new A(), "field").class)
+ '''
+ } finally {
+ println astTrees
+ }
+ }
}