Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java')
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java30
1 files changed, 28 insertions, 2 deletions
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
index 8498b31c09..5736ac48a4 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2011, 2016 GK Software AG and others.
+ * Copyright (c) 2011, 2019 GK Software AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -180,6 +180,14 @@ public class FakedTrackingVariable extends LocalDeclaration {
return falseTrackingVariable;
}
return getCloseTrackingVariable(((ConditionalExpression)expression).valueIfTrue, flowInfo, flowContext);
+ } else if (expression instanceof SwitchExpression) {
+ for (Expression re : ((SwitchExpression) expression).resultExpressions) {
+ FakedTrackingVariable fakedTrackingVariable = getCloseTrackingVariable(re, flowInfo, flowContext);
+ if (fakedTrackingVariable != null) {
+ return fakedTrackingVariable;
+ }
+ }
+ return null;
}
else
break;
@@ -242,12 +250,21 @@ public class FakedTrackingVariable extends LocalDeclaration {
}
}
+ private static boolean containsAllocation(SwitchExpression location) {
+ for (Expression re : location.resultExpressions) {
+ if (containsAllocation(re))
+ return true;
+ }
+ return false;
+ }
private static boolean containsAllocation(ASTNode location) {
if (location instanceof AllocationExpression)
return true;
if (location instanceof ConditionalExpression) {
ConditionalExpression conditional = (ConditionalExpression) location;
return containsAllocation(conditional.valueIfTrue) || containsAllocation(conditional.valueIfFalse);
+ } else if (location instanceof SwitchExpression) {
+ return containsAllocation((SwitchExpression) location);
}
if (location instanceof CastExpression)
return containsAllocation(((CastExpression) location).expression);
@@ -260,6 +277,8 @@ public class FakedTrackingVariable extends LocalDeclaration {
preConnectTrackerAcrossAssignment(location, local, flowInfo, (AllocationExpression) expression, closeTracker);
} else if (expression instanceof ConditionalExpression) {
preConnectTrackerAcrossAssignment(location, local, flowInfo, (ConditionalExpression) expression, closeTracker);
+ } else if (expression instanceof SwitchExpression) {
+ preConnectTrackerAcrossAssignment(location, local, flowInfo, (SwitchExpression) expression, closeTracker);
} else if (expression instanceof CastExpression) {
preConnectTrackerAcrossAssignment(location, local, ((CastExpression) expression).expression, flowInfo);
}
@@ -272,6 +291,13 @@ public class FakedTrackingVariable extends LocalDeclaration {
}
private static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, FlowInfo flowInfo,
+ SwitchExpression se, FakedTrackingVariable closeTracker) {
+ for (Expression re : se.resultExpressions) {
+ preConnectTrackerAcrossAssignment(location, local, flowInfo, closeTracker, re);
+ }
+ }
+
+ private static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, FlowInfo flowInfo,
AllocationExpression allocationExpression, FakedTrackingVariable closeTracker) {
allocationExpression.closeTracker = closeTracker;
if (allocationExpression.arguments != null && allocationExpression.arguments.length > 0) {
@@ -456,7 +482,7 @@ public class FakedTrackingVariable extends LocalDeclaration {
rhsTrackVar.globalClosingState &= ~(SHARED_WITH_OUTSIDE|OWNED_BY_OUTSIDE|FOREACH_ELEMENT_VAR);
}
} else {
- if (rhs instanceof AllocationExpression || rhs instanceof ConditionalExpression) {
+ if (rhs instanceof AllocationExpression || rhs instanceof ConditionalExpression || rhs instanceof SwitchExpression) {
if (rhsTrackVar == disconnectedTracker)
return; // b.: self wrapper: res = new Wrap(res); -> done!
if (local.closeTracker == rhsTrackVar

Back to the top