OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 /// Mixins that implement convenience methods on [Element] subclasses. | 5 /// Mixins that implement convenience methods on [Element] subclasses. |
6 | 6 |
7 library elements.common; | 7 library elements.common; |
8 | 8 |
9 import '../common/names.dart' show Names, Uris; | 9 import '../common/names.dart' show Names, Uris; |
10 import '../core_types.dart' show CoreClasses; | 10 import '../core_types.dart' show CoreClasses; |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 // TODO(johnniwinther): Clean up this method: This method does not return | 144 // TODO(johnniwinther): Clean up this method: This method does not return |
145 // the outermost for elements in closure classses, but some call-sites rely | 145 // the outermost for elements in closure classses, but some call-sites rely |
146 // on that behavior. | 146 // on that behavior. |
147 for (Element e = this; e != null; e = e.enclosingElement) { | 147 for (Element e = this; e != null; e = e.enclosingElement) { |
148 if (e.isClassMember || e.isTopLevel) { | 148 if (e.isClassMember || e.isTopLevel) { |
149 return e; | 149 return e; |
150 } | 150 } |
151 } | 151 } |
152 return null; | 152 return null; |
153 } | 153 } |
| 154 |
| 155 Element get enclosingClassOrCompilationUnit { |
| 156 for (Element e = this; e != null; e = e.enclosingElement) { |
| 157 if (e.isClass || e.isCompilationUnit) return e; |
| 158 } |
| 159 return null; |
| 160 } |
154 } | 161 } |
155 | 162 |
156 abstract class LibraryElementCommon implements LibraryElement { | 163 abstract class LibraryElementCommon implements LibraryElement { |
157 @override | 164 @override |
158 bool get isDartCore => canonicalUri == Uris.dart_core; | 165 bool get isDartCore => canonicalUri == Uris.dart_core; |
159 | 166 |
160 @override | 167 @override |
161 bool get isPlatformLibrary => canonicalUri.scheme == 'dart'; | 168 bool get isPlatformLibrary => canonicalUri.scheme == 'dart'; |
162 | 169 |
163 @override | 170 @override |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 | 465 |
459 FunctionType get callType { | 466 FunctionType get callType { |
460 MemberSignature member = lookupInterfaceMember(Names.call); | 467 MemberSignature member = lookupInterfaceMember(Names.call); |
461 return member != null && member.isMethod ? member.type : null; | 468 return member != null && member.isMethod ? member.type : null; |
462 } | 469 } |
463 | 470 |
464 @override | 471 @override |
465 bool get isNamedMixinApplication { | 472 bool get isNamedMixinApplication { |
466 return isMixinApplication && !isUnnamedMixinApplication; | 473 return isMixinApplication && !isUnnamedMixinApplication; |
467 } | 474 } |
| 475 |
| 476 // backendMembers are members that have been added by the backend to simplify |
| 477 // compilation. They don't have any user-side counter-part. |
| 478 Link<Element> backendMembers = const Link<Element>(); |
| 479 |
| 480 bool get hasBackendMembers => !backendMembers.isEmpty; |
| 481 |
| 482 void addBackendMember(Element member) { |
| 483 // TODO(ngeoffray): Deprecate this method. |
| 484 assert(member.isGenerativeConstructorBody); |
| 485 backendMembers = backendMembers.prepend(member); |
| 486 } |
| 487 |
| 488 void reverseBackendMembers() { |
| 489 backendMembers = backendMembers.reverse(); |
| 490 } |
| 491 |
| 492 /// Lookup a synthetic element created by the backend. |
| 493 Element lookupBackendMember(String memberName) { |
| 494 for (Element element in backendMembers) { |
| 495 if (element.name == memberName) { |
| 496 return element; |
| 497 } |
| 498 } |
| 499 return null; |
| 500 } |
| 501 |
| 502 void forEachBackendMember(void f(Element member)) { |
| 503 backendMembers.forEach(f); |
| 504 } |
468 } | 505 } |
469 | 506 |
470 abstract class FunctionSignatureCommon implements FunctionSignature { | 507 abstract class FunctionSignatureCommon implements FunctionSignature { |
471 void forEachRequiredParameter(void function(Element parameter)) { | 508 void forEachRequiredParameter(void function(Element parameter)) { |
472 requiredParameters.forEach(function); | 509 requiredParameters.forEach(function); |
473 } | 510 } |
474 | 511 |
475 void forEachOptionalParameter(void function(Element parameter)) { | 512 void forEachOptionalParameter(void function(Element parameter)) { |
476 optionalParameters.forEach(function); | 513 optionalParameters.forEach(function); |
477 } | 514 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 | 587 |
551 @override | 588 @override |
552 void forEachLocalMember(void f(Element member)) { | 589 void forEachLocalMember(void f(Element member)) { |
553 constructors.forEach(f); | 590 constructors.forEach(f); |
554 if (mixin != null) | 591 if (mixin != null) |
555 mixin.forEachLocalMember((Element mixedInElement) { | 592 mixin.forEachLocalMember((Element mixedInElement) { |
556 if (mixedInElement.isInstanceMember) f(mixedInElement); | 593 if (mixedInElement.isInstanceMember) f(mixedInElement); |
557 }); | 594 }); |
558 } | 595 } |
559 } | 596 } |
OLD | NEW |