Chromium Code Reviews| 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 7a27b1d398e436ca27dc88b2d924da81808c55bf..2357d2aa242a914dded2feb81fd30eca0971f81b 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart |
| @@ -3606,7 +3606,9 @@ class ClassResolverVisitor extends TypeDefinitionVisitor { |
| DartType supertype = resolveSupertype(element, superMixin.superclass); |
| Link<Node> link = superMixin.mixins.nodes; |
| while (!link.isEmpty) { |
| - supertype = applyMixin(supertype, resolveType(link.head), node); |
|
karlklose
2013/10/03 07:50:01
How about: 'resolveType' -> 'checkMixinType'?
Johnni Winther
2013/10/03 08:00:26
Done.
|
| + TypeAnnotation mixinNode = link.head; |
| + DartType mixinType = checkMixinType(mixinNode); |
| + supertype = applyMixin(supertype, mixinType, mixinNode); |
| link = link.tail; |
| } |
| element.supertype = supertype; |
| @@ -3657,6 +3659,17 @@ class ClassResolverVisitor extends TypeDefinitionVisitor { |
| return element.computeType(compiler); |
| } |
| + /// Resolves the mixed type for [mixinNode] and checks that the the mixin type |
| + /// is not black-listed. The mixin type is returned. |
| + DartType checkMixinType(TypeAnnotation mixinNode) { |
| + DartType mixinType = resolveType(mixinNode); |
| + if (isBlackListed(mixinType)) { |
| + compiler.reportError(mixinNode, |
| + MessageKind.CANNOT_MIXIN, {'type': mixinType}); |
| + } |
| + return mixinType; |
| + } |
| + |
| DartType visitNamedMixinApplication(NamedMixinApplication node) { |
| compiler.ensure(element != null); |
| compiler.ensure(element.resolutionState == STATE_STARTED); |
| @@ -3670,10 +3683,12 @@ class ClassResolverVisitor extends TypeDefinitionVisitor { |
| DartType supertype = resolveSupertype(element, node.superclass); |
| Link<Node> link = node.mixins.nodes; |
| while (!link.tail.isEmpty) { |
| - supertype = applyMixin(supertype, resolveType(link.head), link.head); |
|
karlklose
2013/10/03 07:50:01
Ditto.
Johnni Winther
2013/10/03 08:00:26
Done.
|
| + TypeAnnotation mixinNode = link.head; |
| + DartType mixinType = checkMixinType(mixinNode); |
| + supertype = applyMixin(supertype, mixinType, mixinNode); |
| link = link.tail; |
| } |
| - doApplyMixinTo(element, supertype, resolveType(link.head)); |
| + doApplyMixinTo(element, supertype, checkMixinType(link.head)); |
| return element.computeType(compiler); |
| } |
| @@ -3706,6 +3721,7 @@ class ClassResolverVisitor extends TypeDefinitionVisitor { |
| void doApplyMixinTo(MixinApplicationElement mixinApplication, |
| DartType supertype, |
| DartType mixinType) { |
| + |
|
karlklose
2013/10/03 07:50:01
Remove extra line.
Johnni Winther
2013/10/03 08:00:26
Done.
|
| Node node = mixinApplication.parseNode(compiler); |
| if (mixinApplication.supertype != null) { |