Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/typechecker.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart |
| index 990dc32de9c144a80983f75fd3044ec1f195085c..6007cc1c75933cc7f7852f2f96e34ffa59500b5f 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/typechecker.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart |
| @@ -240,48 +240,6 @@ class VoidType extends DartType { |
| String toString() => name.slowToString(); |
| } |
| -/** |
| - * Helper method for performing substitution of a linked list of types. |
| - * |
| - * If no types are changed by the substitution, the [types] is returned instead |
| - * of a newly created linked list. |
| - */ |
| -Link<DartType> substTypes(Link<DartType> types, |
| - Link<DartType> arguments, Link<DartType> parameters) { |
| - bool changed = false; |
| - var builder = new LinkBuilder<DartType>(); |
| - Link<DartType> typeLink = types; |
| - while (!typeLink.isEmpty) { |
| - var argument = typeLink.head.subst(arguments, parameters); |
| - if (!changed && !identical(argument, typeLink.head)) { |
| - changed = true; |
| - } |
| - builder.addLast(argument); |
| - typeLink = typeLink.tail; |
| - } |
| - if (changed) { |
| - // Create a new link only if necessary. |
| - return builder.toLink(); |
| - } |
| - return types; |
| -} |
| - |
| -/** |
| - * Combine error messages in a malformed type to a single message string. |
| - */ |
| -String fetchReasonsFromMalformedType(DartType type) { |
| - // TODO(johnniwinther): Figure out how to produce good error message in face |
| - // of multiple errors, and how to ensure non-localized error messages. |
| - var reasons = new List<String>(); |
| - type.forEachMalformedType((MalformedType malformedType) { |
| - ErroneousElement error = malformedType.element; |
| - Message message = error.messageKind.message(error.messageArguments); |
| - reasons.add(message.toString()); |
| - return true; |
| - }); |
| - return Strings.join(reasons, ', '); |
| -} |
| - |
| class MalformedType extends DartType { |
| final ErroneousElement element; |
| @@ -379,7 +337,7 @@ class InterfaceType extends DartType { |
| return this; |
| } |
| Link<DartType> newTypeArguments = |
| - substTypes(typeArguments, arguments, parameters); |
| + Types.substTypes(typeArguments, arguments, parameters); |
| if (!identical(typeArguments, newTypeArguments)) { |
| // Create a new type only if necessary. |
| return new InterfaceType(element, newTypeArguments); |
| @@ -396,6 +354,24 @@ class InterfaceType extends DartType { |
| return true; |
| } |
| + /** |
| + * Returns the type as an instance of class [other], if possible, null |
| + * otherwise. |
| + */ |
| + DartType asInstanceOf(ClassElement other) { |
| + if (element == other) return this; |
| + for (InterfaceType supertype in element.allSupertypes) { |
| + ClassElement superclass = supertype.element; |
| + if (superclass == other) { |
| + Link<DartType> arguments = Types.substTypes(supertype.typeArguments, |
| + typeArguments, |
| + element.typeVariables); |
| + return new InterfaceType(superclass, arguments); |
| + } |
| + } |
| + return null; |
| + } |
| + |
| DartType unalias(Compiler compiler) => this; |
| String toString() { |
| @@ -456,7 +432,8 @@ class FunctionType extends DartType { |
| } |
| var newReturnType = returnType.subst(arguments, parameters); |
| bool changed = !identical(newReturnType, returnType); |
| - var newParameterTypes = substTypes(parameterTypes, arguments, parameters); |
| + var newParameterTypes = Types.substTypes(parameterTypes, arguments, |
| + parameters); |
| if (!changed && !identical(parameterTypes, newParameterTypes)) { |
| changed = true; |
| } |
| @@ -546,8 +523,8 @@ class TypedefType extends DartType { |
| // Return fast on empty substitutions. |
| return this; |
| } |
| - Link<DartType> newTypeArguments = |
| - substTypes(typeArguments, arguments, parameters); |
| + Link<DartType> newTypeArguments = Types.substTypes(typeArguments, arguments, |
| + parameters); |
| if (!identical(typeArguments, newTypeArguments)) { |
| // Create a new type only if necessary. |
| return new TypedefType(element, newTypeArguments); |
| @@ -676,6 +653,50 @@ class Types { |
| bool isAssignable(DartType r, DartType s) { |
| return isSubtype(r, s) || isSubtype(s, r); |
| } |
| + |
| + |
| + /** |
| + * Helper method for performing substitution of a linked list of types. |
| + * |
| + * If no types are changed by the substitution, the [types] is returned |
| + * instead of a newly created linked list. |
| + */ |
| + static Link<DartType> substTypes(Link<DartType> types, |
|
ahe
2012/12/14 08:00:19
Was this method changed? If not, why was it moved
karlklose
2013/01/08 14:01:43
It is unchanged. I moved this method from a top-le
|
| + Link<DartType> arguments, |
| + Link<DartType> parameters) { |
| + bool changed = false; |
| + var builder = new LinkBuilder<DartType>(); |
| + Link<DartType> typeLink = types; |
| + while (!typeLink.isEmpty) { |
| + var argument = typeLink.head.subst(arguments, parameters); |
| + if (!changed && !identical(argument, typeLink.head)) { |
| + changed = true; |
| + } |
| + builder.addLast(argument); |
| + typeLink = typeLink.tail; |
| + } |
| + if (changed) { |
| + // Create a new link only if necessary. |
| + return builder.toLink(); |
| + } |
| + return types; |
| + } |
| + |
| + /** |
| + * Combine error messages in a malformed type to a single message string. |
| + */ |
| + static String fetchReasonsFromMalformedType(DartType type) { |
|
ahe
2012/12/14 08:00:19
Was this method changed?
karlklose
2013/01/08 14:01:43
Not changed. See above for the reason to move it.
|
| + // TODO(johnniwinther): Figure out how to produce good error message in face |
| + // of multiple errors, and how to ensure non-localized error messages. |
| + var reasons = new List<String>(); |
| + type.forEachMalformedType((MalformedType malformedType) { |
| + ErroneousElement error = malformedType.element; |
| + Message message = error.messageKind.message(error.messageArguments); |
| + reasons.add(message.toString()); |
| + return true; |
| + }); |
| + return Strings.join(reasons, ', '); |
| + } |
| } |
| class CancelTypeCheckException { |