@@ -869,13 +869,15 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) {
869
869
}
870
870
871
871
// if we are in an if/else branch, keep track of assignment
872
- if (typeCheckingContext .ifElseForWhileAssignmentTracker != null && leftExpression instanceof VariableExpression
873
- && !isNullConstant (rightExpression )) {
872
+ if (!isNullConstant (rightExpression )
873
+ && leftExpression instanceof VariableExpression
874
+ && typeCheckingContext .ifElseForWhileAssignmentTracker != null ) {
874
875
Variable accessedVariable = ((VariableExpression ) leftExpression ).getAccessedVariable ();
875
876
if (accessedVariable instanceof Parameter ) {
876
877
accessedVariable = new ParameterVariableExpression ((Parameter ) accessedVariable );
877
878
}
878
879
if (accessedVariable instanceof VariableExpression ) {
880
+ /* GRECLIPSE edit -- GROOVY-9786
879
881
VariableExpression var = (VariableExpression) accessedVariable;
880
882
List<ClassNode> types = typeCheckingContext.ifElseForWhileAssignmentTracker.get(var);
881
883
if (types == null) {
@@ -885,6 +887,9 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) {
885
887
typeCheckingContext.ifElseForWhileAssignmentTracker.put(var, types);
886
888
}
887
889
types.add(resultType);
890
+ */
891
+ recordAssignment ((VariableExpression ) accessedVariable , resultType );
892
+ // GRECLIPSE end
888
893
}
889
894
}
890
895
storeType (leftExpression , resultType );
@@ -3889,7 +3894,6 @@ protected void typeCheckClosureCall(final Expression callArguments, final ClassN
3889
3894
@ Override
3890
3895
public void visitIfElse (final IfStatement ifElse ) {
3891
3896
Map <VariableExpression , List <ClassNode >> oldTracker = pushAssignmentTracking ();
3892
-
3893
3897
try {
3894
3898
// create a new temporary element in the if-then-else type info
3895
3899
typeCheckingContext .pushTemporaryTypeInfo ();
@@ -3904,15 +3908,26 @@ public void visitIfElse(final IfStatement ifElse) {
3904
3908
restoreTypeBeforeConditional ();
3905
3909
3906
3910
ifElse .getElseBlock ().visit (this );
3911
+ // GRECLIPSE add -- GROOVY-9786
3912
+ Map <VariableExpression , ClassNode > updates =
3913
+ ifElse .getElseBlock ().getNodeMetaData ("assignments" );
3914
+ if (updates != null ) {
3915
+ updates .forEach (this ::recordAssignment );
3916
+ }
3917
+ // GRECLIPSE end
3907
3918
} finally {
3908
- popAssignmentTracking (oldTracker );
3909
- }
3910
- BinaryExpression instanceOfExpression = findInstanceOfNotReturnExpression (ifElse );
3911
- if (instanceOfExpression == null ) {
3912
- instanceOfExpression = findNotInstanceOfReturnExpression (ifElse );
3919
+ // GRECLIPSE add
3920
+ ifElse .putNodeMetaData ("assignments" ,
3921
+ // GRECLIPSE end
3922
+ popAssignmentTracking (oldTracker ));
3913
3923
}
3914
- if (instanceOfExpression != null ) {
3915
- if (!typeCheckingContext .enclosingBlocks .isEmpty ()) {
3924
+
3925
+ if (!typeCheckingContext .enclosingBlocks .isEmpty ()) {
3926
+ BinaryExpression instanceOfExpression = findInstanceOfNotReturnExpression (ifElse );
3927
+ if (instanceOfExpression == null ) {
3928
+ instanceOfExpression = findNotInstanceOfReturnExpression (ifElse );
3929
+ }
3930
+ if (instanceOfExpression != null ) {
3916
3931
visitInstanceofNot (instanceOfExpression );
3917
3932
}
3918
3933
}
@@ -4062,6 +4077,17 @@ public void visitCaseStatement(final CaseStatement statement) {
4062
4077
restoreTypeBeforeConditional ();
4063
4078
}
4064
4079
4080
+ // GRECLIPSE add -- GROOVY-9786
4081
+ private void recordAssignment (final VariableExpression lhsExpr , final ClassNode rhsType ) {
4082
+ typeCheckingContext .ifElseForWhileAssignmentTracker .computeIfAbsent (lhsExpr , lhs -> {
4083
+ ClassNode lhsType = lhs .getNodeMetaData (INFERRED_TYPE );
4084
+ List <ClassNode > types = new ArrayList <>(2 );
4085
+ types .add (lhsType );
4086
+ return types ;
4087
+ }).add (rhsType );
4088
+ }
4089
+ // GRECLIPSE end
4090
+
4065
4091
private void restoreTypeBeforeConditional () {
4066
4092
Set <Map .Entry <VariableExpression , List <ClassNode >>> entries = typeCheckingContext .ifElseForWhileAssignmentTracker .entrySet ();
4067
4093
for (Map .Entry <VariableExpression , List <ClassNode >> entry : entries ) {
0 commit comments