Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/StaticTypeAnalyzer.java |
diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/StaticTypeAnalyzer.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/StaticTypeAnalyzer.java |
index b9e09118fc2d2ae350ee34a6bee9dd8cc0d442dd..9c348d57152d002d3897c2443d240258a3f30764 100644 |
--- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/StaticTypeAnalyzer.java |
+++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/StaticTypeAnalyzer.java |
@@ -73,6 +73,7 @@ import com.google.dart.engine.element.MethodElement; |
import com.google.dart.engine.element.ParameterElement; |
import com.google.dart.engine.element.PrefixElement; |
import com.google.dart.engine.element.PropertyAccessorElement; |
+import com.google.dart.engine.element.PropertyInducingElement; |
import com.google.dart.engine.element.TypeParameterElement; |
import com.google.dart.engine.element.VariableElement; |
import com.google.dart.engine.internal.element.ExecutableElementImpl; |
@@ -1017,6 +1018,7 @@ public class StaticTypeAnalyzer extends SimpleAstVisitor<Void> { |
SimpleIdentifier prefixedIdentifier = node.getIdentifier(); |
Element staticElement = prefixedIdentifier.getStaticElement(); |
Type staticType = dynamicType; |
+ Type propagatedType = null; |
if (staticElement instanceof ClassElement) { |
if (isNotTypeLiteral(node)) { |
staticType = ((ClassElement) staticElement).getType(); |
@@ -1035,6 +1037,7 @@ public class StaticTypeAnalyzer extends SimpleAstVisitor<Void> { |
staticType = getTypeOfProperty( |
(PropertyAccessorElement) staticElement, |
node.getPrefix().getStaticType()); |
+ propagatedType = getPropertyPropagatedType(staticElement, propagatedType); |
} else if (staticElement instanceof ExecutableElement) { |
staticType = ((ExecutableElement) staticElement).getType(); |
} else if (staticElement instanceof TypeParameterElement) { |
@@ -1046,7 +1049,6 @@ public class StaticTypeAnalyzer extends SimpleAstVisitor<Void> { |
recordStaticType(node, staticType); |
Element propagatedElement = prefixedIdentifier.getPropagatedElement(); |
- Type propagatedType = null; |
if (propagatedElement instanceof ClassElement) { |
if (isNotTypeLiteral(node)) { |
propagatedType = ((ClassElement) propagatedElement).getType(); |
@@ -1061,6 +1063,7 @@ public class StaticTypeAnalyzer extends SimpleAstVisitor<Void> { |
propagatedType = getTypeOfProperty( |
(PropertyAccessorElement) propagatedElement, |
node.getPrefix().getStaticType()); |
+ propagatedType = getPropertyPropagatedType(propagatedElement, propagatedType); |
} else if (propagatedElement instanceof ExecutableElement) { |
propagatedType = ((ExecutableElement) propagatedElement).getType(); |
} else if (propagatedElement instanceof TypeParameterElement) { |
@@ -1283,7 +1286,14 @@ public class StaticTypeAnalyzer extends SimpleAstVisitor<Void> { |
recordStaticType(node, staticType); |
// TODO(brianwilkerson) I think we want to repeat the logic above using the propagated element |
// to get another candidate for the propagated type. |
- Type propagatedType = overrideManager.getType(element); |
+ Type propagatedType = getPropertyPropagatedType(element, null); |
+ if (propagatedType == null) { |
+ Type overriddenType = overrideManager.getType(element); |
+ if (propagatedType == null || overriddenType != null |
+ && overriddenType.isMoreSpecificThan(propagatedType)) { |
+ propagatedType = overriddenType; |
+ } |
+ } |
if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) { |
recordPropagatedType(node, propagatedType); |
} |
@@ -1631,6 +1641,24 @@ public class StaticTypeAnalyzer extends SimpleAstVisitor<Void> { |
} |
/** |
+ * Return the propagated type of the given {@link Element}, or {@code null}. |
+ */ |
+ private Type getPropertyPropagatedType(Element element, Type currentType) { |
+ if (element instanceof PropertyAccessorElement) { |
+ PropertyAccessorElement accessor = (PropertyAccessorElement) element; |
+ if (accessor.isGetter()) { |
+ PropertyInducingElement variable = accessor.getVariable(); |
+ Type propagatedType = variable.getPropagatedType(); |
+ if (currentType == null || propagatedType != null |
+ && propagatedType.isMoreSpecificThan(currentType)) { |
+ return propagatedType; |
+ } |
+ } |
+ } |
+ return currentType; |
+ } |
+ |
+ /** |
* Return the static type of the given expression. |
* |
* @param expression the expression whose type is to be returned |