Index: pkg/analyzer/lib/src/generated/element_resolver.dart |
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart |
index b7342b30f7c66ea639df4e55953ea67e8a3649d7..70defdf999475ca316dc0ea42cdd9504d300e810 100644 |
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart |
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart |
@@ -102,7 +102,7 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
/** |
* The type representing the type 'type'. |
*/ |
- DartType _typeType; |
+ InterfaceType _typeType; |
/** |
* A utility class for the resolver to answer the question of "what are my |
@@ -594,8 +594,6 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
} |
Element staticElement; |
Element propagatedElement; |
- DartType staticType = null; |
- DartType propagatedType = null; |
if (target == null) { |
staticElement = _resolveInvokedElement(methodName); |
propagatedElement = null; |
@@ -611,8 +609,6 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
methodName.staticElement = importedLibrary.loadLibraryFunction; |
return null; |
} else { |
- staticType = _getStaticType(target); |
- propagatedType = _getPropagatedType(target); |
// |
// If this method invocation is of the form 'C.m' where 'C' is a class, |
// then we don't call resolveInvokedElement(...) which walks up the class |
@@ -622,8 +618,13 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
bool isConditional = node.operator.type == sc.TokenType.QUESTION_PERIOD; |
ClassElementImpl typeReference = getTypeReference(target); |
if (typeReference != null) { |
+ if (node.isCascaded) { |
+ typeReference = _typeType.element; |
+ } |
staticElement = _resolveElement(typeReference, methodName); |
} else { |
+ DartType staticType = _getStaticType(target); |
+ DartType propagatedType = _getPropagatedType(target); |
staticElement = _resolveInvokedElementWithTarget( |
target, staticType, methodName, isConditional); |
// If we have propagated type information use it (since it should |
@@ -773,17 +774,19 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
// resolveArgumentsToParameters(node.getArgumentList(), invokedFunction); |
return null; |
} |
- ClassElementImpl typeReference = getTypeReference(target); |
- if (typeReference != null) { |
- ConstructorElement constructor = |
- typeReference.getNamedConstructor(methodName.name); |
- if (constructor != null) { |
- _recordUndefinedNode( |
- typeReference, |
- StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR, |
- methodName, |
- [methodName.name, typeReference.name]); |
- return null; |
+ if (!node.isCascaded) { |
+ ClassElementImpl typeReference = getTypeReference(target); |
+ if (typeReference != null) { |
+ ConstructorElement constructor = |
+ typeReference.getNamedConstructor(methodName.name); |
+ if (constructor != null) { |
+ _recordUndefinedNode( |
+ typeReference, |
+ StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR, |
+ methodName, |
+ [methodName.name, typeReference.name]); |
+ return null; |
+ } |
} |
} |
targetTypeName = targetType == null ? null : targetType.displayName; |
@@ -923,7 +926,7 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
// Otherwise, the prefix is really an expression that happens to be a simple |
// identifier and this is really equivalent to a property access node. |
// |
- _resolvePropertyAccess(prefix, identifier); |
+ _resolvePropertyAccess(prefix, identifier, false); |
return null; |
} |
@@ -979,7 +982,7 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
return null; |
} |
SimpleIdentifier propertyName = node.propertyName; |
- _resolvePropertyAccess(target, propertyName); |
+ _resolvePropertyAccess(target, propertyName, node.isCascaded); |
return null; |
} |
@@ -2251,7 +2254,7 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
} |
void _resolvePropertyAccess( |
- Expression target, SimpleIdentifier propertyName) { |
+ Expression target, SimpleIdentifier propertyName, bool isCascaded) { |
DartType staticType = _getStaticType(target); |
DartType propagatedType = _getPropagatedType(target); |
Element staticElement = null; |
@@ -2264,6 +2267,9 @@ class ElementResolver extends SimpleAstVisitor<Object> { |
// |
ClassElementImpl typeReference = getTypeReference(target); |
if (typeReference != null) { |
+ if (isCascaded) { |
+ typeReference = _typeType.element; |
+ } |
// TODO(brianwilkerson) Why are we setting the propagated element here? |
// It looks wrong. |
staticElement = |