@@ -904,8 +904,7 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) {
904904 }
905905
906906 // track conditional assignment
907- if (!isNullConstant (rightExpression )
908- && leftExpression instanceof VariableExpression
907+ if (leftExpression instanceof VariableExpression
909908 && typeCheckingContext .ifElseForWhileAssignmentTracker != null ) {
910909 Variable accessedVariable = ((VariableExpression ) leftExpression ).getAccessedVariable ();
911910 if (accessedVariable instanceof Parameter ) {
@@ -1081,14 +1080,10 @@ private static Token getOpWithoutEqual(final Expression exp) {
10811080 protected ClassNode getOriginalDeclarationType (final Expression lhs ) {
10821081 if (lhs instanceof VariableExpression ) {
10831082 Variable var = findTargetVariable ((VariableExpression ) lhs );
1084- if (var instanceof PropertyNode ) {
1085- // Do NOT trust the type of the property node!
1086- return getType (lhs );
1083+ if (!(var instanceof DynamicVariable || var instanceof PropertyNode )) {
1084+ return var .getOriginType ();
10871085 }
1088- if (var instanceof DynamicVariable ) return getType (lhs );
1089- return var .getOriginType ();
1090- }
1091- if (lhs instanceof FieldExpression ) {
1086+ } else if (lhs instanceof FieldExpression ) {
10921087 return ((FieldExpression ) lhs ).getField ().getOriginType ();
10931088 }
10941089 return getType (lhs );
@@ -4207,18 +4202,18 @@ private void recordAssignment(final VariableExpression lhsExpr, final ClassNode
42074202
42084203 private void restoreTypeBeforeConditional () {
42094204 typeCheckingContext .ifElseForWhileAssignmentTracker .forEach ((var , types ) -> {
4210- ClassNode originType = types .get (0 );
4211- storeType (var , originType );
4205+ var .putNodeMetaData (INFERRED_TYPE , types .get (0 ));
42124206 });
42134207 }
42144208
42154209 protected Map <VariableExpression , ClassNode > popAssignmentTracking (final Map <VariableExpression , List <ClassNode >> oldTracker ) {
42164210 Map <VariableExpression , ClassNode > assignments = new HashMap <>();
42174211 typeCheckingContext .ifElseForWhileAssignmentTracker .forEach ((var , types ) -> {
4218- ClassNode type = types .stream ().filter (Objects ::nonNull ) // GROOVY-6099
4219- .reduce (WideningCategories ::lowestUpperBound ).get ();
4220- assignments .put (var , type );
4221- storeType (var , type );
4212+ types .stream ().filter (t -> t != null && t != UNKNOWN_PARAMETER_TYPE ) // GROOVY-6099, GROOVY-10294
4213+ .reduce (WideningCategories ::lowestUpperBound ).ifPresent (type -> {
4214+ assignments .put (var , type );
4215+ storeType (var , type );
4216+ });
42224217 });
42234218 typeCheckingContext .ifElseForWhileAssignmentTracker = oldTracker ;
42244219 return assignments ;
@@ -4468,15 +4463,15 @@ protected void storeType(final Expression exp, ClassNode cn) {
44684463 if (exp instanceof VariableExpression ) {
44694464 VariableExpression var = (VariableExpression ) exp ;
44704465 Variable accessedVariable = var .getAccessedVariable ();
4471- if (accessedVariable != exp && accessedVariable instanceof VariableExpression ) {
4472- storeType (( VariableExpression ) accessedVariable , cn );
4473- }
4474- if (accessedVariable instanceof Parameter
4475- || ( accessedVariable instanceof PropertyNode
4476- && ((PropertyNode ) accessedVariable ).getField ().isSynthetic () )) {
4477- ((ASTNode ) accessedVariable ).putNodeMetaData (INFERRED_TYPE , cn );
4478- }
4479- if (var . isClosureSharedVariable () && cn != null ) {
4466+ if (accessedVariable instanceof VariableExpression ) {
4467+ if ( accessedVariable != exp )
4468+ storeType (( VariableExpression ) accessedVariable , cn );
4469+ } else if (accessedVariable instanceof Parameter
4470+ || accessedVariable instanceof PropertyNode
4471+ && ((PropertyNode ) accessedVariable ).getField ().isSynthetic ()) {
4472+ ((AnnotatedNode ) accessedVariable ).putNodeMetaData (INFERRED_TYPE , cn );
4473+ }
4474+ if (cn != null && var . isClosureSharedVariable () ) {
44804475 List <ClassNode > assignedTypes = typeCheckingContext .closureSharedVariablesAssignmentTypes .computeIfAbsent (var , k -> new LinkedList <ClassNode >());
44814476 assignedTypes .add (cn );
44824477 }
@@ -5132,7 +5127,7 @@ protected ClassNode getType(final ASTNode exp) {
51325127 return fieldType ;
51335128 }
51345129 if (variable != vexp && variable instanceof VariableExpression ) {
5135- return getType ((Expression ) variable );
5130+ return getType ((VariableExpression ) variable );
51365131 }
51375132 if (variable instanceof Parameter ) {
51385133 Parameter parameter = (Parameter ) variable ;
0 commit comments