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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 = | 119 static const ElementKind AMBIGUOUS = |
120 const ElementKind('ambiguous', ElementCategory.NONE); | 120 const ElementKind('ambiguous', ElementCategory.NONE); |
121 static const ElementKind ERROR = | 121 static const ElementKind ERROR = |
122 const ElementKind('error', ElementCategory.NONE); | 122 const ElementKind('error', ElementCategory.NONE); |
123 static const ElementKind MALFORMED_TYPE = | |
124 const ElementKind('malformed', ElementCategory.NONE); | |
123 | 125 |
124 toString() => id; | 126 toString() => id; |
125 } | 127 } |
126 | 128 |
127 class Element implements Spannable { | 129 class Element implements Spannable { |
128 static int elementHashCode = 0; | 130 static int elementHashCode = 0; |
129 | 131 |
130 final SourceString name; | 132 final SourceString name; |
131 final ElementKind kind; | 133 final ElementKind kind; |
132 final Element enclosingElement; | 134 final Element enclosingElement; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
193 bool isLibrary() => identical(kind, ElementKind.LIBRARY); | 195 bool isLibrary() => identical(kind, ElementKind.LIBRARY); |
194 bool impliesType() => (kind.category & ElementCategory.IMPLIES_TYPE) != 0; | 196 bool impliesType() => (kind.category & ElementCategory.IMPLIES_TYPE) != 0; |
195 bool isExtendable() => (kind.category & ElementCategory.IS_EXTENDABLE) != 0; | 197 bool isExtendable() => (kind.category & ElementCategory.IS_EXTENDABLE) != 0; |
196 | 198 |
197 /** See [ErroneousElement] for documentation. */ | 199 /** See [ErroneousElement] for documentation. */ |
198 bool isErroneous() => false; | 200 bool isErroneous() => false; |
199 | 201 |
200 /** See [AmbiguousElement] for documentation. */ | 202 /** See [AmbiguousElement] for documentation. */ |
201 bool isAmbiguous() => false; | 203 bool isAmbiguous() => false; |
202 | 204 |
205 bool isMalformed() => false; | |
206 | |
203 /** | 207 /** |
204 * Is [:true:] if this element has a corresponding patch. | 208 * Is [:true:] if this element has a corresponding patch. |
205 * | 209 * |
206 * If [:true:] this element has a non-null [patch] field. | 210 * If [:true:] this element has a non-null [patch] field. |
207 * | 211 * |
208 * See [:patch_parser.dart:] for a description of the terminology. | 212 * See [:patch_parser.dart:] for a description of the terminology. |
209 */ | 213 */ |
210 bool get isPatched => false; | 214 bool get isPatched => false; |
211 | 215 |
212 /** | 216 /** |
(...skipping 1099 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1312 class VoidElement extends Element { | 1316 class VoidElement extends Element { |
1313 VoidElement(Element enclosing) | 1317 VoidElement(Element enclosing) |
1314 : super(const SourceString('void'), ElementKind.VOID, enclosing); | 1318 : super(const SourceString('void'), ElementKind.VOID, enclosing); |
1315 DartType computeType(compiler) => compiler.types.voidType; | 1319 DartType computeType(compiler) => compiler.types.voidType; |
1316 Node parseNode(_) { | 1320 Node parseNode(_) { |
1317 throw 'internal error: parseNode on void'; | 1321 throw 'internal error: parseNode on void'; |
1318 } | 1322 } |
1319 bool impliesType() => true; | 1323 bool impliesType() => true; |
1320 } | 1324 } |
1321 | 1325 |
1326 class MalformedTypeElement extends Element { | |
1327 final TypeAnnotation type; | |
ahe
2012/11/22 12:41:30
This is an ast node. Do we assume that enclosing
ahe
2012/11/22 12:41:30
Separate field from constructor with a new line.
aam-me
2012/11/23 02:16:47
Currently in both cases when MalformedTypEelement
ahe
2012/11/23 06:16:13
All AST nodes and tokens record a character offset
aam-me
2012/11/23 14:02:27
I see. In our case "enclosing" is either class ele
ahe
2012/11/23 15:26:10
That makes sense. But we have to watch out for Jo
| |
1328 MalformedTypeElement(this.type, Element enclosing) | |
1329 : super(const SourceString('malformed'), | |
1330 ElementKind.MALFORMED_TYPE, | |
1331 enclosing); | |
ahe
2012/11/22 12:41:30
Add newline.
aam-me
2012/11/23 02:16:47
Done.
| |
1332 DartType computeType(compiler) => compiler.types.malformedType; | |
ahe
2012/11/22 12:41:30
Ditto.
aam-me
2012/11/23 02:16:47
Done.
| |
1333 Node parseNode(_) => type; | |
ahe
2012/11/22 12:41:30
Ditto.
aam-me
2012/11/23 02:16:47
Done.
| |
1334 bool impliesType() => true; | |
1335 | |
1336 bool isMalformed() => true; | |
1337 } | |
1338 | |
1322 /** | 1339 /** |
1323 * [TypeDeclarationElement] defines the common interface for class/interface | 1340 * [TypeDeclarationElement] defines the common interface for class/interface |
1324 * declarations and typedefs. | 1341 * declarations and typedefs. |
1325 */ | 1342 */ |
1326 abstract class TypeDeclarationElement implements Element { | 1343 abstract class TypeDeclarationElement implements Element { |
1327 // TODO(johnniwinther): This class should eventually be a mixin. | 1344 // TODO(johnniwinther): This class should eventually be a mixin. |
1328 | 1345 |
1329 /** | 1346 /** |
1330 * The type variables declared on this declaration. The type variables are not | 1347 * The type variables declared on this declaration. The type variables are not |
1331 * available until the type of the element has been computed through | 1348 * available until the type of the element has been computed through |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1717 return 'patch ${super.toString()}'; | 1734 return 'patch ${super.toString()}'; |
1718 } else if (patch != null) { | 1735 } else if (patch != null) { |
1719 return 'origin ${super.toString()}'; | 1736 return 'origin ${super.toString()}'; |
1720 } else { | 1737 } else { |
1721 return super.toString(); | 1738 return super.toString(); |
1722 } | 1739 } |
1723 } | 1740 } |
1724 } | 1741 } |
1725 | 1742 |
1726 class Elements { | 1743 class Elements { |
1727 static bool isUnresolved(Element e) => e == null || e.isErroneous(); | 1744 static bool isUnresolved(Element e) => e == null || e.isErroneous() || e.isMal formed(); |
ahe
2012/11/22 12:41:30
Long line. As a matter of style, I then prefer to
aam-me
2012/11/23 02:16:47
Done.
| |
1728 static bool isErroneousElement(Element e) => e != null && e.isErroneous(); | 1745 static bool isErroneousElement(Element e) => e != null && e.isErroneous(); |
1746 static bool isMalformedElement(Element e) => e != null && e.isMalformed(); | |
1729 | 1747 |
1730 static bool isClass(Element e) => e != null && e.kind == ElementKind.CLASS; | 1748 static bool isClass(Element e) => e != null && e.kind == ElementKind.CLASS; |
1731 static bool isTypedef(Element e) { | 1749 static bool isTypedef(Element e) { |
1732 return e != null && e.kind == ElementKind.TYPEDEF; | 1750 return e != null && e.kind == ElementKind.TYPEDEF; |
1733 } | 1751 } |
1734 | 1752 |
1735 static bool isLocal(Element element) { | 1753 static bool isLocal(Element element) { |
1736 return !Elements.isUnresolved(element) | 1754 return !Elements.isUnresolved(element) |
1737 && !element.isInstanceMember() | 1755 && !element.isInstanceMember() |
1738 && !isStaticOrTopLevelField(element) | 1756 && !isStaticOrTopLevelField(element) |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2051 | 2069 |
2052 MetadataAnnotation ensureResolved(Compiler compiler) { | 2070 MetadataAnnotation ensureResolved(Compiler compiler) { |
2053 if (resolutionState == STATE_NOT_STARTED) { | 2071 if (resolutionState == STATE_NOT_STARTED) { |
2054 compiler.resolver.resolveMetadataAnnotation(this); | 2072 compiler.resolver.resolveMetadataAnnotation(this); |
2055 } | 2073 } |
2056 return this; | 2074 return this; |
2057 } | 2075 } |
2058 | 2076 |
2059 String toString() => 'MetadataAnnotation($value, $resolutionState)'; | 2077 String toString() => 'MetadataAnnotation($value, $resolutionState)'; |
2060 } | 2078 } |
OLD | NEW |