@@ -904,8 +904,7 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) {
904
904
}
905
905
906
906
// track conditional assignment
907
- if (!isNullConstant (rightExpression )
908
- && leftExpression instanceof VariableExpression
907
+ if (leftExpression instanceof VariableExpression
909
908
&& typeCheckingContext .ifElseForWhileAssignmentTracker != null ) {
910
909
Variable accessedVariable = ((VariableExpression ) leftExpression ).getAccessedVariable ();
911
910
if (accessedVariable instanceof Parameter ) {
@@ -1081,14 +1080,10 @@ private static Token getOpWithoutEqual(final Expression exp) {
1081
1080
protected ClassNode getOriginalDeclarationType (final Expression lhs ) {
1082
1081
if (lhs instanceof VariableExpression ) {
1083
1082
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 ();
1087
1085
}
1088
- if (var instanceof DynamicVariable ) return getType (lhs );
1089
- return var .getOriginType ();
1090
- }
1091
- if (lhs instanceof FieldExpression ) {
1086
+ } else if (lhs instanceof FieldExpression ) {
1092
1087
return ((FieldExpression ) lhs ).getField ().getOriginType ();
1093
1088
}
1094
1089
return getType (lhs );
@@ -4207,18 +4202,18 @@ private void recordAssignment(final VariableExpression lhsExpr, final ClassNode
4207
4202
4208
4203
private void restoreTypeBeforeConditional () {
4209
4204
typeCheckingContext .ifElseForWhileAssignmentTracker .forEach ((var , types ) -> {
4210
- ClassNode originType = types .get (0 );
4211
- storeType (var , originType );
4205
+ var .putNodeMetaData (INFERRED_TYPE , types .get (0 ));
4212
4206
});
4213
4207
}
4214
4208
4215
4209
protected Map <VariableExpression , ClassNode > popAssignmentTracking (final Map <VariableExpression , List <ClassNode >> oldTracker ) {
4216
4210
Map <VariableExpression , ClassNode > assignments = new HashMap <>();
4217
4211
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
+ });
4222
4217
});
4223
4218
typeCheckingContext .ifElseForWhileAssignmentTracker = oldTracker ;
4224
4219
return assignments ;
@@ -4468,15 +4463,15 @@ protected void storeType(final Expression exp, ClassNode cn) {
4468
4463
if (exp instanceof VariableExpression ) {
4469
4464
VariableExpression var = (VariableExpression ) exp ;
4470
4465
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 () ) {
4480
4475
List <ClassNode > assignedTypes = typeCheckingContext .closureSharedVariablesAssignmentTypes .computeIfAbsent (var , k -> new LinkedList <ClassNode >());
4481
4476
assignedTypes .add (cn );
4482
4477
}
@@ -5132,7 +5127,7 @@ protected ClassNode getType(final ASTNode exp) {
5132
5127
return fieldType ;
5133
5128
}
5134
5129
if (variable != vexp && variable instanceof VariableExpression ) {
5135
- return getType ((Expression ) variable );
5130
+ return getType ((VariableExpression ) variable );
5136
5131
}
5137
5132
if (variable instanceof Parameter ) {
5138
5133
Parameter parameter = (Parameter ) variable ;
0 commit comments