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 elements; | 5 library elements; |
6 | 6 |
7 import 'dart:uri'; | 7 import 'dart:uri'; |
8 | 8 |
9 // TODO(ahe): Rename prefix to 'api' when VM bug is fixed. | 9 // TODO(ahe): Rename prefix to 'api' when VM bug is fixed. |
10 import '../../compiler.dart' as api_e; | 10 import '../../compiler.dart' as api_e; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
109 static const ElementKind TYPEDEF = | 109 static const ElementKind TYPEDEF = |
110 const ElementKind('typedef', ElementCategory.ALIAS); | 110 const ElementKind('typedef', ElementCategory.ALIAS); |
111 | 111 |
112 static const ElementKind STATEMENT = | 112 static const ElementKind STATEMENT = |
113 const ElementKind('statement', ElementCategory.NONE); | 113 const ElementKind('statement', ElementCategory.NONE); |
114 static const ElementKind LABEL = | 114 static const ElementKind LABEL = |
115 const ElementKind('label', ElementCategory.NONE); | 115 const ElementKind('label', ElementCategory.NONE); |
116 static const ElementKind VOID = | 116 static const ElementKind VOID = |
117 const ElementKind('void', ElementCategory.NONE); | 117 const ElementKind('void', ElementCategory.NONE); |
118 | 118 |
119 static const ElementKind AMBIGUOUS = | |
120 const ElementKind('ambiguous', ElementCategory.NONE); | |
119 static const ElementKind ERROR = | 121 static const ElementKind ERROR = |
120 const ElementKind('error', ElementCategory.NONE); | 122 const ElementKind('error', ElementCategory.NONE); |
121 | 123 |
122 toString() => id; | 124 toString() => id; |
123 } | 125 } |
124 | 126 |
125 class Element implements Spannable { | 127 class Element implements Spannable { |
126 static int elementHashCode = 0; | 128 static int elementHashCode = 0; |
127 | 129 |
128 final SourceString name; | 130 final SourceString name; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
188 bool isSetter() => identical(kind, ElementKind.SETTER); | 190 bool isSetter() => identical(kind, ElementKind.SETTER); |
189 bool isAccessor() => isGetter() || isSetter(); | 191 bool isAccessor() => isGetter() || isSetter(); |
190 bool isForeign() => identical(kind, ElementKind.FOREIGN); | 192 bool isForeign() => identical(kind, ElementKind.FOREIGN); |
191 bool isLibrary() => identical(kind, ElementKind.LIBRARY); | 193 bool isLibrary() => identical(kind, ElementKind.LIBRARY); |
192 bool impliesType() => (kind.category & ElementCategory.IMPLIES_TYPE) != 0; | 194 bool impliesType() => (kind.category & ElementCategory.IMPLIES_TYPE) != 0; |
193 bool isExtendable() => (kind.category & ElementCategory.IS_EXTENDABLE) != 0; | 195 bool isExtendable() => (kind.category & ElementCategory.IS_EXTENDABLE) != 0; |
194 | 196 |
195 /** See [ErroneousElement] for documentation. */ | 197 /** See [ErroneousElement] for documentation. */ |
196 bool isErroneous() => false; | 198 bool isErroneous() => false; |
197 | 199 |
200 /** See [AmbiguousElement] for documentation. */ | |
201 bool isAmbiguous() => false; | |
202 | |
198 /** | 203 /** |
199 * Is [:true:] if this element has a corresponding patch. | 204 * Is [:true:] if this element has a corresponding patch. |
200 * | 205 * |
201 * If [:true:] this element has a non-null [patch] field. | 206 * If [:true:] this element has a non-null [patch] field. |
202 * | 207 * |
203 * See [:patch_parser.dart:] for a description of the terminology. | 208 * See [:patch_parser.dart:] for a description of the terminology. |
204 */ | 209 */ |
205 bool get isPatched => false; | 210 bool get isPatched => false; |
206 | 211 |
207 /** | 212 /** |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
415 get defaultImplementation => unsupported(); | 420 get defaultImplementation => unsupported(); |
416 bool get isPatched => unsupported(); | 421 bool get isPatched => unsupported(); |
417 bool get isPatch => unsupported(); | 422 bool get isPatch => unsupported(); |
418 setPatch(patch) => unsupported(); | 423 setPatch(patch) => unsupported(); |
419 computeSignature(compiler) => unsupported(); | 424 computeSignature(compiler) => unsupported(); |
420 requiredParameterCount(compiler) => unsupported(); | 425 requiredParameterCount(compiler) => unsupported(); |
421 optionalParameterCount(compiler) => unsupported(); | 426 optionalParameterCount(compiler) => unsupported(); |
422 parameterCount(copmiler) => unsupported(); | 427 parameterCount(copmiler) => unsupported(); |
423 } | 428 } |
424 | 429 |
430 /** | |
431 * An ambiguous element represent multiple elements accessible by the same name. | |
432 * | |
433 * Ambiguous elements are created during handling of import/export scopes. If an | |
434 * ambiguous element is encountered during resolution an warning/error should be | |
ahe
2012/11/06 16:28:10
an -> a
Johnni Winther
2012/11/07 08:24:43
Done.
| |
435 * reported. | |
436 */ | |
437 class AmbiguousElement extends Element { | |
438 /** | |
439 * The message to report on resolving this element. | |
440 */ | |
441 final MessageKind messageKind; | |
442 | |
443 /** | |
444 * The message arguments to report on resolving this element. | |
445 */ | |
446 final List messageArguments; | |
447 | |
448 /** | |
449 * The elements that this ambiguous element might refer to. | |
450 */ | |
451 Link<Element> elements = const Link<Element>(); | |
ahe
2012/11/06 16:28:10
Should this also be final? I would be more comfort
Johnni Winther
2012/11/07 08:24:43
We need this to handle cases where more than two e
ahe
2012/11/07 11:18:19
In my mind that would be handled with:
new Abiguo
Johnni Winther
2012/11/07 13:02:01
Done.
| |
452 | |
453 AmbiguousElement(MessageKind this.messageKind, List this.messageArguments, | |
454 Element enclosingElement, Element existingElement, Element newElement) | |
455 : super(existingElement.name, ElementKind.AMBIGUOUS, enclosingElement) { | |
456 addAmbiguousElement(existingElement); | |
457 addAmbiguousElement(newElement); | |
458 } | |
459 | |
460 bool isAmbiguous() => true; | |
461 | |
462 /** | |
463 * Adds an element as one of the elements that this ambiguous element might | |
464 * refer to. | |
465 */ | |
466 void addAmbiguousElement(Element element) { | |
467 elements = elements.prepend(element); | |
468 } | |
469 } | |
470 | |
425 class ContainerElement extends Element { | 471 class ContainerElement extends Element { |
426 Link<Element> localMembers = const Link<Element>(); | 472 Link<Element> localMembers = const Link<Element>(); |
427 | 473 |
428 ContainerElement(name, kind, enclosingElement) | 474 ContainerElement(name, kind, enclosingElement) |
429 : super(name, kind, enclosingElement); | 475 : super(name, kind, enclosingElement); |
430 | 476 |
431 void addMember(Element element, DiagnosticListener listener) { | 477 void addMember(Element element, DiagnosticListener listener) { |
432 localMembers = localMembers.prepend(element); | 478 localMembers = localMembers.prepend(element); |
433 } | 479 } |
434 } | 480 } |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
653 /** | 699 /** |
654 * Adds [element] to the import scope of this library. | 700 * Adds [element] to the import scope of this library. |
655 * | 701 * |
656 * If an element by the same name is already in the imported scope, an | 702 * If an element by the same name is already in the imported scope, an |
657 * [ErroneousElement] will be put in the imported scope, allowing for the | 703 * [ErroneousElement] will be put in the imported scope, allowing for the |
658 * detection of ambiguous uses of imported names. | 704 * detection of ambiguous uses of imported names. |
659 */ | 705 */ |
660 void addImport(Element element, DiagnosticListener listener) { | 706 void addImport(Element element, DiagnosticListener listener) { |
661 Element existing = importScope[element.name]; | 707 Element existing = importScope[element.name]; |
662 if (existing != null) { | 708 if (existing != null) { |
663 if (!existing.isErroneous()) { | 709 if (!existing.isAmbiguous()) { |
664 // TODO(johnniwinther): Provide access to both the new and existing | 710 // TODO(johnniwinther): Provide access to the import tags from which |
665 // elements. | 711 // the elements came. |
666 importScope[element.name] = new ErroneousElement( | 712 importScope[element.name] = new AmbiguousElement( |
667 MessageKind.DUPLICATE_IMPORT, | 713 MessageKind.DUPLICATE_IMPORT, [element.name], |
668 [element.name], element.name, this); | 714 this, existing, element); |
715 } else { | |
716 (existing as AmbiguousElement).addAmbiguousElement(element); | |
ahe
2012/11/06 16:28:10
Please don't use casts. There is a dynamic check i
Johnni Winther
2012/11/07 08:24:43
Replaced by another workaround.
| |
669 } | 717 } |
670 } else { | 718 } else { |
671 importScope[element.name] = element; | 719 importScope[element.name] = element; |
672 } | 720 } |
673 } | 721 } |
674 | 722 |
675 /** | 723 /** |
676 * Returns [:true:] if the export scope has already been computed for this | 724 * Returns [:true:] if the export scope has already been computed for this |
677 * library. | 725 * library. |
678 */ | 726 */ |
(...skipping 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1956 | 2004 |
1957 MetadataAnnotation ensureResolved(Compiler compiler) { | 2005 MetadataAnnotation ensureResolved(Compiler compiler) { |
1958 if (resolutionState == STATE_NOT_STARTED) { | 2006 if (resolutionState == STATE_NOT_STARTED) { |
1959 compiler.resolver.resolveMetadataAnnotation(this); | 2007 compiler.resolver.resolveMetadataAnnotation(this); |
1960 } | 2008 } |
1961 return this; | 2009 return this; |
1962 } | 2010 } |
1963 | 2011 |
1964 String toString() => 'MetadataAnnotation($value, $resolutionState)'; | 2012 String toString() => 'MetadataAnnotation($value, $resolutionState)'; |
1965 } | 2013 } |
OLD | NEW |