Index: pkg/analyzer/lib/src/generated/resolver.dart |
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart |
index c81696867d9538d39c28f23f7ce8ad095de64a38..d4c1034df62c157e47c908f9fac5c552d6f96750 100644 |
--- a/pkg/analyzer/lib/src/generated/resolver.dart |
+++ b/pkg/analyzer/lib/src/generated/resolver.dart |
@@ -10969,12 +10969,14 @@ class ResolverVisitor extends ScopedVisitor { |
_propagateFalseState(condition); |
_overrideManager.applyOverrides(elseOverrides); |
} else if (!thenIsAbrupt && !elseIsAbrupt) { |
+ List<Map<VariableElement, DartType>> perBranchOverrides = |
+ new List<Map<VariableElement, DartType>>(); |
+ perBranchOverrides.add(thenOverrides); |
+ perBranchOverrides.add(elseOverrides); |
if (AnalysisEngine.instance.enableUnionTypes) { |
- List<Map<VariableElement, DartType>> perBranchOverrides = |
- new List<Map<VariableElement, DartType>>(); |
- perBranchOverrides.add(thenOverrides); |
- perBranchOverrides.add(elseOverrides); |
_overrideManager.joinOverrides(perBranchOverrides); |
+ } else { |
+ _overrideManager.mergeOverrides(perBranchOverrides); |
} |
} |
return null; |
@@ -12776,6 +12778,24 @@ class TypeOverrideManager { |
} |
/** |
+ * Update overrides assuming [perBranchOverrides] is the collection of |
+ * per-branch overrides for *all* branches flowing into a join point. |
+ * |
+ * If a variable type in any of branches is not the same as its type before |
+ * the branching, then its propagated type is reset to `null`. |
+ */ |
+ void mergeOverrides(List<Map<VariableElement, DartType>> perBranchOverrides) { |
+ for (Map<VariableElement, DartType> branch in perBranchOverrides) { |
+ branch.forEach((VariableElement variable, DartType branchType) { |
+ DartType currentType = _currentScope.getType(variable); |
+ if (currentType != branchType) { |
+ _currentScope.resetType(variable); |
+ } |
+ }); |
+ } |
+ } |
+ |
+ /** |
* Set the overridden type of the given element to the given type |
* |
* @param element the element whose type might have been overridden |
@@ -12862,9 +12882,12 @@ class TypeOverrideManager_TypeOverrideScope { |
* @return the overridden type of the given element |
*/ |
DartType getType(Element element) { |
+ if (element is PropertyAccessorElement) { |
+ element = (element as PropertyAccessorElement).variable; |
+ } |
DartType type = _overridenTypes[element]; |
- if (type == null && element is PropertyAccessorElement) { |
- type = _overridenTypes[element.variable]; |
+ if (_overridenTypes.containsKey(element)) { |
+ return type; |
} |
if (type != null) { |
return type; |
@@ -12875,6 +12898,13 @@ class TypeOverrideManager_TypeOverrideScope { |
} |
/** |
+ * Clears the overridden type of the given [element]. |
+ */ |
+ void resetType(VariableElement element) { |
+ _overridenTypes[element] = null; |
+ } |
+ |
+ /** |
* Set the overridden type of the given element to the given type |
* |
* @param element the element whose type might have been overridden |