OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 elements.modelx; | 5 library elements.modelx; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/resolution.dart' show Resolution, ParsingContext; | 8 import '../common/resolution.dart' show Resolution, ParsingContext; |
9 import '../compiler.dart' show Compiler; | 9 import '../compiler.dart' show Compiler; |
10 import '../constants/constant_constructors.dart'; | 10 import '../constants/constant_constructors.dart'; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 bool get isLocal => false; | 102 bool get isLocal => false; |
103 | 103 |
104 // TODO(johnniwinther): This breaks for libraries (for which enclosing | 104 // TODO(johnniwinther): This breaks for libraries (for which enclosing |
105 // elements are null) and is invalid for top level variable declarations for | 105 // elements are null) and is invalid for top level variable declarations for |
106 // which the enclosing element is a VariableDeclarations and not a compilation | 106 // which the enclosing element is a VariableDeclarations and not a compilation |
107 // unit. | 107 // unit. |
108 bool get isTopLevel { | 108 bool get isTopLevel { |
109 return enclosingElement != null && enclosingElement.isCompilationUnit; | 109 return enclosingElement != null && enclosingElement.isCompilationUnit; |
110 } | 110 } |
111 | 111 |
| 112 @override |
| 113 int get sourceOffset => position?.charOffset; |
| 114 |
112 Token get position => null; | 115 Token get position => null; |
113 | 116 |
114 SourceSpan get sourcePosition { | 117 SourceSpan get sourcePosition { |
115 if (position == null) return null; | 118 if (position == null) return null; |
116 Uri uri = compilationUnit.script.resourceUri; | 119 Uri uri = compilationUnit.script.resourceUri; |
117 return new SourceSpan( | 120 return new SourceSpan(uri, position.charOffset, position.charEnd); |
118 uri, position.charOffset, position.charOffset + position.charCount); | |
119 } | 121 } |
120 | 122 |
121 Token findMyName(Token token) { | 123 Token findMyName(Token token) { |
122 return findNameToken(token, isConstructor, name, enclosingElement.name); | 124 return findNameToken(token, isConstructor, name, enclosingElement.name); |
123 } | 125 } |
124 | 126 |
125 static Token findNameToken( | 127 static Token findNameToken( |
126 Token token, bool isConstructor, String name, String enclosingClassName) { | 128 Token token, bool isConstructor, String name, String enclosingClassName) { |
127 // We search for the token that has the name of this element. | 129 // We search for the token that has the name of this element. |
128 // For constructors, that doesn't work because they may have | 130 // For constructors, that doesn't work because they may have |
(...skipping 28 matching lines...) Expand all Loading... |
157 return element; | 159 return element; |
158 } | 160 } |
159 | 161 |
160 ClassElement get enclosingClass { | 162 ClassElement get enclosingClass { |
161 for (Element e = this; e != null; e = e.enclosingElement) { | 163 for (Element e = this; e != null; e = e.enclosingElement) { |
162 if (e.isClass) return e; | 164 if (e.isClass) return e; |
163 } | 165 } |
164 return null; | 166 return null; |
165 } | 167 } |
166 | 168 |
167 Element get enclosingClassOrCompilationUnit { | |
168 for (Element e = this; e != null; e = e.enclosingElement) { | |
169 if (e.isClass || e.isCompilationUnit) return e; | |
170 } | |
171 return null; | |
172 } | |
173 | |
174 /** | 169 /** |
175 * Creates the scope for this element. | 170 * Creates the scope for this element. |
176 */ | 171 */ |
177 Scope buildScope() => enclosingElement.buildScope(); | 172 Scope buildScope() => enclosingElement.buildScope(); |
178 | 173 |
179 String toString() { | 174 String toString() { |
180 // TODO(johnniwinther): Test for nullness of name, or make non-nullness an | 175 // TODO(johnniwinther): Test for nullness of name, or make non-nullness an |
181 // invariant for all element types? | 176 // invariant for all element types? |
182 var nameText = name != null ? name : '?'; | 177 var nameText = name != null ? name : '?'; |
183 if (enclosingElement != null && !isTopLevel) { | 178 if (enclosingElement != null && !isTopLevel) { |
(...skipping 2296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2480 implements ClassElement { | 2475 implements ClassElement { |
2481 final int id; | 2476 final int id; |
2482 | 2477 |
2483 DartType supertype; | 2478 DartType supertype; |
2484 Link<DartType> interfaces; | 2479 Link<DartType> interfaces; |
2485 int supertypeLoadState; | 2480 int supertypeLoadState; |
2486 int resolutionState; | 2481 int resolutionState; |
2487 bool isProxy = false; | 2482 bool isProxy = false; |
2488 bool hasIncompleteHierarchy = false; | 2483 bool hasIncompleteHierarchy = false; |
2489 | 2484 |
2490 // backendMembers are members that have been added by the backend to simplify | |
2491 // compilation. They don't have any user-side counter-part. | |
2492 Link<Element> backendMembers = const Link<Element>(); | |
2493 | |
2494 OrderedTypeSet allSupertypesAndSelf; | 2485 OrderedTypeSet allSupertypesAndSelf; |
2495 | 2486 |
2496 BaseClassElementX(String name, Element enclosing, this.id, int initialState) | 2487 BaseClassElementX(String name, Element enclosing, this.id, int initialState) |
2497 : supertypeLoadState = initialState, | 2488 : supertypeLoadState = initialState, |
2498 resolutionState = initialState, | 2489 resolutionState = initialState, |
2499 super(name, ElementKind.CLASS, enclosing); | 2490 super(name, ElementKind.CLASS, enclosing); |
2500 | 2491 |
2501 int get hashCode => id; | 2492 int get hashCode => id; |
2502 | 2493 |
2503 bool get hasBackendMembers => !backendMembers.isEmpty; | |
2504 | |
2505 bool get isUnnamedMixinApplication => false; | 2494 bool get isUnnamedMixinApplication => false; |
2506 | 2495 |
2507 @override | 2496 @override |
2508 bool get isEnumClass => false; | 2497 bool get isEnumClass => false; |
2509 | 2498 |
2510 InterfaceType computeType(Resolution resolution) { | 2499 InterfaceType computeType(Resolution resolution) { |
2511 if (isPatch) { | 2500 if (isPatch) { |
2512 origin.computeType(resolution); | 2501 origin.computeType(resolution); |
2513 thisTypeCache = origin.thisType; | 2502 thisTypeCache = origin.thisType; |
2514 rawTypeCache = origin.rawType; | 2503 rawTypeCache = origin.rawType; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2547 void ensureResolved(Resolution resolution) { | 2536 void ensureResolved(Resolution resolution) { |
2548 if (resolutionState == STATE_NOT_STARTED) { | 2537 if (resolutionState == STATE_NOT_STARTED) { |
2549 resolution.resolveClass(this); | 2538 resolution.resolveClass(this); |
2550 resolution.registerClass(this); | 2539 resolution.registerClass(this); |
2551 } | 2540 } |
2552 } | 2541 } |
2553 | 2542 |
2554 void setDefaultConstructor( | 2543 void setDefaultConstructor( |
2555 FunctionElement constructor, DiagnosticReporter reporter); | 2544 FunctionElement constructor, DiagnosticReporter reporter); |
2556 | 2545 |
2557 void addBackendMember(Element member) { | |
2558 // TODO(ngeoffray): Deprecate this method. | |
2559 assert(member.isGenerativeConstructorBody); | |
2560 backendMembers = backendMembers.prepend(member); | |
2561 } | |
2562 | |
2563 void reverseBackendMembers() { | |
2564 backendMembers = backendMembers.reverse(); | |
2565 } | |
2566 | |
2567 /// Lookup a synthetic element created by the backend. | |
2568 Element lookupBackendMember(String memberName) { | |
2569 for (Element element in backendMembers) { | |
2570 if (element.name == memberName) { | |
2571 return element; | |
2572 } | |
2573 } | |
2574 return null; | |
2575 } | |
2576 | |
2577 ConstructorElement lookupDefaultConstructor() { | 2546 ConstructorElement lookupDefaultConstructor() { |
2578 ConstructorElement constructor = lookupConstructor(""); | 2547 ConstructorElement constructor = lookupConstructor(""); |
2579 // This method might be called on constructors that have not been | 2548 // This method might be called on constructors that have not been |
2580 // resolved. As we query the live world, we return `null` in such cases | 2549 // resolved. As we query the live world, we return `null` in such cases |
2581 // as no default constructor exists in the live world. | 2550 // as no default constructor exists in the live world. |
2582 if (constructor != null && | 2551 if (constructor != null && |
2583 constructor.hasFunctionSignature && | 2552 constructor.hasFunctionSignature && |
2584 constructor.functionSignature.requiredParameterCount == 0) { | 2553 constructor.functionSignature.requiredParameterCount == 0) { |
2585 return constructor; | 2554 return constructor; |
2586 } | 2555 } |
2587 return null; | 2556 return null; |
2588 } | 2557 } |
2589 | 2558 |
2590 /** | 2559 /** |
2591 * Returns the super class, if any. | 2560 * Returns the super class, if any. |
2592 * | 2561 * |
2593 * The returned element may not be resolved yet. | 2562 * The returned element may not be resolved yet. |
2594 */ | 2563 */ |
2595 ClassElement get superclass { | 2564 ClassElement get superclass { |
2596 assert(invariant(this, supertypeLoadState == STATE_DONE, | 2565 assert(invariant(this, supertypeLoadState == STATE_DONE, |
2597 message: "Superclass has not been computed for $this.")); | 2566 message: "Superclass has not been computed for $this.")); |
2598 return supertype == null ? null : supertype.element; | 2567 return supertype == null ? null : supertype.element; |
2599 } | 2568 } |
2600 | 2569 |
2601 void forEachBackendMember(void f(Element member)) { | |
2602 backendMembers.forEach(f); | |
2603 } | |
2604 | |
2605 // TODO(johnniwinther): Remove these when issue 18630 is fixed. | 2570 // TODO(johnniwinther): Remove these when issue 18630 is fixed. |
2606 ClassElement get patch => super.patch; | 2571 ClassElement get patch => super.patch; |
2607 ClassElement get origin => super.origin; | 2572 ClassElement get origin => super.origin; |
2608 | 2573 |
2609 // A class declaration is defined by the declaration element. | 2574 // A class declaration is defined by the declaration element. |
2610 AstElement get definingElement => declaration; | 2575 AstElement get definingElement => declaration; |
2611 } | 2576 } |
2612 | 2577 |
2613 abstract class ClassElementX extends BaseClassElementX { | 2578 abstract class ClassElementX extends BaseClassElementX { |
2614 Link<Element> localMembersReversed = const Link<Element>(); | 2579 Link<Element> localMembersReversed = const Link<Element>(); |
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3274 if (definingElement.isField) { | 3239 if (definingElement.isField) { |
3275 FieldElement field = definingElement; | 3240 FieldElement field = definingElement; |
3276 body = field.initializer; | 3241 body = field.initializer; |
3277 } else if (node != null && node.asFunctionExpression() != null) { | 3242 } else if (node != null && node.asFunctionExpression() != null) { |
3278 body = node.asFunctionExpression().body; | 3243 body = node.asFunctionExpression().body; |
3279 } | 3244 } |
3280 return new ParsedResolvedAst( | 3245 return new ParsedResolvedAst( |
3281 declaration, node, body, definingElement.treeElements); | 3246 declaration, node, body, definingElement.treeElements); |
3282 } | 3247 } |
3283 } | 3248 } |
OLD | NEW |