| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library universe; | 5 library universe; |
| 6 | 6 |
| 7 import '../elements/elements.dart'; | 7 import '../elements/elements.dart'; |
| 8 import '../dart2jslib.dart'; | 8 import '../dart2jslib.dart'; |
| 9 import '../dart_types.dart'; | 9 import '../dart_types.dart'; |
| 10 import '../types/types.dart'; | 10 import '../types/types.dart'; |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 Map<TypeMask, TypedSelector> map = canonicalizedValues.putIfAbsent(untyped, | 631 Map<TypeMask, TypedSelector> map = canonicalizedValues.putIfAbsent(untyped, |
| 632 () => new Map<TypeMask, TypedSelector>()); | 632 () => new Map<TypeMask, TypedSelector>()); |
| 633 TypedSelector result = map[mask]; | 633 TypedSelector result = map[mask]; |
| 634 if (result == null) { | 634 if (result == null) { |
| 635 int hashCode = Selector.mixHashCodeBits(untyped.hashCode, mask.hashCode); | 635 int hashCode = Selector.mixHashCodeBits(untyped.hashCode, mask.hashCode); |
| 636 result = map[mask] = new TypedSelector.internal(mask, untyped, hashCode); | 636 result = map[mask] = new TypedSelector.internal(mask, untyped, hashCode); |
| 637 } | 637 } |
| 638 return result; | 638 return result; |
| 639 } | 639 } |
| 640 | 640 |
| 641 factory TypedSelector.exact(DartType base, Selector selector) | 641 factory TypedSelector.exact(ClassElement base, Selector selector) |
| 642 => new TypedSelector(new TypeMask.exact(base), selector); | 642 => new TypedSelector(new TypeMask.exact(base), selector); |
| 643 | 643 |
| 644 factory TypedSelector.subclass(DartType base, Selector selector) | 644 factory TypedSelector.subclass(ClassElement base, Selector selector) |
| 645 => new TypedSelector(new TypeMask.subclass(base), selector); | 645 => new TypedSelector(new TypeMask.subclass(base), selector); |
| 646 | 646 |
| 647 factory TypedSelector.subtype(DartType base, Selector selector) | 647 factory TypedSelector.subtype(ClassElement base, Selector selector) |
| 648 => new TypedSelector(new TypeMask.subtype(base), selector); | 648 => new TypedSelector(new TypeMask.subtype(base), selector); |
| 649 | 649 |
| 650 bool appliesUnnamed(Element element, Compiler compiler) { | 650 bool appliesUnnamed(Element element, Compiler compiler) { |
| 651 assert(sameNameHack(element, compiler)); | 651 assert(sameNameHack(element, compiler)); |
| 652 // [TypedSelector] are only used after resolution. | 652 // [TypedSelector] are only used after resolution. |
| 653 assert(compiler.phase > Compiler.PHASE_RESOLVING); | 653 assert(compiler.phase > Compiler.PHASE_RESOLVING); |
| 654 if (!element.isMember()) return false; | 654 if (!element.isMember()) return false; |
| 655 | 655 |
| 656 // A closure can be called through any typed selector: | 656 // A closure can be called through any typed selector: |
| 657 // class A { | 657 // class A { |
| 658 // get foo => () => 42; | 658 // get foo => () => 42; |
| 659 // bar() => foo(); // The call to 'foo' is a typed selector. | 659 // bar() => foo(); // The call to 'foo' is a typed selector. |
| 660 // } | 660 // } |
| 661 if (element.getEnclosingClass().isClosure()) { | 661 if (element.getEnclosingClass().isClosure()) { |
| 662 return appliesUntyped(element, compiler); | 662 return appliesUntyped(element, compiler); |
| 663 } | 663 } |
| 664 | 664 |
| 665 if (!mask.canHit(element, this, compiler)) return false; | 665 if (!mask.canHit(element, this, compiler)) return false; |
| 666 return appliesUntyped(element, compiler); | 666 return appliesUntyped(element, compiler); |
| 667 } | 667 } |
| 668 } | 668 } |
| OLD | NEW |