Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Unified Diff: pkg/analyzer/lib/src/generated/static_type_analyzer.dart

Issue 1049303002: Issue 19929. Record the propagated type into LHS of the assignment. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | pkg/analyzer/test/generated/resolver_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/static_type_analyzer.dart
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 79481baa2099c29eb08c7ac1aaf7384c89b50f16..d1997f3f0495f933b7d00c8740fd4edde86a7c5e 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -153,7 +153,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
DartType overrideType = staticType;
DartType propagatedType = rightHandSide.propagatedType;
if (propagatedType != null) {
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
overrideType = propagatedType;
}
_resolver.overrideExpression(node.leftHandSide, overrideType, true);
@@ -165,7 +165,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
if (!identical(propagatedMethodElement, staticMethodElement)) {
DartType propagatedType =
_computeStaticReturnType(propagatedMethodElement);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
}
}
return null;
@@ -189,7 +189,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
DartType propagatedExpressionType = node.expression.propagatedType;
DartType propagatedType =
flattenFutures(_typeProvider, propagatedExpressionType);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
return null;
}
@@ -248,7 +248,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
if (!identical(propagatedMethodElement, staticMethodElement)) {
DartType propagatedType =
_computeStaticReturnType(propagatedMethodElement);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
}
return null;
}
@@ -271,7 +271,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
@override
Object visitCascadeExpression(CascadeExpression node) {
_recordStaticType(node, _getStaticType(node.target));
- _recordPropagatedTypeIfBetter(node, node.target.propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, node.target.propagatedType);
return null;
}
@@ -383,7 +383,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
DartType functionPropagatedType = node.function.propagatedType;
if (functionPropagatedType is FunctionType) {
DartType propagatedType = functionPropagatedType.returnType;
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
}
return null;
}
@@ -402,7 +402,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
MethodElement propagatedMethodElement = node.propagatedElement;
if (!identical(propagatedMethodElement, staticMethodElement)) {
DartType propagatedType = _computeArgumentType(propagatedMethodElement);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
}
} else {
ExecutableElement staticMethodElement = node.staticElement;
@@ -412,7 +412,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
if (!identical(propagatedMethodElement, staticMethodElement)) {
DartType propagatedType =
_computeStaticReturnType(propagatedMethodElement);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
}
}
return null;
@@ -438,11 +438,11 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
if ("tag" == constructorName) {
DartType returnType = _getFirstArgumentAsTypeWithMap(
library, node.argumentList, _HTML_ELEMENT_TO_CLASS_MAP);
- _recordPropagatedTypeIfBetter(node, returnType);
+ _resolver.recordPropagatedTypeIfBetter(node, returnType);
} else {
DartType returnType = _getElementNameAsType(
library, constructorName, _HTML_ELEMENT_TO_CLASS_MAP);
- _recordPropagatedTypeIfBetter(node, returnType);
+ _resolver.recordPropagatedTypeIfBetter(node, returnType);
}
}
}
@@ -581,7 +581,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
DartType staticType = variable.type;
_recordStaticType(methodNameNode, staticType);
DartType propagatedType = _overrideManager.getType(variable);
- _recordPropagatedTypeIfBetter(methodNameNode, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(methodNameNode, propagatedType);
}
// Record static return type of the static element.
DartType staticStaticType = _computeStaticReturnType(staticMethodElement);
@@ -589,7 +589,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
// Record propagated return type of the static element.
DartType staticPropagatedType =
_computePropagatedReturnType(staticMethodElement);
- _recordPropagatedTypeIfBetter(node, staticPropagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, staticPropagatedType);
// Check for special cases.
bool needPropagatedType = true;
String methodName = methodNameNode.name;
@@ -743,11 +743,13 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
// Record static return type of the propagated element.
DartType propagatedStaticType =
_computeStaticReturnType(propagatedElement);
- _recordPropagatedTypeIfBetter(node, propagatedStaticType, true);
+ _resolver.recordPropagatedTypeIfBetter(
+ node, propagatedStaticType, true);
// Record propagated return type of the propagated element.
DartType propagatedPropagatedType =
_computePropagatedReturnType(propagatedElement);
- _recordPropagatedTypeIfBetter(node, propagatedPropagatedType, true);
+ _resolver.recordPropagatedTypeIfBetter(
+ node, propagatedPropagatedType, true);
}
}
return null;
@@ -757,7 +759,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
Object visitNamedExpression(NamedExpression node) {
Expression expression = node.expression;
_recordStaticType(node, _getStaticType(expression));
- _recordPropagatedTypeIfBetter(node, expression.propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, expression.propagatedType);
return null;
}
@@ -775,7 +777,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
Object visitParenthesizedExpression(ParenthesizedExpression node) {
Expression expression = node.expression;
_recordStaticType(node, _getStaticType(expression));
- _recordPropagatedTypeIfBetter(node, expression.propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, expression.propagatedType);
return null;
}
@@ -818,7 +820,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
}
}
_recordStaticType(node, staticType);
- _recordPropagatedTypeIfBetter(node, operand.propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, operand.propagatedType);
return null;
}
@@ -893,8 +895,8 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
overriddenType.isMoreSpecificThan(propagatedType))) {
propagatedType = overriddenType;
}
- _recordPropagatedTypeIfBetter(prefixedIdentifier, propagatedType);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(prefixedIdentifier, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
return null;
}
@@ -924,7 +926,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
if (!identical(propagatedMethodElement, staticMethodElement)) {
DartType propagatedType =
_computeStaticReturnType(propagatedMethodElement);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
}
}
return null;
@@ -998,8 +1000,8 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
} else {
// TODO(brianwilkerson) Report this internal error.
}
- _recordPropagatedTypeIfBetter(propertyName, propagatedType);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(propertyName, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
return null;
}
@@ -1097,7 +1099,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
propagatedType = overriddenType;
}
}
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
return null;
}
@@ -1171,7 +1173,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
if (initializer != null) {
DartType rightType = initializer.bestType;
SimpleIdentifier name = node.name;
- _recordPropagatedTypeIfBetter(name, rightType);
+ _resolver.recordPropagatedTypeIfBetter(name, rightType);
VariableElement element = name.staticElement as VariableElement;
if (element != null) {
_resolver.overrideVariable(element, rightType, true);
@@ -1212,7 +1214,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
}
DartType propagatedType =
propagatedType1.getLeastUpperBound(propagatedType2);
- _recordPropagatedTypeIfBetter(node, propagatedType);
+ _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
}
}
@@ -1636,41 +1638,6 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
}
/**
- * If the given [type] is valid, strongly more specific than the
- * existing static type of the given [expression], record it as a propagated
- * type of the given [expression]. Otherwise, reset it to `null`.
- *
- * If [hasOldPropagatedType] is `true` then the existing propagated type
- * should also is checked.
- */
- void _recordPropagatedTypeIfBetter(Expression expression, DartType type,
- [bool hasOldPropagatedType = false]) {
- // Ensure that propagated type invalid.
- if (type == null || type.isDynamic || type.isBottom) {
- if (!hasOldPropagatedType) {
- expression.propagatedType = null;
- }
- return;
- }
- // Ensure that propagated type is more specific than the static type.
- DartType staticType = expression.staticType;
- if (type == staticType || !type.isMoreSpecificThan(staticType)) {
- expression.propagatedType = null;
- return;
- }
- // Ensure that the new propagated type is more specific than the old one.
- if (hasOldPropagatedType) {
- DartType oldPropagatedType = expression.propagatedType;
- if (oldPropagatedType != null &&
- !type.isMoreSpecificThan(oldPropagatedType)) {
- return;
- }
- }
- // OK
- expression.propagatedType = type;
- }
-
- /**
* Given a function element and its body, compute and record the propagated return type of the
* function.
*
« no previous file with comments | « pkg/analyzer/lib/src/generated/resolver.dart ('k') | pkg/analyzer/test/generated/resolver_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698