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

Unified Diff: sdk/lib/_internal/compiler/implementation/resolution/members.dart

Issue 304153014: Remove element from DynamicType. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Cleanup Created 6 years, 7 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
Index: sdk/lib/_internal/compiler/implementation/resolution/members.dart
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index af25fce6b9f8db7990cdfdd58ee5aee80de185ea..aa91d807f0b7e4f0875dc42342686eda449ee721 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -37,10 +37,13 @@ abstract class TreeElements {
* Returns [:true:] if [node] is a type literal.
*
* Resolution marks this by setting the type on the node to be the
- * [:Type:] type.
+ * type that the literal refers to.
*/
bool isTypeLiteral(Send node);
+ /// Returns the type that the type literal [node] refers to.
+ DartType getTypeLiteralType(Send node);
+
/// Register additional dependencies required by [currentElement].
/// For example, elements that are used by a backend.
void registerDependency(Element element);
@@ -183,6 +186,10 @@ class TreeElementMapping implements TreeElements {
return getType(node) != null;
}
+ DartType getTypeLiteralType(Send node) {
+ return getType(node);
+ }
+
void registerDependency(Element element) {
if (element == null) return;
otherDependencies.add(element.implementation);
@@ -576,7 +583,7 @@ class ResolverTask extends CompilerTask {
if (tree.type != null) {
element.variables.type = visitor.resolveTypeAnnotation(tree.type);
} else {
- element.variables.type = compiler.types.dynamicType;
+ element.variables.type = const DynamicType();
}
registry.useElement(tree, element);
@@ -626,11 +633,11 @@ class ResolverTask extends CompilerTask {
}
DartType resolveReturnType(Element element, TypeAnnotation annotation) {
- if (annotation == null) return compiler.types.dynamicType;
+ if (annotation == null) return const DynamicType();
DartType result = visitorFor(element).resolveTypeAnnotation(annotation);
if (result == null) {
// TODO(karklose): warning.
- return compiler.types.dynamicType;
+ return const DynamicType();
}
return result;
}
@@ -1683,11 +1690,7 @@ class TypeResolver {
}
} else {
String stringValue = typeName.source;
- if (identical(stringValue, 'dynamic')) {
- element = compiler.dynamicClass;
- } else {
- element = lookupInScope(compiler, typeName, scope, typeName.source);
- }
+ element = lookupInScope(compiler, typeName, scope, typeName.source);
}
return element;
}
@@ -1726,6 +1729,11 @@ class TypeResolver {
checkNoTypeArguments(type);
registry.useType(node, type);
return type;
+ } else if (identical(typeName.source, 'dynamic')) {
+ type = const DynamicType();
+ checkNoTypeArguments(type);
+ registry.useType(node, type);
+ return type;
}
}
@@ -1772,9 +1780,7 @@ class TypeResolver {
MessageKind.NOT_A_TYPE, {'node': node.typeName});
} else {
bool addTypeVariableBoundsCheck = false;
- if (identical(element, compiler.dynamicClass)) {
- type = checkNoTypeArguments(element.computeType(compiler));
- } else if (element.isClass) {
+ if (element.isClass) {
ClassElement cls = element;
// TODO(johnniwinther): [_ensureClassWillBeResolved] should imply
// [computeType].
@@ -2121,7 +2127,11 @@ class ResolverVisitor extends MappingVisitor<Element> {
String name = node.source;
Element element = lookupInScope(compiler, node, scope, name);
if (Elements.isUnresolved(element) && name == 'dynamic') {
- element = compiler.dynamicClass;
+ // TODO(johnniwinther): Remove this hack when we can return more complex
+ // objects that [Element] from this method.
karlklose 2014/06/02 09:39:38 'that' -> 'than'.
Johnni Winther 2014/06/02 09:46:34 Done.
+ element = compiler.typeClass;
+ // Set the type to be `dynamic` to mark that this is a type literal.
+ registry.setType(node, const DynamicType());
}
element = reportLookupErrorIfAny(element, node, node.source);
if (element == null) {
@@ -2593,13 +2603,22 @@ class ResolverVisitor extends MappingVisitor<Element> {
registry.registerTypeVariableExpression();
// Set the type of the node to [Type] to mark this send as a
// type variable expression.
- registry.setType(node, compiler.typeClass.computeType(compiler));
- registry.registerTypeLiteral(target);
+ registry.registerTypeLiteral(node, target.computeType(compiler));
} else if (target.impliesType && (!sendIsMemberAccess || node.isCall)) {
// Set the type of the node to [Type] to mark this send as a
// type literal.
- registry.setType(node, compiler.typeClass.computeType(compiler));
- registry.registerTypeLiteral(target);
+ DartType type;
+
+ // TODO(johnniwinther): Remove this hack when we can pass more complex
+ // information between methods than resolved elements.
+ if (target == compiler.typeClass && node.receiver == null) {
+ // Potentially a 'dynamic' type literal.
+ type = registry.getType(node.selector);
+ }
+ if (type == null) {
+ type = target.computeType(compiler);
+ }
+ registry.registerTypeLiteral(node, type);
// Don't try to make constants of calls to type literals.
if (!node.isCall) {
@@ -2985,7 +3004,7 @@ class ResolverVisitor extends MappingVisitor<Element> {
if (node.type != null) {
type = resolveTypeAnnotation(node.type);
} else {
- type = compiler.types.dynamicType;
+ type = const DynamicType();
}
VariableList variables = new VariableList.node(node, type);
VariableDefinitionsVisitor visitor =
@@ -3781,7 +3800,7 @@ class TypeDefinitionVisitor extends MappingVisitor<DartType> {
const Link<TypeVariableElement>();
seenTypeVariables = seenTypeVariables.prepend(variableElement);
DartType bound = boundType;
- while (bound.kind == TypeKind.TYPE_VARIABLE) {
+ while (bound.isTypeVariable) {
TypeVariableElement element = bound.element;
if (seenTypeVariables.contains(element)) {
if (identical(element, variableElement)) {
@@ -4034,9 +4053,9 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
if (isBlackListed(mixinType)) {
compiler.reportError(mixinNode,
MessageKind.CANNOT_MIXIN, {'type': mixinType});
- } else if (mixinType.kind == TypeKind.TYPE_VARIABLE) {
+ } else if (mixinType.isTypeVariable) {
compiler.reportError(mixinNode, MessageKind.CLASS_NAME_EXPECTED);
- } else if (mixinType.kind == TypeKind.MALFORMED_TYPE) {
+ } else if (mixinType.isMalformed) {
compiler.reportError(mixinNode, MessageKind.CANNOT_MIXIN_MALFORMED);
}
return mixinType;
@@ -4151,7 +4170,7 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
// the interface of the class that was mixed in so always prepend
// that to the interface list.
if (mixinApplication.interfaces == null) {
- if (mixinType.kind == TypeKind.INTERFACE) {
+ if (mixinType.isInterfaceType) {
// Avoid malformed types in the interfaces.
interfaces = interfaces.prepend(mixinType);
}
@@ -4341,7 +4360,7 @@ class ClassResolverVisitor extends TypeDefinitionVisitor {
!identical(lib, compiler.coreLibrary) &&
!identical(lib, compiler.jsHelperLibrary) &&
!identical(lib, compiler.interceptorsLibrary) &&
- (identical(type, compiler.types.dynamicType) ||
+ (type.isDynamic ||
identical(type.element, compiler.boolClass) ||
identical(type.element, compiler.numClass) ||
identical(type.element, compiler.intClass) ||
@@ -4582,7 +4601,7 @@ class ConstructorResolver extends CommonResolverVisitor<Element> {
}
if (type == null) {
if (Elements.isUnresolved(element)) {
- type = compiler.types.dynamicType;
+ type = const DynamicType();
} else {
type = element.enclosingClass.rawType;
}

Powered by Google App Engine
This is Rietveld 408576698