OLD | NEW |
| (Empty) |
1 // This code was auto-generated, is not intended to be edited, and is subject to | |
2 // significant change. Please see the README file for more information. | |
3 library engine.element; | |
4 import 'dart:collection'; | |
5 import 'java_core.dart'; | |
6 import 'java_engine.dart'; | |
7 import 'utilities_collection.dart'; | |
8 import 'source.dart'; | |
9 import 'scanner.dart' show Keyword; | |
10 import 'ast.dart' show Identifier, LibraryIdentifier; | |
11 import 'sdk.dart' show DartSdk; | |
12 import 'html.dart' show XmlTagNode; | |
13 import 'engine.dart' show AnalysisContext; | |
14 import 'constant.dart' show EvaluationResultImpl; | |
15 import 'utilities_dart.dart'; | |
16 /** | |
17 * The interface `ClassElement` defines the behavior of elements that represent
a class. | |
18 * | |
19 * @coverage dart.engine.element | |
20 */ | |
21 abstract class ClassElement implements Element { | |
22 | |
23 /** | |
24 * Return an array containing all of the accessors (getters and setters) decla
red in this class. | |
25 * | |
26 * @return the accessors declared in this class | |
27 */ | |
28 List<PropertyAccessorElement> get accessors; | |
29 | |
30 /** | |
31 * Return an array containing all the supertypes defined for this class and it
s supertypes. This | |
32 * includes superclasses, mixins and interfaces. | |
33 * | |
34 * @return all the supertypes of this class, including mixins | |
35 */ | |
36 List<InterfaceType> get allSupertypes; | |
37 | |
38 /** | |
39 * Return an array containing all of the constructors declared in this class. | |
40 * | |
41 * @return the constructors declared in this class | |
42 */ | |
43 List<ConstructorElement> get constructors; | |
44 | |
45 /** | |
46 * Return an array containing all of the fields declared in this class. | |
47 * | |
48 * @return the fields declared in this class | |
49 */ | |
50 List<FieldElement> get fields; | |
51 | |
52 /** | |
53 * Return the element representing the getter with the given name that is decl
ared in this class, | |
54 * or `null` if this class does not declare a getter with the given name. | |
55 * | |
56 * @param getterName the name of the getter to be returned | |
57 * @return the getter declared in this class with the given name | |
58 */ | |
59 PropertyAccessorElement getGetter(String getterName); | |
60 | |
61 /** | |
62 * Return an array containing all of the interfaces that are implemented by th
is class. | |
63 * | |
64 * <b>Note:</b> Because the element model represents the state of the code, it
is possible for it | |
65 * to be semantically invalid. In particular, it is not safe to assume that th
e inheritance | |
66 * structure of a class does not contain a cycle. Clients that traverse the in
heritance structure | |
67 * must explicitly guard against infinite loops. | |
68 * | |
69 * @return the interfaces that are implemented by this class | |
70 */ | |
71 List<InterfaceType> get interfaces; | |
72 | |
73 /** | |
74 * Return the element representing the method with the given name that is decl
ared in this class, | |
75 * or `null` if this class does not declare a method with the given name. | |
76 * | |
77 * @param methodName the name of the method to be returned | |
78 * @return the method declared in this class with the given name | |
79 */ | |
80 MethodElement getMethod(String methodName); | |
81 | |
82 /** | |
83 * Return an array containing all of the methods declared in this class. | |
84 * | |
85 * @return the methods declared in this class | |
86 */ | |
87 List<MethodElement> get methods; | |
88 | |
89 /** | |
90 * Return an array containing all of the mixins that are applied to the class
being extended in | |
91 * order to derive the superclass of this class. | |
92 * | |
93 * <b>Note:</b> Because the element model represents the state of the code, it
is possible for it | |
94 * to be semantically invalid. In particular, it is not safe to assume that th
e inheritance | |
95 * structure of a class does not contain a cycle. Clients that traverse the in
heritance structure | |
96 * must explicitly guard against infinite loops. | |
97 * | |
98 * @return the mixins that are applied to derive the superclass of this class | |
99 */ | |
100 List<InterfaceType> get mixins; | |
101 | |
102 /** | |
103 * Return the named constructor declared in this class with the given name, or
`null` if | |
104 * this class does not declare a named constructor with the given name. | |
105 * | |
106 * @param name the name of the constructor to be returned | |
107 * @return the element representing the specified constructor | |
108 */ | |
109 ConstructorElement getNamedConstructor(String name); | |
110 | |
111 /** | |
112 * Return the element representing the setter with the given name that is decl
ared in this class, | |
113 * or `null` if this class does not declare a setter with the given name. | |
114 * | |
115 * @param setterName the name of the getter to be returned | |
116 * @return the setter declared in this class with the given name | |
117 */ | |
118 PropertyAccessorElement getSetter(String setterName); | |
119 | |
120 /** | |
121 * Return the superclass of this class, or `null` if the class represents the
class | |
122 * 'Object'. All other classes will have a non-`null` superclass. If the super
class was not | |
123 * explicitly declared then the implicit superclass 'Object' will be returned. | |
124 * | |
125 * <b>Note:</b> Because the element model represents the state of the code, it
is possible for it | |
126 * to be semantically invalid. In particular, it is not safe to assume that th
e inheritance | |
127 * structure of a class does not contain a cycle. Clients that traverse the in
heritance structure | |
128 * must explicitly guard against infinite loops. | |
129 * | |
130 * @return the superclass of this class | |
131 */ | |
132 InterfaceType get supertype; | |
133 | |
134 /** | |
135 * Return the type defined by the class. | |
136 * | |
137 * @return the type defined by the class | |
138 */ | |
139 InterfaceType get type; | |
140 | |
141 /** | |
142 * Return an array containing all of the type parameters declared for this cla
ss. | |
143 * | |
144 * @return the type parameters declared for this class | |
145 */ | |
146 List<TypeParameterElement> get typeParameters; | |
147 | |
148 /** | |
149 * Return the unnamed constructor declared in this class, or `null` if this cl
ass does not | |
150 * declare an unnamed constructor but does declare named constructors. The ret
urned constructor | |
151 * will be synthetic if this class does not declare any constructors, in which
case it will | |
152 * represent the default constructor for the class. | |
153 * | |
154 * @return the unnamed constructor defined in this class | |
155 */ | |
156 ConstructorElement get unnamedConstructor; | |
157 | |
158 /** | |
159 * Return `true` if this class or its superclass declares a non-final instance
field. | |
160 * | |
161 * @return `true` if this class or its superclass declares a non-final instanc
e field | |
162 */ | |
163 bool hasNonFinalField(); | |
164 | |
165 /** | |
166 * Return `true` if this class has reference to super (so, for example, cannot
be used as a | |
167 * mixin). | |
168 * | |
169 * @return `true` if this class has reference to super | |
170 */ | |
171 bool hasReferenceToSuper(); | |
172 | |
173 /** | |
174 * Return `true` if this class is abstract. A class is abstract if it has an e
xplicit | |
175 * `abstract` modifier. Note, that this definition of <i>abstract</i> is diffe
rent from | |
176 * <i>has unimplemented members</i>. | |
177 * | |
178 * @return `true` if this class is abstract | |
179 */ | |
180 bool get isAbstract; | |
181 | |
182 /** | |
183 * Return `true` if this class is defined by a typedef construct. | |
184 * | |
185 * @return `true` if this class is defined by a typedef construct | |
186 */ | |
187 bool get isTypedef; | |
188 | |
189 /** | |
190 * Return `true` if this class can validly be used as a mixin when defining an
other class. | |
191 * The behavior of this method is defined by the Dart Language Specification i
n section 9: | |
192 * <blockquote>It is a compile-time error if a declared or derived mixin refer
s to super. It is a | |
193 * compile-time error if a declared or derived mixin explicitly declares a con
structor. It is a | |
194 * compile-time error if a mixin is derived from a class whose superclass is n
ot | |
195 * Object.</blockquote> | |
196 * | |
197 * @return `true` if this class can validly be used as a mixin | |
198 */ | |
199 bool get isValidMixin; | |
200 | |
201 /** | |
202 * Return the element representing the getter that results from looking up the
given getter in | |
203 * this class with respect to the given library, or `null` if the look up fail
s. The | |
204 * behavior of this method is defined by the Dart Language Specification in se
ction 12.15.1: | |
205 * <blockquote>The result of looking up getter (respectively setter) <i>m</i>
in class <i>C</i> | |
206 * with respect to library <i>L</i> is: | |
207 * | |
208 * * If <i>C</i> declares an instance getter (respectively setter) named <i>m<
/i> that is | |
209 * accessible to <i>L</i>, then that getter (respectively setter) is the resul
t of the lookup. | |
210 * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lo
okup is the result | |
211 * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respec
t to <i>L</i>. | |
212 * Otherwise, we say that the lookup has failed. | |
213 * | |
214 * </blockquote> | |
215 * | |
216 * @param getterName the name of the getter being looked up | |
217 * @param library the library with respect to which the lookup is being perfor
med | |
218 * @return the result of looking up the given getter in this class with respec
t to the given | |
219 * library | |
220 */ | |
221 PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library
); | |
222 | |
223 /** | |
224 * Return the element representing the method that results from looking up the
given method in | |
225 * this class with respect to the given library, or `null` if the look up fail
s. The | |
226 * behavior of this method is defined by the Dart Language Specification in se
ction 12.15.1: | |
227 * <blockquote> The result of looking up method <i>m</i> in class <i>C</i> wit
h respect to library | |
228 * <i>L</i> is: | |
229 * | |
230 * * If <i>C</i> declares an instance method named <i>m</i> that is accessible
to <i>L</i>, then | |
231 * that method is the result of the lookup. Otherwise, if <i>C</i> has a super
class <i>S</i>, then | |
232 * the result of the lookup is the result of looking up method <i>m</i> in <i>
S</i> with respect | |
233 * to <i>L</i>. Otherwise, we say that the lookup has failed. | |
234 * | |
235 * </blockquote> | |
236 * | |
237 * @param methodName the name of the method being looked up | |
238 * @param library the library with respect to which the lookup is being perfor
med | |
239 * @return the result of looking up the given method in this class with respec
t to the given | |
240 * library | |
241 */ | |
242 MethodElement lookUpMethod(String methodName, LibraryElement library); | |
243 | |
244 /** | |
245 * Return the element representing the setter that results from looking up the
given setter in | |
246 * this class with respect to the given library, or `null` if the look up fail
s. The | |
247 * behavior of this method is defined by the Dart Language Specification in se
ction 12.16: | |
248 * <blockquote> The result of looking up getter (respectively setter) <i>m</i>
in class <i>C</i> | |
249 * with respect to library <i>L</i> is: | |
250 * | |
251 * * If <i>C</i> declares an instance getter (respectively setter) named <i>m<
/i> that is | |
252 * accessible to <i>L</i>, then that getter (respectively setter) is the resul
t of the lookup. | |
253 * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lo
okup is the result | |
254 * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respec
t to <i>L</i>. | |
255 * Otherwise, we say that the lookup has failed. | |
256 * | |
257 * </blockquote> | |
258 * | |
259 * @param setterName the name of the setter being looked up | |
260 * @param library the library with respect to which the lookup is being perfor
med | |
261 * @return the result of looking up the given setter in this class with respec
t to the given | |
262 * library | |
263 */ | |
264 PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library
); | |
265 } | |
266 /** | |
267 * The interface `ClassMemberElement` defines the behavior of elements that are
contained | |
268 * within a [ClassElement]. | |
269 */ | |
270 abstract class ClassMemberElement implements Element { | |
271 | |
272 /** | |
273 * Return the type in which this member is defined. | |
274 * | |
275 * @return the type in which this member is defined | |
276 */ | |
277 ClassElement get enclosingElement; | |
278 | |
279 /** | |
280 * Return `true` if this element is a static element. A static element is an e
lement that is | |
281 * not associated with a particular instance, but rather with an entire librar
y or class. | |
282 * | |
283 * @return `true` if this executable element is a static element | |
284 */ | |
285 bool get isStatic; | |
286 } | |
287 /** | |
288 * The interface `CompilationUnitElement` defines the behavior of elements repre
senting a | |
289 * compilation unit. | |
290 * | |
291 * @coverage dart.engine.element | |
292 */ | |
293 abstract class CompilationUnitElement implements Element, UriReferencedElement { | |
294 | |
295 /** | |
296 * Return an array containing all of the top-level accessors (getters and sett
ers) contained in | |
297 * this compilation unit. | |
298 * | |
299 * @return the top-level accessors contained in this compilation unit | |
300 */ | |
301 List<PropertyAccessorElement> get accessors; | |
302 | |
303 /** | |
304 * Return the library in which this compilation unit is defined. | |
305 * | |
306 * @return the library in which this compilation unit is defined | |
307 */ | |
308 LibraryElement get enclosingElement; | |
309 | |
310 /** | |
311 * Return an array containing all of the top-level functions contained in this
compilation unit. | |
312 * | |
313 * @return the top-level functions contained in this compilation unit | |
314 */ | |
315 List<FunctionElement> get functions; | |
316 | |
317 /** | |
318 * Return an array containing all of the function type aliases contained in th
is compilation unit. | |
319 * | |
320 * @return the function type aliases contained in this compilation unit | |
321 */ | |
322 List<FunctionTypeAliasElement> get functionTypeAliases; | |
323 | |
324 /** | |
325 * Return an array containing all of the top-level variables contained in this
compilation unit. | |
326 * | |
327 * @return the top-level variables contained in this compilation unit | |
328 */ | |
329 List<TopLevelVariableElement> get topLevelVariables; | |
330 | |
331 /** | |
332 * Return the class defined in this compilation unit that has the given name,
or `null` if | |
333 * this compilation unit does not define a class with the given name. | |
334 * | |
335 * @param className the name of the class to be returned | |
336 * @return the class with the given name that is defined in this compilation u
nit | |
337 */ | |
338 ClassElement getType(String className); | |
339 | |
340 /** | |
341 * Return an array containing all of the classes contained in this compilation
unit. | |
342 * | |
343 * @return the classes contained in this compilation unit | |
344 */ | |
345 List<ClassElement> get types; | |
346 } | |
347 /** | |
348 * The interface `ConstructorElement` defines the behavior of elements represent
ing a | |
349 * constructor or a factory method defined within a type. | |
350 * | |
351 * @coverage dart.engine.element | |
352 */ | |
353 abstract class ConstructorElement implements ClassMemberElement, ExecutableEleme
nt { | |
354 | |
355 /** | |
356 * Return the constructor to which this constructor is redirecting. | |
357 * | |
358 * @return the constructor to which this constructor is redirecting | |
359 */ | |
360 ConstructorElement get redirectedConstructor; | |
361 | |
362 /** | |
363 * Return `true` if this constructor is a const constructor. | |
364 * | |
365 * @return `true` if this constructor is a const constructor | |
366 */ | |
367 bool get isConst; | |
368 | |
369 /** | |
370 * Return `true` if this constructor can be used as a default constructor - un
named and has | |
371 * no required parameters. | |
372 * | |
373 * @return `true` if this constructor can be used as a default constructor. | |
374 */ | |
375 bool get isDefaultConstructor; | |
376 | |
377 /** | |
378 * Return `true` if this constructor represents a factory constructor. | |
379 * | |
380 * @return `true` if this constructor represents a factory constructor | |
381 */ | |
382 bool get isFactory; | |
383 } | |
384 /** | |
385 * The interface `Element` defines the behavior common to all of the elements in
the element | |
386 * model. Generally speaking, the element model is a semantic model of the progr
am that represents | |
387 * things that are declared with a name and hence can be referenced elsewhere in
the code. | |
388 * | |
389 * There are two exceptions to the general case. First, there are elements in th
e element model that | |
390 * are created for the convenience of various kinds of analysis but that do not
have any | |
391 * corresponding declaration within the source code. Such elements are marked as
being | |
392 * <i>synthetic</i>. Examples of synthetic elements include | |
393 * | |
394 * * default constructors in classes that do not define any explicit constructor
s, | |
395 * * getters and setters that are induced by explicit field declarations, | |
396 * * fields that are induced by explicit declarations of getters and setters, an
d | |
397 * * functions representing the initialization expression for a variable. | |
398 * | |
399 * | |
400 * Second, there are elements in the element model that do not have a name. Thes
e correspond to | |
401 * unnamed functions and exist in order to more accurately represent the semanti
c structure of the | |
402 * program. | |
403 * | |
404 * @coverage dart.engine.element | |
405 */ | |
406 abstract class Element { | |
407 | |
408 /** | |
409 * A comparator that can be used to sort elements by their name offset. Elemen
ts with a smaller | |
410 * offset will be sorted to be before elements with a larger name offset. | |
411 */ | |
412 static final Comparator<Element> SORT_BY_OFFSET = (Element firstElement, Eleme
nt secondElement) => firstElement.nameOffset - secondElement.nameOffset; | |
413 | |
414 /** | |
415 * Use the given visitor to visit this element. | |
416 * | |
417 * @param visitor the visitor that will visit this element | |
418 * @return the value returned by the visitor as a result of visiting this elem
ent | |
419 */ | |
420 accept(ElementVisitor visitor); | |
421 | |
422 /** | |
423 * Return the documentation comment for this element as it appears in the orig
inal source | |
424 * (complete with the beginning and ending delimiters), or `null` if this elem
ent does not | |
425 * have a documentation comment associated with it. This can be a long-running
operation if the | |
426 * information needed to access the comment is not cached. | |
427 * | |
428 * @return this element's documentation comment | |
429 * @throws AnalysisException if the documentation comment could not be determi
ned because the | |
430 * analysis could not be performed | |
431 */ | |
432 String computeDocumentationComment(); | |
433 | |
434 /** | |
435 * Return the element of the given class that most immediately encloses this e
lement, or | |
436 * `null` if there is no enclosing element of the given class. | |
437 * | |
438 * @param elementClass the class of the element to be returned | |
439 * @return the element that encloses this element | |
440 */ | |
441 Element getAncestor(Type elementClass); | |
442 | |
443 /** | |
444 * Return the analysis context in which this element is defined. | |
445 * | |
446 * @return the analysis context in which this element is defined | |
447 */ | |
448 AnalysisContext get context; | |
449 | |
450 /** | |
451 * Return the display name of this element, or `null` if this element does not
have a name. | |
452 * | |
453 * In most cases the name and the display name are the same. Differences thoug
h are cases such as | |
454 * setters where the name of some setter `set f(x)` is `f=`, instead of `f`. | |
455 * | |
456 * @return the display name of this element | |
457 */ | |
458 String get displayName; | |
459 | |
460 /** | |
461 * Return the element that either physically or logically encloses this elemen
t. This will be | |
462 * `null` if this element is a library because libraries are the top-level ele
ments in the | |
463 * model. | |
464 * | |
465 * @return the element that encloses this element | |
466 */ | |
467 Element get enclosingElement; | |
468 | |
469 /** | |
470 * Return the kind of element that this is. | |
471 * | |
472 * @return the kind of this element | |
473 */ | |
474 ElementKind get kind; | |
475 | |
476 /** | |
477 * Return the library that contains this element. This will be the element its
elf if it is a | |
478 * library element. This will be `null` if this element is an HTML file becaus
e HTML files | |
479 * are not contained in libraries. | |
480 * | |
481 * @return the library that contains this element | |
482 */ | |
483 LibraryElement get library; | |
484 | |
485 /** | |
486 * Return an object representing the location of this element in the element m
odel. The object can | |
487 * be used to locate this element at a later time. | |
488 * | |
489 * @return the location of this element in the element model | |
490 */ | |
491 ElementLocation get location; | |
492 | |
493 /** | |
494 * Return an array containing all of the metadata associated with this element
. | |
495 * | |
496 * @return the metadata associated with this element | |
497 */ | |
498 List<ElementAnnotation> get metadata; | |
499 | |
500 /** | |
501 * Return the name of this element, or `null` if this element does not have a
name. | |
502 * | |
503 * @return the name of this element | |
504 */ | |
505 String get name; | |
506 | |
507 /** | |
508 * Return the offset of the name of this element in the file that contains the
declaration of this | |
509 * element, or `-1` if this element is synthetic, does not have a name, or oth
erwise does | |
510 * not have an offset. | |
511 * | |
512 * @return the offset of the name of this element | |
513 */ | |
514 int get nameOffset; | |
515 | |
516 /** | |
517 * Return the source that contains this element, or `null` if this element is
not contained | |
518 * in a source. | |
519 * | |
520 * @return the source that contains this element | |
521 */ | |
522 Source get source; | |
523 | |
524 /** | |
525 * Return `true` if this element, assuming that it is within scope, is accessi
ble to code in | |
526 * the given library. This is defined by the Dart Language Specification in se
ction 3.2: | |
527 * <blockquote> A declaration <i>m</i> is accessible to library <i>L</i> if <i
>m</i> is declared | |
528 * in <i>L</i> or if <i>m</i> is public. </blockquote> | |
529 * | |
530 * @param library the library in which a possible reference to this element wo
uld occur | |
531 * @return `true` if this element is accessible to code in the given library | |
532 */ | |
533 bool isAccessibleIn(LibraryElement library); | |
534 | |
535 /** | |
536 * Return `true` if this element is synthetic. A synthetic element is an eleme
nt that is not | |
537 * represented in the source code explicitly, but is implied by the source cod
e, such as the | |
538 * default constructor for a class that does not explicitly define any constru
ctors. | |
539 * | |
540 * @return `true` if this element is synthetic | |
541 */ | |
542 bool get isSynthetic; | |
543 | |
544 /** | |
545 * Use the given visitor to visit all of the children of this element. There i
s no guarantee of | |
546 * the order in which the children will be visited. | |
547 * | |
548 * @param visitor the visitor that will be used to visit the children of this
element | |
549 */ | |
550 void visitChildren(ElementVisitor visitor); | |
551 } | |
552 /** | |
553 * The interface `ElementAnnotation` defines the behavior of objects representin
g a single | |
554 * annotation associated with an element. | |
555 * | |
556 * @coverage dart.engine.element | |
557 */ | |
558 abstract class ElementAnnotation { | |
559 | |
560 /** | |
561 * Return the element representing the field, variable, or const constructor b
eing used as an | |
562 * annotation. | |
563 * | |
564 * @return the field, variable, or constructor being used as an annotation | |
565 */ | |
566 Element get element; | |
567 } | |
568 /** | |
569 * The enumeration `ElementKind` defines the various kinds of elements in the el
ement model. | |
570 * | |
571 * @coverage dart.engine.element | |
572 */ | |
573 class ElementKind extends Enum<ElementKind> { | |
574 static final ElementKind CLASS = new ElementKind('CLASS', 0, "class"); | |
575 static final ElementKind COMPILATION_UNIT = new ElementKind('COMPILATION_UNIT'
, 1, "compilation unit"); | |
576 static final ElementKind CONSTRUCTOR = new ElementKind('CONSTRUCTOR', 2, "cons
tructor"); | |
577 static final ElementKind DYNAMIC = new ElementKind('DYNAMIC', 3, "<dynamic>"); | |
578 static final ElementKind EMBEDDED_HTML_SCRIPT = new ElementKind('EMBEDDED_HTML
_SCRIPT', 4, "embedded html script"); | |
579 static final ElementKind ERROR = new ElementKind('ERROR', 5, "<error>"); | |
580 static final ElementKind EXPORT = new ElementKind('EXPORT', 6, "export directi
ve"); | |
581 static final ElementKind EXTERNAL_HTML_SCRIPT = new ElementKind('EXTERNAL_HTML
_SCRIPT', 7, "external html script"); | |
582 static final ElementKind FIELD = new ElementKind('FIELD', 8, "field"); | |
583 static final ElementKind FUNCTION = new ElementKind('FUNCTION', 9, "function")
; | |
584 static final ElementKind GETTER = new ElementKind('GETTER', 10, "getter"); | |
585 static final ElementKind HTML = new ElementKind('HTML', 11, "html"); | |
586 static final ElementKind IMPORT = new ElementKind('IMPORT', 12, "import direct
ive"); | |
587 static final ElementKind LABEL = new ElementKind('LABEL', 13, "label"); | |
588 static final ElementKind LIBRARY = new ElementKind('LIBRARY', 14, "library"); | |
589 static final ElementKind LOCAL_VARIABLE = new ElementKind('LOCAL_VARIABLE', 15
, "local variable"); | |
590 static final ElementKind METHOD = new ElementKind('METHOD', 16, "method"); | |
591 static final ElementKind NAME = new ElementKind('NAME', 17, "<name>"); | |
592 static final ElementKind PARAMETER = new ElementKind('PARAMETER', 18, "paramet
er"); | |
593 static final ElementKind PREFIX = new ElementKind('PREFIX', 19, "import prefix
"); | |
594 static final ElementKind SETTER = new ElementKind('SETTER', 20, "setter"); | |
595 static final ElementKind TOP_LEVEL_VARIABLE = new ElementKind('TOP_LEVEL_VARIA
BLE', 21, "top level variable"); | |
596 static final ElementKind FUNCTION_TYPE_ALIAS = new ElementKind('FUNCTION_TYPE_
ALIAS', 22, "function type alias"); | |
597 static final ElementKind TYPE_PARAMETER = new ElementKind('TYPE_PARAMETER', 23
, "type parameter"); | |
598 static final ElementKind UNIVERSE = new ElementKind('UNIVERSE', 24, "<universe
>"); | |
599 static final List<ElementKind> values = [ | |
600 CLASS, | |
601 COMPILATION_UNIT, | |
602 CONSTRUCTOR, | |
603 DYNAMIC, | |
604 EMBEDDED_HTML_SCRIPT, | |
605 ERROR, | |
606 EXPORT, | |
607 EXTERNAL_HTML_SCRIPT, | |
608 FIELD, | |
609 FUNCTION, | |
610 GETTER, | |
611 HTML, | |
612 IMPORT, | |
613 LABEL, | |
614 LIBRARY, | |
615 LOCAL_VARIABLE, | |
616 METHOD, | |
617 NAME, | |
618 PARAMETER, | |
619 PREFIX, | |
620 SETTER, | |
621 TOP_LEVEL_VARIABLE, | |
622 FUNCTION_TYPE_ALIAS, | |
623 TYPE_PARAMETER, | |
624 UNIVERSE]; | |
625 | |
626 /** | |
627 * Return the kind of the given element, or [ERROR] if the element is `null`.
This is | |
628 * a utility method that can reduce the need for null checks in other places. | |
629 * | |
630 * @param element the element whose kind is to be returned | |
631 * @return the kind of the given element | |
632 */ | |
633 static ElementKind of(Element element) { | |
634 if (element == null) { | |
635 return ERROR; | |
636 } | |
637 return element.kind; | |
638 } | |
639 | |
640 /** | |
641 * The name displayed in the UI for this kind of element. | |
642 */ | |
643 String displayName; | |
644 | |
645 /** | |
646 * Initialize a newly created element kind to have the given display name. | |
647 * | |
648 * @param displayName the name displayed in the UI for this kind of element | |
649 */ | |
650 ElementKind(String name, int ordinal, String displayName) : super(name, ordina
l) { | |
651 this.displayName = displayName; | |
652 } | |
653 } | |
654 /** | |
655 * The interface `ElementLocation` defines the behavior of objects that represen
t the location | |
656 * of an element within the element model. | |
657 * | |
658 * @coverage dart.engine.element | |
659 */ | |
660 abstract class ElementLocation { | |
661 | |
662 /** | |
663 * Return an encoded representation of this location that can be used to creat
e a location that is | |
664 * equal to this location. | |
665 * | |
666 * @return an encoded representation of this location | |
667 */ | |
668 String get encoding; | |
669 } | |
670 /** | |
671 * The interface `ElementVisitor` defines the behavior of objects that can be us
ed to visit an | |
672 * element structure. | |
673 * | |
674 * @coverage dart.engine.element | |
675 */ | |
676 abstract class ElementVisitor<R> { | |
677 R visitClassElement(ClassElement element); | |
678 R visitCompilationUnitElement(CompilationUnitElement element); | |
679 R visitConstructorElement(ConstructorElement element); | |
680 R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element); | |
681 R visitExportElement(ExportElement element); | |
682 R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element); | |
683 R visitFieldElement(FieldElement element); | |
684 R visitFieldFormalParameterElement(FieldFormalParameterElement element); | |
685 R visitFunctionElement(FunctionElement element); | |
686 R visitFunctionTypeAliasElement(FunctionTypeAliasElement element); | |
687 R visitHtmlElement(HtmlElement element); | |
688 R visitImportElement(ImportElement element); | |
689 R visitLabelElement(LabelElement element); | |
690 R visitLibraryElement(LibraryElement element); | |
691 R visitLocalVariableElement(LocalVariableElement element); | |
692 R visitMethodElement(MethodElement element); | |
693 R visitMultiplyDefinedElement(MultiplyDefinedElement element); | |
694 R visitParameterElement(ParameterElement element); | |
695 R visitPrefixElement(PrefixElement element); | |
696 R visitPropertyAccessorElement(PropertyAccessorElement element); | |
697 R visitTopLevelVariableElement(TopLevelVariableElement element); | |
698 R visitTypeParameterElement(TypeParameterElement element); | |
699 } | |
700 /** | |
701 * The interface `EmbeddedHtmlScriptElement` defines the behavior of elements re
presenting a | |
702 * script tag in an HTML file having content that defines a Dart library. | |
703 * | |
704 * @coverage dart.engine.element | |
705 */ | |
706 abstract class EmbeddedHtmlScriptElement implements HtmlScriptElement { | |
707 | |
708 /** | |
709 * Return the library element defined by the content of the script tag. | |
710 * | |
711 * @return the library element (not `null`) | |
712 */ | |
713 LibraryElement get scriptLibrary; | |
714 } | |
715 /** | |
716 * The interface `ExecutableElement` defines the behavior of elements representi
ng an | |
717 * executable object, including functions, methods, constructors, getters, and s
etters. | |
718 * | |
719 * @coverage dart.engine.element | |
720 */ | |
721 abstract class ExecutableElement implements Element { | |
722 | |
723 /** | |
724 * Return an array containing all of the functions defined within this executa
ble element. | |
725 * | |
726 * @return the functions defined within this executable element | |
727 */ | |
728 List<FunctionElement> get functions; | |
729 | |
730 /** | |
731 * Return an array containing all of the labels defined within this executable
element. | |
732 * | |
733 * @return the labels defined within this executable element | |
734 */ | |
735 List<LabelElement> get labels; | |
736 | |
737 /** | |
738 * Return an array containing all of the local variables defined within this e
xecutable element. | |
739 * | |
740 * @return the local variables defined within this executable element | |
741 */ | |
742 List<LocalVariableElement> get localVariables; | |
743 | |
744 /** | |
745 * Return an array containing all of the parameters defined by this executable
element. | |
746 * | |
747 * @return the parameters defined by this executable element | |
748 */ | |
749 List<ParameterElement> get parameters; | |
750 | |
751 /** | |
752 * Return the return type defined by this executable element. | |
753 * | |
754 * @return the return type defined by this executable element | |
755 */ | |
756 Type2 get returnType; | |
757 | |
758 /** | |
759 * Return the type of function defined by this executable element. | |
760 * | |
761 * @return the type of function defined by this executable element | |
762 */ | |
763 FunctionType get type; | |
764 | |
765 /** | |
766 * Return `true` if this executable element is an operator. The test may be ba
sed on the | |
767 * name of the executable element, in which case the result will be correct wh
en the name is | |
768 * legal. | |
769 * | |
770 * @return `true` if this executable element is an operator | |
771 */ | |
772 bool get isOperator; | |
773 | |
774 /** | |
775 * Return `true` if this element is a static element. A static element is an e
lement that is | |
776 * not associated with a particular instance, but rather with an entire librar
y or class. | |
777 * | |
778 * @return `true` if this executable element is a static element | |
779 */ | |
780 bool get isStatic; | |
781 } | |
782 /** | |
783 * The interface `ExportElement` defines the behavior of objects representing in
formation | |
784 * about a single export directive within a library. | |
785 * | |
786 * @coverage dart.engine.element | |
787 */ | |
788 abstract class ExportElement implements Element, UriReferencedElement { | |
789 | |
790 /** | |
791 * An empty array of export elements. | |
792 */ | |
793 static final List<ExportElement> EMPTY_ARRAY = new List<ExportElement>(0); | |
794 | |
795 /** | |
796 * Return an array containing the combinators that were specified as part of t
he export directive | |
797 * in the order in which they were specified. | |
798 * | |
799 * @return the combinators specified in the export directive | |
800 */ | |
801 List<NamespaceCombinator> get combinators; | |
802 | |
803 /** | |
804 * Return the library that is exported from this library by this export direct
ive. | |
805 * | |
806 * @return the library that is exported from this library | |
807 */ | |
808 LibraryElement get exportedLibrary; | |
809 } | |
810 /** | |
811 * The interface `ExternalHtmlScriptElement` defines the behavior of elements re
presenting a | |
812 * script tag in an HTML file having a `source` attribute that references a Dart
library | |
813 * source file. | |
814 * | |
815 * @coverage dart.engine.element | |
816 */ | |
817 abstract class ExternalHtmlScriptElement implements HtmlScriptElement { | |
818 | |
819 /** | |
820 * Return the source referenced by this element, or `null` if this element doe
s not | |
821 * reference a Dart library source file. | |
822 * | |
823 * @return the source for the external Dart library | |
824 */ | |
825 Source get scriptSource; | |
826 } | |
827 /** | |
828 * The interface `FieldElement` defines the behavior of elements representing a
field defined | |
829 * within a type. | |
830 * | |
831 * @coverage dart.engine.element | |
832 */ | |
833 abstract class FieldElement implements ClassMemberElement, PropertyInducingEleme
nt { | |
834 } | |
835 /** | |
836 * The interface `FieldFormalParameterElement` defines the behavior of elements
representing a | |
837 * field formal parameter defined within a constructor element. | |
838 */ | |
839 abstract class FieldFormalParameterElement implements ParameterElement { | |
840 | |
841 /** | |
842 * Return the field element associated with this field formal parameter, or `n
ull` if the | |
843 * parameter references a field that doesn't exist. | |
844 * | |
845 * @return the field element associated with this field formal parameter | |
846 */ | |
847 FieldElement get field; | |
848 } | |
849 /** | |
850 * The interface `FunctionElement` defines the behavior of elements representing
a function. | |
851 * | |
852 * @coverage dart.engine.element | |
853 */ | |
854 abstract class FunctionElement implements ExecutableElement, LocalElement { | |
855 } | |
856 /** | |
857 * The interface `FunctionTypeAliasElement` defines the behavior of elements rep
resenting a | |
858 * function type alias (`typedef`). | |
859 * | |
860 * @coverage dart.engine.element | |
861 */ | |
862 abstract class FunctionTypeAliasElement implements Element { | |
863 | |
864 /** | |
865 * Return the compilation unit in which this type alias is defined. | |
866 * | |
867 * @return the compilation unit in which this type alias is defined | |
868 */ | |
869 CompilationUnitElement get enclosingElement; | |
870 | |
871 /** | |
872 * Return an array containing all of the parameters defined by this type alias
. | |
873 * | |
874 * @return the parameters defined by this type alias | |
875 */ | |
876 List<ParameterElement> get parameters; | |
877 | |
878 /** | |
879 * Return the return type defined by this type alias. | |
880 * | |
881 * @return the return type defined by this type alias | |
882 */ | |
883 Type2 get returnType; | |
884 | |
885 /** | |
886 * Return the type of function defined by this type alias. | |
887 * | |
888 * @return the type of function defined by this type alias | |
889 */ | |
890 FunctionType get type; | |
891 | |
892 /** | |
893 * Return an array containing all of the type parameters defined for this type
. | |
894 * | |
895 * @return the type parameters defined for this type | |
896 */ | |
897 List<TypeParameterElement> get typeParameters; | |
898 } | |
899 /** | |
900 * The interface `HideElementCombinator` defines the behavior of combinators tha
t cause some | |
901 * of the names in a namespace to be hidden when being imported. | |
902 * | |
903 * @coverage dart.engine.element | |
904 */ | |
905 abstract class HideElementCombinator implements NamespaceCombinator { | |
906 | |
907 /** | |
908 * Return an array containing the names that are not to be made visible in the
importing library | |
909 * even if they are defined in the imported library. | |
910 * | |
911 * @return the names from the imported library that are hidden from the import
ing library | |
912 */ | |
913 List<String> get hiddenNames; | |
914 } | |
915 /** | |
916 * The interface `HtmlElement` defines the behavior of elements representing an
HTML file. | |
917 * | |
918 * @coverage dart.engine.element | |
919 */ | |
920 abstract class HtmlElement implements Element { | |
921 | |
922 /** | |
923 * Return an array containing all of the script elements contained in the HTML
file. This includes | |
924 * scripts with libraries that are defined by the content of a script tag as w
ell as libraries | |
925 * that are referenced in the {@core source} attribute of a script tag. | |
926 * | |
927 * @return the script elements in the HTML file (not `null`, contains no `null
`s) | |
928 */ | |
929 List<HtmlScriptElement> get scripts; | |
930 } | |
931 /** | |
932 * The interface `HtmlScriptElement` defines the behavior of elements representi
ng a script | |
933 * tag in an HTML file. | |
934 * | |
935 * @see EmbeddedHtmlScriptElement | |
936 * @see ExternalHtmlScriptElement | |
937 * @coverage dart.engine.element | |
938 */ | |
939 abstract class HtmlScriptElement implements Element { | |
940 } | |
941 /** | |
942 * The interface `ImportElement` defines the behavior of objects representing in
formation | |
943 * about a single import directive within a library. | |
944 * | |
945 * @coverage dart.engine.element | |
946 */ | |
947 abstract class ImportElement implements Element, UriReferencedElement { | |
948 | |
949 /** | |
950 * An empty array of import elements. | |
951 */ | |
952 static final List<ImportElement> EMPTY_ARRAY = new List<ImportElement>(0); | |
953 | |
954 /** | |
955 * Return an array containing the combinators that were specified as part of t
he import directive | |
956 * in the order in which they were specified. | |
957 * | |
958 * @return the combinators specified in the import directive | |
959 */ | |
960 List<NamespaceCombinator> get combinators; | |
961 | |
962 /** | |
963 * Return the library that is imported into this library by this import direct
ive. | |
964 * | |
965 * @return the library that is imported into this library | |
966 */ | |
967 LibraryElement get importedLibrary; | |
968 | |
969 /** | |
970 * Return the prefix that was specified as part of the import directive, or `n
ull` if there | |
971 * was no prefix specified. | |
972 * | |
973 * @return the prefix that was specified as part of the import directive | |
974 */ | |
975 PrefixElement get prefix; | |
976 | |
977 /** | |
978 * Return the offset of the prefix of this import in the file that contains th
is import directive, | |
979 * or `-1` if this import is synthetic, does not have a prefix, or otherwise d
oes not have | |
980 * an offset. | |
981 * | |
982 * @return the offset of the prefix of this import | |
983 */ | |
984 int get prefixOffset; | |
985 | |
986 /** | |
987 * Return the offset of the character immediately following the last character
of this node's URI, | |
988 * or `-1` for synthetic import. | |
989 * | |
990 * @return the offset of the character just past the node's URI | |
991 */ | |
992 int get uriEnd; | |
993 } | |
994 /** | |
995 * The interface `LabelElement` defines the behavior of elements representing a
label | |
996 * associated with a statement. | |
997 * | |
998 * @coverage dart.engine.element | |
999 */ | |
1000 abstract class LabelElement implements Element { | |
1001 | |
1002 /** | |
1003 * Return the executable element in which this label is defined. | |
1004 * | |
1005 * @return the executable element in which this label is defined | |
1006 */ | |
1007 ExecutableElement get enclosingElement; | |
1008 } | |
1009 /** | |
1010 * The interface `LibraryElement` defines the behavior of elements representing
a library. | |
1011 * | |
1012 * @coverage dart.engine.element | |
1013 */ | |
1014 abstract class LibraryElement implements Element { | |
1015 | |
1016 /** | |
1017 * Return the compilation unit that defines this library. | |
1018 * | |
1019 * @return the compilation unit that defines this library | |
1020 */ | |
1021 CompilationUnitElement get definingCompilationUnit; | |
1022 | |
1023 /** | |
1024 * Return the entry point for this library, or `null` if this library does not
have an entry | |
1025 * point. The entry point is defined to be a zero argument top-level function
whose name is | |
1026 * `main`. | |
1027 * | |
1028 * @return the entry point for this library | |
1029 */ | |
1030 FunctionElement get entryPoint; | |
1031 | |
1032 /** | |
1033 * Return an array containing all of the libraries that are exported from this
library. | |
1034 * | |
1035 * @return an array containing all of the libraries that are exported from thi
s library | |
1036 */ | |
1037 List<LibraryElement> get exportedLibraries; | |
1038 | |
1039 /** | |
1040 * Return an array containing all of the exports defined in this library. | |
1041 * | |
1042 * @return the exports defined in this library | |
1043 */ | |
1044 List<ExportElement> get exports; | |
1045 | |
1046 /** | |
1047 * Return an array containing all of the libraries that are imported into this
library. This | |
1048 * includes all of the libraries that are imported using a prefix (also availa
ble through the | |
1049 * prefixes returned by [getPrefixes]) and those that are imported without a p
refix. | |
1050 * | |
1051 * @return an array containing all of the libraries that are imported into thi
s library | |
1052 */ | |
1053 List<LibraryElement> get importedLibraries; | |
1054 | |
1055 /** | |
1056 * Return an array containing all of the imports defined in this library. | |
1057 * | |
1058 * @return the imports defined in this library | |
1059 */ | |
1060 List<ImportElement> get imports; | |
1061 | |
1062 /** | |
1063 * Return an array containing all of the compilation units that are included i
n this library using | |
1064 * a `part` directive. This does not include the defining compilation unit tha
t contains the | |
1065 * `part` directives. | |
1066 * | |
1067 * @return the compilation units that are included in this library | |
1068 */ | |
1069 List<CompilationUnitElement> get parts; | |
1070 | |
1071 /** | |
1072 * Return an array containing elements for each of the prefixes used to `impor
t` libraries | |
1073 * into this library. Each prefix can be used in more than one `import` direct
ive. | |
1074 * | |
1075 * @return the prefixes used to `import` libraries into this library | |
1076 */ | |
1077 List<PrefixElement> get prefixes; | |
1078 | |
1079 /** | |
1080 * Return the class defined in this library that has the given name, or `null`
if this | |
1081 * library does not define a class with the given name. | |
1082 * | |
1083 * @param className the name of the class to be returned | |
1084 * @return the class with the given name that is defined in this library | |
1085 */ | |
1086 ClassElement getType(String className); | |
1087 | |
1088 /** | |
1089 * Answer `true` if this library is an application that can be run in the brow
ser. | |
1090 * | |
1091 * @return `true` if this library is an application that can be run in the bro
wser | |
1092 */ | |
1093 bool get isBrowserApplication; | |
1094 | |
1095 /** | |
1096 * Return `true` if this library is the dart:core library. | |
1097 * | |
1098 * @return `true` if this library is the dart:core library | |
1099 */ | |
1100 bool get isDartCore; | |
1101 | |
1102 /** | |
1103 * Return `true` if this library is the dart:core library. | |
1104 * | |
1105 * @return `true` if this library is the dart:core library | |
1106 */ | |
1107 bool get isInSdk; | |
1108 | |
1109 /** | |
1110 * Return `true` if this library is up to date with respect to the given time
stamp. If any | |
1111 * transitively referenced Source is newer than the time stamp, this method re
turns false. | |
1112 * | |
1113 * @param timeStamp the time stamp to compare against | |
1114 * @return `true` if this library is up to date with respect to the given time
stamp | |
1115 */ | |
1116 bool isUpToDate2(int timeStamp); | |
1117 } | |
1118 /** | |
1119 * The interface `LocalElement` defines the behavior of elements that can be (bu
t are not | |
1120 * required to be) defined within a method or function (an [ExecutableElement]). | |
1121 * | |
1122 * @coverage dart.engine.element | |
1123 */ | |
1124 abstract class LocalElement implements Element { | |
1125 | |
1126 /** | |
1127 * Return a source range that covers the approximate portion of the source in
which the name of | |
1128 * this element is visible, or `null` if there is no single range of character
s within which | |
1129 * the element name is visible. | |
1130 * | |
1131 * * For a local variable, this includes everything from the end of the variab
le's initializer | |
1132 * to the end of the block that encloses the variable declaration. | |
1133 * * For a parameter, this includes the body of the method or function that de
clares the | |
1134 * parameter. | |
1135 * * For a local function, this includes everything from the beginning of the
function's body to | |
1136 * the end of the block that encloses the function declaration. | |
1137 * * For top-level functions, `null` will be returned because they are potenti
ally visible | |
1138 * in multiple sources. | |
1139 * | |
1140 * | |
1141 * @return the range of characters in which the name of this element is visibl
e | |
1142 */ | |
1143 SourceRange get visibleRange; | |
1144 } | |
1145 /** | |
1146 * The interface `LocalVariableElement` defines the behavior common to elements
that represent | |
1147 * a local variable. | |
1148 * | |
1149 * @coverage dart.engine.element | |
1150 */ | |
1151 abstract class LocalVariableElement implements LocalElement, VariableElement { | |
1152 } | |
1153 /** | |
1154 * The interface `MethodElement` defines the behavior of elements that represent
a method | |
1155 * defined within a type. | |
1156 * | |
1157 * @coverage dart.engine.element | |
1158 */ | |
1159 abstract class MethodElement implements ClassMemberElement, ExecutableElement { | |
1160 | |
1161 /** | |
1162 * Return `true` if this method is abstract. Methods are abstract if they are
not external | |
1163 * and have no body. | |
1164 * | |
1165 * @return `true` if this method is abstract | |
1166 */ | |
1167 bool get isAbstract; | |
1168 } | |
1169 /** | |
1170 * The interface `MultiplyDefinedElement` defines the behavior of pseudo-element
s that | |
1171 * represent multiple elements defined within a single scope that have the same
name. This situation | |
1172 * is not allowed by the language, so objects implementing this interface always
represent an error. | |
1173 * As a result, most of the normal operations on elements do not make sense and
will return useless | |
1174 * results. | |
1175 * | |
1176 * @coverage dart.engine.element | |
1177 */ | |
1178 abstract class MultiplyDefinedElement implements Element { | |
1179 | |
1180 /** | |
1181 * Return an array containing all of the elements that were defined within the
scope to have the | |
1182 * same name. | |
1183 * | |
1184 * @return the elements that were defined with the same name | |
1185 */ | |
1186 List<Element> get conflictingElements; | |
1187 | |
1188 /** | |
1189 * Return the type of this element as the dynamic type. | |
1190 * | |
1191 * @return the type of this element as the dynamic type | |
1192 */ | |
1193 Type2 get type; | |
1194 } | |
1195 /** | |
1196 * The interface `NamespaceCombinator` defines the behavior common to objects th
at control how | |
1197 * namespaces are combined. | |
1198 * | |
1199 * @coverage dart.engine.element | |
1200 */ | |
1201 abstract class NamespaceCombinator { | |
1202 | |
1203 /** | |
1204 * An empty array of namespace combinators. | |
1205 */ | |
1206 static final List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombina
tor>(0); | |
1207 } | |
1208 /** | |
1209 * The interface `ParameterElement` defines the behavior of elements representin
g a parameter | |
1210 * defined within an executable element. | |
1211 * | |
1212 * @coverage dart.engine.element | |
1213 */ | |
1214 abstract class ParameterElement implements LocalElement, VariableElement { | |
1215 | |
1216 /** | |
1217 * Return a source range that covers the portion of the source in which the de
fault value for this | |
1218 * parameter is specified, or `null` if there is no default value. | |
1219 * | |
1220 * @return the range of characters in which the default value of this paramete
r is specified | |
1221 */ | |
1222 SourceRange get defaultValueRange; | |
1223 | |
1224 /** | |
1225 * Return the kind of this parameter. | |
1226 * | |
1227 * @return the kind of this parameter | |
1228 */ | |
1229 ParameterKind get parameterKind; | |
1230 | |
1231 /** | |
1232 * Return an array containing all of the parameters defined by this parameter.
A parameter will | |
1233 * only define other parameters if it is a function typed parameter. | |
1234 * | |
1235 * @return the parameters defined by this parameter element | |
1236 */ | |
1237 List<ParameterElement> get parameters; | |
1238 | |
1239 /** | |
1240 * Return `true` if this parameter is an initializing formal parameter. | |
1241 * | |
1242 * @return `true` if this parameter is an initializing formal parameter | |
1243 */ | |
1244 bool get isInitializingFormal; | |
1245 } | |
1246 /** | |
1247 * The interface `PrefixElement` defines the behavior common to elements that re
present a | |
1248 * prefix used to import one or more libraries into another library. | |
1249 * | |
1250 * @coverage dart.engine.element | |
1251 */ | |
1252 abstract class PrefixElement implements Element { | |
1253 | |
1254 /** | |
1255 * Return the library into which other libraries are imported using this prefi
x. | |
1256 * | |
1257 * @return the library into which other libraries are imported using this pref
ix | |
1258 */ | |
1259 LibraryElement get enclosingElement; | |
1260 | |
1261 /** | |
1262 * Return an array containing all of the libraries that are imported using thi
s prefix. | |
1263 * | |
1264 * @return the libraries that are imported using this prefix | |
1265 */ | |
1266 List<LibraryElement> get importedLibraries; | |
1267 } | |
1268 /** | |
1269 * The interface `PropertyAccessorElement` defines the behavior of elements repr
esenting a | |
1270 * getter or a setter. Note that explicitly defined property accessors implicitl
y define a synthetic | |
1271 * field. Symmetrically, synthetic accessors are implicitly created for explicit
ly defined fields. | |
1272 * The following rules apply: | |
1273 * | |
1274 * * Every explicit field is represented by a non-synthetic [FieldElement]. | |
1275 * * Every explicit field induces a getter and possibly a setter, both of which
are represented by | |
1276 * synthetic [PropertyAccessorElement]s. | |
1277 * * Every explicit getter or setter is represented by a non-synthetic | |
1278 * [PropertyAccessorElement]. | |
1279 * * Every explicit getter or setter (or pair thereof if they have the same name
) induces a field | |
1280 * that is represented by a synthetic [FieldElement]. | |
1281 * | |
1282 * | |
1283 * @coverage dart.engine.element | |
1284 */ | |
1285 abstract class PropertyAccessorElement implements ExecutableElement { | |
1286 | |
1287 /** | |
1288 * Return the accessor representing the getter that corresponds to (has the sa
me name as) this | |
1289 * setter, or `null` if this accessor is not a setter or if there is no corres
ponding | |
1290 * getter. | |
1291 * | |
1292 * @return the getter that corresponds to this setter | |
1293 */ | |
1294 PropertyAccessorElement get correspondingGetter; | |
1295 | |
1296 /** | |
1297 * Return the accessor representing the setter that corresponds to (has the sa
me name as) this | |
1298 * getter, or `null` if this accessor is not a getter or if there is no corres
ponding | |
1299 * setter. | |
1300 * | |
1301 * @return the setter that corresponds to this getter | |
1302 */ | |
1303 PropertyAccessorElement get correspondingSetter; | |
1304 | |
1305 /** | |
1306 * Return the field or top-level variable associated with this accessor. If th
is accessor was | |
1307 * explicitly defined (is not synthetic) then the variable associated with it
will be synthetic. | |
1308 * | |
1309 * @return the variable associated with this accessor | |
1310 */ | |
1311 PropertyInducingElement get variable; | |
1312 | |
1313 /** | |
1314 * Return `true` if this accessor is abstract. Accessors are abstract if they
are not | |
1315 * external and have no body. | |
1316 * | |
1317 * @return `true` if this accessor is abstract | |
1318 */ | |
1319 bool get isAbstract; | |
1320 | |
1321 /** | |
1322 * Return `true` if this accessor represents a getter. | |
1323 * | |
1324 * @return `true` if this accessor represents a getter | |
1325 */ | |
1326 bool get isGetter; | |
1327 | |
1328 /** | |
1329 * Return `true` if this accessor represents a setter. | |
1330 * | |
1331 * @return `true` if this accessor represents a setter | |
1332 */ | |
1333 bool get isSetter; | |
1334 } | |
1335 /** | |
1336 * The interface `PropertyInducingElement` defines the behavior of elements repr
esenting a | |
1337 * variable that has an associated getter and possibly a setter. Note that expli
citly defined | |
1338 * variables implicitly define a synthetic getter and that non-`final` explicitl
y defined | |
1339 * variables implicitly define a synthetic setter. Symmetrically, synthetic fiel
ds are implicitly | |
1340 * created for explicitly defined getters and setters. The following rules apply
: | |
1341 * | |
1342 * * Every explicit variable is represented by a non-synthetic [PropertyInducing
Element]. | |
1343 * * Every explicit variable induces a getter and possibly a setter, both of whi
ch are represented | |
1344 * by synthetic [PropertyAccessorElement]s. | |
1345 * * Every explicit getter or setter is represented by a non-synthetic | |
1346 * [PropertyAccessorElement]. | |
1347 * * Every explicit getter or setter (or pair thereof if they have the same name
) induces a | |
1348 * variable that is represented by a synthetic [PropertyInducingElement]. | |
1349 * | |
1350 * | |
1351 * @coverage dart.engine.element | |
1352 */ | |
1353 abstract class PropertyInducingElement implements VariableElement { | |
1354 | |
1355 /** | |
1356 * Return the getter associated with this variable. If this variable was expli
citly defined (is | |
1357 * not synthetic) then the getter associated with it will be synthetic. | |
1358 * | |
1359 * @return the getter associated with this variable | |
1360 */ | |
1361 PropertyAccessorElement get getter; | |
1362 | |
1363 /** | |
1364 * Return the setter associated with this variable, or `null` if the variable
is effectively | |
1365 * `final` and therefore does not have a setter associated with it. (This can
happen either | |
1366 * because the variable is explicitly defined as being `final` or because the
variable is | |
1367 * induced by an explicit getter that does not have a corresponding setter.) I
f this variable was | |
1368 * explicitly defined (is not synthetic) then the setter associated with it wi
ll be synthetic. | |
1369 * | |
1370 * @return the setter associated with this variable | |
1371 */ | |
1372 PropertyAccessorElement get setter; | |
1373 | |
1374 /** | |
1375 * Return `true` if this element is a static element. A static element is an e
lement that is | |
1376 * not associated with a particular instance, but rather with an entire librar
y or class. | |
1377 * | |
1378 * @return `true` if this executable element is a static element | |
1379 */ | |
1380 bool get isStatic; | |
1381 } | |
1382 /** | |
1383 * The interface `ShowElementCombinator` defines the behavior of combinators tha
t cause some | |
1384 * of the names in a namespace to be visible (and the rest hidden) when being im
ported. | |
1385 * | |
1386 * @coverage dart.engine.element | |
1387 */ | |
1388 abstract class ShowElementCombinator implements NamespaceCombinator { | |
1389 | |
1390 /** | |
1391 * Return the offset of the character immediately following the last character
of this node. | |
1392 * | |
1393 * @return the offset of the character just past this node | |
1394 */ | |
1395 int get end; | |
1396 | |
1397 /** | |
1398 * Return the offset of the 'show' keyword of this element. | |
1399 * | |
1400 * @return the offset of the 'show' keyword of this element | |
1401 */ | |
1402 int get offset; | |
1403 | |
1404 /** | |
1405 * Return an array containing the names that are to be made visible in the imp
orting library if | |
1406 * they are defined in the imported library. | |
1407 * | |
1408 * @return the names from the imported library that are visible in the importi
ng library | |
1409 */ | |
1410 List<String> get shownNames; | |
1411 } | |
1412 /** | |
1413 * The interface `TopLevelVariableElement` defines the behavior of elements repr
esenting a | |
1414 * top-level variable. | |
1415 * | |
1416 * @coverage dart.engine.element | |
1417 */ | |
1418 abstract class TopLevelVariableElement implements PropertyInducingElement { | |
1419 } | |
1420 /** | |
1421 * The interface `TypeParameterElement` defines the behavior of elements represe
nting a type | |
1422 * parameter. | |
1423 * | |
1424 * @coverage dart.engine.element | |
1425 */ | |
1426 abstract class TypeParameterElement implements Element { | |
1427 | |
1428 /** | |
1429 * Return the type representing the bound associated with this parameter, or `
null` if this | |
1430 * parameter does not have an explicit bound. | |
1431 * | |
1432 * @return the type representing the bound associated with this parameter | |
1433 */ | |
1434 Type2 get bound; | |
1435 | |
1436 /** | |
1437 * Return the type defined by this type parameter. | |
1438 * | |
1439 * @return the type defined by this type parameter | |
1440 */ | |
1441 TypeParameterType get type; | |
1442 } | |
1443 /** | |
1444 * The interface `UndefinedElement` defines the behavior of pseudo-elements that
represent | |
1445 * names that are undefined. This situation is not allowed by the language, so o
bjects implementing | |
1446 * this interface always represent an error. As a result, most of the normal ope
rations on elements | |
1447 * do not make sense and will return useless results. | |
1448 * | |
1449 * @coverage dart.engine.element | |
1450 */ | |
1451 abstract class UndefinedElement implements Element { | |
1452 } | |
1453 /** | |
1454 * The interface `UriReferencedElement` defines the behavior of objects included
into a | |
1455 * library using some URI. | |
1456 * | |
1457 * @coverage dart.engine.element | |
1458 */ | |
1459 abstract class UriReferencedElement implements Element { | |
1460 | |
1461 /** | |
1462 * Return the URI that is used to include this element into the enclosing libr
ary, or `null` | |
1463 * if this is the defining compilation unit of a library. | |
1464 * | |
1465 * @return the URI that is used to include this element into the enclosing lib
rary | |
1466 */ | |
1467 String get uri; | |
1468 } | |
1469 /** | |
1470 * The interface `VariableElement` defines the behavior common to elements that
represent a | |
1471 * variable. | |
1472 * | |
1473 * @coverage dart.engine.element | |
1474 */ | |
1475 abstract class VariableElement implements Element { | |
1476 | |
1477 /** | |
1478 * Return a synthetic function representing this variable's initializer, or `n
ull` if this | |
1479 * variable does not have an initializer. The function will have no parameters
. The return type of | |
1480 * the function will be the compile-time type of the initialization expression
. | |
1481 * | |
1482 * @return a synthetic function representing this variable's initializer | |
1483 */ | |
1484 FunctionElement get initializer; | |
1485 | |
1486 /** | |
1487 * Return the declared type of this variable, or `null` if the variable did no
t have a | |
1488 * declared type (such as if it was declared using the keyword 'var'). | |
1489 * | |
1490 * @return the declared type of this variable | |
1491 */ | |
1492 Type2 get type; | |
1493 | |
1494 /** | |
1495 * Return `true` if this variable was declared with the 'const' modifier. | |
1496 * | |
1497 * @return `true` if this variable was declared with the 'const' modifier | |
1498 */ | |
1499 bool get isConst; | |
1500 | |
1501 /** | |
1502 * Return `true` if this variable was declared with the 'final' modifier. Vari
ables that are | |
1503 * declared with the 'const' modifier will return `false` even though they are
implicitly | |
1504 * final. | |
1505 * | |
1506 * @return `true` if this variable was declared with the 'final' modifier | |
1507 */ | |
1508 bool get isFinal; | |
1509 } | |
1510 /** | |
1511 * Instances of the class `GeneralizingElementVisitor` implement an element visi
tor that will | |
1512 * recursively visit all of the elements in an element model (like instances of
the class | |
1513 * [RecursiveElementVisitor]). In addition, when an element of a specific type i
s visited not | |
1514 * only will the visit method for that specific type of element be invoked, but
additional methods | |
1515 * for the supertypes of that element will also be invoked. For example, using a
n instance of this | |
1516 * class to visit a [MethodElement] will cause the method | |
1517 * [visitMethodElement] to be invoked but will also cause the methods | |
1518 * [visitExecutableElement] and [visitElement] to be | |
1519 * subsequently invoked. This allows visitors to be written that visit all execu
table elements | |
1520 * without needing to override the visit method for each of the specific subclas
ses of | |
1521 * [ExecutableElement]. | |
1522 * | |
1523 * Note, however, that unlike many visitors, element visitors visit objects base
d on the interfaces | |
1524 * implemented by those elements. Because interfaces form a graph structure rath
er than a tree | |
1525 * structure the way classes do, and because it is generally undesirable for an
object to be visited | |
1526 * more than once, this class flattens the interface graph into a pseudo-tree. I
n particular, this | |
1527 * class treats elements as if the element types were structured in the followin
g way: | |
1528 * | |
1529 * | |
1530 * <pre> | |
1531 * Element | |
1532 * ClassElement | |
1533 * CompilationUnitElement | |
1534 * ExecutableElement | |
1535 * ConstructorElement | |
1536 * LocalElement | |
1537 * FunctionElement | |
1538 * MethodElement | |
1539 * PropertyAccessorElement | |
1540 * ExportElement | |
1541 * HtmlElement | |
1542 * ImportElement | |
1543 * LabelElement | |
1544 * LibraryElement | |
1545 * MultiplyDefinedElement | |
1546 * PrefixElement | |
1547 * TypeAliasElement | |
1548 * TypeParameterElement | |
1549 * UndefinedElement | |
1550 * VariableElement | |
1551 * PropertyInducingElement | |
1552 * FieldElement | |
1553 * TopLevelVariableElement | |
1554 * LocalElement | |
1555 * LocalVariableElement | |
1556 * ParameterElement | |
1557 * FieldFormalParameterElement | |
1558 * </pre> | |
1559 * | |
1560 * Subclasses that override a visit method must either invoke the overridden vis
it method or | |
1561 * explicitly invoke the more general visit method. Failure to do so will cause
the visit methods | |
1562 * for superclasses of the element to not be invoked and will cause the children
of the visited node | |
1563 * to not be visited. | |
1564 * | |
1565 * @coverage dart.engine.element | |
1566 */ | |
1567 class GeneralizingElementVisitor<R> implements ElementVisitor<R> { | |
1568 R visitClassElement(ClassElement element) => visitElement(element); | |
1569 R visitCompilationUnitElement(CompilationUnitElement element) => visitElement(
element); | |
1570 R visitConstructorElement(ConstructorElement element) => visitExecutableElemen
t(element); | |
1571 R visitElement(Element element) { | |
1572 element.visitChildren(this); | |
1573 return null; | |
1574 } | |
1575 R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => visitHt
mlScriptElement(element); | |
1576 R visitExecutableElement(ExecutableElement element) => visitElement(element); | |
1577 R visitExportElement(ExportElement element) => visitElement(element); | |
1578 R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => visitHt
mlScriptElement(element); | |
1579 R visitFieldElement(FieldElement element) => visitPropertyInducingElement(elem
ent); | |
1580 R visitFieldFormalParameterElement(FieldFormalParameterElement element) => vis
itParameterElement(element); | |
1581 R visitFunctionElement(FunctionElement element) => visitLocalElement(element); | |
1582 R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => visitElem
ent(element); | |
1583 R visitHtmlElement(HtmlElement element) => visitElement(element); | |
1584 R visitHtmlScriptElement(HtmlScriptElement element) => visitElement(element); | |
1585 R visitImportElement(ImportElement element) => visitElement(element); | |
1586 R visitLabelElement(LabelElement element) => visitElement(element); | |
1587 R visitLibraryElement(LibraryElement element) => visitElement(element); | |
1588 R visitLocalElement(LocalElement element) { | |
1589 if (element is LocalVariableElement) { | |
1590 return visitVariableElement(element as LocalVariableElement); | |
1591 } else if (element is ParameterElement) { | |
1592 return visitVariableElement(element as ParameterElement); | |
1593 } else if (element is FunctionElement) { | |
1594 return visitExecutableElement(element as FunctionElement); | |
1595 } | |
1596 return null; | |
1597 } | |
1598 R visitLocalVariableElement(LocalVariableElement element) => visitLocalElement
(element); | |
1599 R visitMethodElement(MethodElement element) => visitExecutableElement(element)
; | |
1600 R visitMultiplyDefinedElement(MultiplyDefinedElement element) => visitElement(
element); | |
1601 R visitParameterElement(ParameterElement element) => visitLocalElement(element
); | |
1602 R visitPrefixElement(PrefixElement element) => visitElement(element); | |
1603 R visitPropertyAccessorElement(PropertyAccessorElement element) => visitExecut
ableElement(element); | |
1604 R visitPropertyInducingElement(PropertyInducingElement element) => visitVariab
leElement(element); | |
1605 R visitTopLevelVariableElement(TopLevelVariableElement element) => visitProper
tyInducingElement(element); | |
1606 R visitTypeParameterElement(TypeParameterElement element) => visitElement(elem
ent); | |
1607 R visitVariableElement(VariableElement element) => visitElement(element); | |
1608 } | |
1609 /** | |
1610 * Instances of the class `RecursiveElementVisitor` implement an element visitor
that will | |
1611 * recursively visit all of the element in an element model. For example, using
an instance of this | |
1612 * class to visit a [CompilationUnitElement] will also cause all of the types in
the | |
1613 * compilation unit to be visited. | |
1614 * | |
1615 * Subclasses that override a visit method must either invoke the overridden vis
it method or must | |
1616 * explicitly ask the visited element to visit its children. Failure to do so wi
ll cause the | |
1617 * children of the visited element to not be visited. | |
1618 * | |
1619 * @coverage dart.engine.element | |
1620 */ | |
1621 class RecursiveElementVisitor<R> implements ElementVisitor<R> { | |
1622 R visitClassElement(ClassElement element) { | |
1623 element.visitChildren(this); | |
1624 return null; | |
1625 } | |
1626 R visitCompilationUnitElement(CompilationUnitElement element) { | |
1627 element.visitChildren(this); | |
1628 return null; | |
1629 } | |
1630 R visitConstructorElement(ConstructorElement element) { | |
1631 element.visitChildren(this); | |
1632 return null; | |
1633 } | |
1634 R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) { | |
1635 element.visitChildren(this); | |
1636 return null; | |
1637 } | |
1638 R visitExportElement(ExportElement element) { | |
1639 element.visitChildren(this); | |
1640 return null; | |
1641 } | |
1642 R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) { | |
1643 element.visitChildren(this); | |
1644 return null; | |
1645 } | |
1646 R visitFieldElement(FieldElement element) { | |
1647 element.visitChildren(this); | |
1648 return null; | |
1649 } | |
1650 R visitFieldFormalParameterElement(FieldFormalParameterElement element) { | |
1651 element.visitChildren(this); | |
1652 return null; | |
1653 } | |
1654 R visitFunctionElement(FunctionElement element) { | |
1655 element.visitChildren(this); | |
1656 return null; | |
1657 } | |
1658 R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) { | |
1659 element.visitChildren(this); | |
1660 return null; | |
1661 } | |
1662 R visitHtmlElement(HtmlElement element) { | |
1663 element.visitChildren(this); | |
1664 return null; | |
1665 } | |
1666 R visitImportElement(ImportElement element) { | |
1667 element.visitChildren(this); | |
1668 return null; | |
1669 } | |
1670 R visitLabelElement(LabelElement element) { | |
1671 element.visitChildren(this); | |
1672 return null; | |
1673 } | |
1674 R visitLibraryElement(LibraryElement element) { | |
1675 element.visitChildren(this); | |
1676 return null; | |
1677 } | |
1678 R visitLocalVariableElement(LocalVariableElement element) { | |
1679 element.visitChildren(this); | |
1680 return null; | |
1681 } | |
1682 R visitMethodElement(MethodElement element) { | |
1683 element.visitChildren(this); | |
1684 return null; | |
1685 } | |
1686 R visitMultiplyDefinedElement(MultiplyDefinedElement element) { | |
1687 element.visitChildren(this); | |
1688 return null; | |
1689 } | |
1690 R visitParameterElement(ParameterElement element) { | |
1691 element.visitChildren(this); | |
1692 return null; | |
1693 } | |
1694 R visitPrefixElement(PrefixElement element) { | |
1695 element.visitChildren(this); | |
1696 return null; | |
1697 } | |
1698 R visitPropertyAccessorElement(PropertyAccessorElement element) { | |
1699 element.visitChildren(this); | |
1700 return null; | |
1701 } | |
1702 R visitTopLevelVariableElement(TopLevelVariableElement element) { | |
1703 element.visitChildren(this); | |
1704 return null; | |
1705 } | |
1706 R visitTypeParameterElement(TypeParameterElement element) { | |
1707 element.visitChildren(this); | |
1708 return null; | |
1709 } | |
1710 } | |
1711 /** | |
1712 * Instances of the class `SimpleElementVisitor` implement an element visitor th
at will do | |
1713 * nothing when visiting an element. It is intended to be a superclass for class
es that use the | |
1714 * visitor pattern primarily as a dispatch mechanism (and hence don't need to re
cursively visit a | |
1715 * whole structure) and that only need to visit a small number of element types. | |
1716 * | |
1717 * @coverage dart.engine.element | |
1718 */ | |
1719 class SimpleElementVisitor<R> implements ElementVisitor<R> { | |
1720 R visitClassElement(ClassElement element) => null; | |
1721 R visitCompilationUnitElement(CompilationUnitElement element) => null; | |
1722 R visitConstructorElement(ConstructorElement element) => null; | |
1723 R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => null; | |
1724 R visitExportElement(ExportElement element) => null; | |
1725 R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => null; | |
1726 R visitFieldElement(FieldElement element) => null; | |
1727 R visitFieldFormalParameterElement(FieldFormalParameterElement element) => nul
l; | |
1728 R visitFunctionElement(FunctionElement element) => null; | |
1729 R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) => null; | |
1730 R visitHtmlElement(HtmlElement element) => null; | |
1731 R visitImportElement(ImportElement element) => null; | |
1732 R visitLabelElement(LabelElement element) => null; | |
1733 R visitLibraryElement(LibraryElement element) => null; | |
1734 R visitLocalVariableElement(LocalVariableElement element) => null; | |
1735 R visitMethodElement(MethodElement element) => null; | |
1736 R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null; | |
1737 R visitParameterElement(ParameterElement element) => null; | |
1738 R visitPrefixElement(PrefixElement element) => null; | |
1739 R visitPropertyAccessorElement(PropertyAccessorElement element) => null; | |
1740 R visitTopLevelVariableElement(TopLevelVariableElement element) => null; | |
1741 R visitTypeParameterElement(TypeParameterElement element) => null; | |
1742 } | |
1743 /** | |
1744 * For AST nodes that could be in both the getter and setter contexts ([IndexExp
ression]s and | |
1745 * [SimpleIdentifier]s), the additional resolved elements are stored in the AST
node, in an | |
1746 * [AuxiliaryElements]. Since resolved elements are either statically resolved o
r resolved | |
1747 * using propagated type information, this class is a wrapper for a pair of | |
1748 * [ExecutableElement]s, not just a single [ExecutableElement]. | |
1749 */ | |
1750 class AuxiliaryElements { | |
1751 | |
1752 /** | |
1753 * The element based on propagated type information, or `null` if the AST stru
cture has not | |
1754 * been resolved or if this identifier could not be resolved. | |
1755 */ | |
1756 ExecutableElement propagatedElement; | |
1757 | |
1758 /** | |
1759 * The element associated with this identifier based on static type informatio
n, or `null` | |
1760 * if the AST structure has not been resolved or if this identifier could not
be resolved. | |
1761 */ | |
1762 ExecutableElement staticElement; | |
1763 | |
1764 /** | |
1765 * Create the [AuxiliaryElements] with a static and propagated [ExecutableElem
ent]. | |
1766 * | |
1767 * @param staticElement the static element | |
1768 * @param propagatedElement the propagated element | |
1769 */ | |
1770 AuxiliaryElements(ExecutableElement staticElement, ExecutableElement propagate
dElement) { | |
1771 this.staticElement = staticElement; | |
1772 this.propagatedElement = propagatedElement; | |
1773 } | |
1774 } | |
1775 /** | |
1776 * Instances of the class `ClassElementImpl` implement a `ClassElement`. | |
1777 * | |
1778 * @coverage dart.engine.element | |
1779 */ | |
1780 class ClassElementImpl extends ElementImpl implements ClassElement { | |
1781 | |
1782 /** | |
1783 * An array containing all of the accessors (getters and setters) contained in
this class. | |
1784 */ | |
1785 List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_A
RRAY; | |
1786 | |
1787 /** | |
1788 * An array containing all of the constructors contained in this class. | |
1789 */ | |
1790 List<ConstructorElement> _constructors = ConstructorElementImpl.EMPTY_ARRAY; | |
1791 | |
1792 /** | |
1793 * An array containing all of the fields contained in this class. | |
1794 */ | |
1795 List<FieldElement> _fields = FieldElementImpl.EMPTY_ARRAY; | |
1796 | |
1797 /** | |
1798 * An array containing all of the mixins that are applied to the class being e
xtended in order to | |
1799 * derive the superclass of this class. | |
1800 */ | |
1801 List<InterfaceType> _mixins = InterfaceTypeImpl.EMPTY_ARRAY; | |
1802 | |
1803 /** | |
1804 * An array containing all of the interfaces that are implemented by this clas
s. | |
1805 */ | |
1806 List<InterfaceType> _interfaces = InterfaceTypeImpl.EMPTY_ARRAY; | |
1807 | |
1808 /** | |
1809 * An array containing all of the methods contained in this class. | |
1810 */ | |
1811 List<MethodElement> _methods = MethodElementImpl.EMPTY_ARRAY; | |
1812 | |
1813 /** | |
1814 * The superclass of the class, or `null` if the class does not have an explic
it superclass. | |
1815 */ | |
1816 InterfaceType _supertype; | |
1817 | |
1818 /** | |
1819 * The type defined by the class. | |
1820 */ | |
1821 InterfaceType _type; | |
1822 | |
1823 /** | |
1824 * An array containing all of the type parameters defined for this class. | |
1825 */ | |
1826 List<TypeParameterElement> _typeParameters = TypeParameterElementImpl.EMPTY_AR
RAY; | |
1827 | |
1828 /** | |
1829 * An empty array of type elements. | |
1830 */ | |
1831 static List<ClassElement> EMPTY_ARRAY = new List<ClassElement>(0); | |
1832 | |
1833 /** | |
1834 * Initialize a newly created class element to have the given name. | |
1835 * | |
1836 * @param name the name of this element | |
1837 */ | |
1838 ClassElementImpl(Identifier name) : super.con1(name); | |
1839 accept(ElementVisitor visitor) => visitor.visitClassElement(this); | |
1840 List<PropertyAccessorElement> get accessors => _accessors; | |
1841 List<InterfaceType> get allSupertypes { | |
1842 List<InterfaceType> list = new List<InterfaceType>(); | |
1843 collectAllSupertypes(list); | |
1844 return new List.from(list); | |
1845 } | |
1846 ElementImpl getChild(String identifier) { | |
1847 for (PropertyAccessorElement accessor in _accessors) { | |
1848 if (((accessor as PropertyAccessorElementImpl)).identifier == identifier)
{ | |
1849 return accessor as PropertyAccessorElementImpl; | |
1850 } | |
1851 } | |
1852 for (ConstructorElement constructor in _constructors) { | |
1853 if (((constructor as ConstructorElementImpl)).identifier == identifier) { | |
1854 return constructor as ConstructorElementImpl; | |
1855 } | |
1856 } | |
1857 for (FieldElement field in _fields) { | |
1858 if (((field as FieldElementImpl)).identifier == identifier) { | |
1859 return field as FieldElementImpl; | |
1860 } | |
1861 } | |
1862 for (MethodElement method in _methods) { | |
1863 if (((method as MethodElementImpl)).identifier == identifier) { | |
1864 return method as MethodElementImpl; | |
1865 } | |
1866 } | |
1867 for (TypeParameterElement typeParameter in _typeParameters) { | |
1868 if (((typeParameter as TypeParameterElementImpl)).identifier == identifier
) { | |
1869 return typeParameter as TypeParameterElementImpl; | |
1870 } | |
1871 } | |
1872 return null; | |
1873 } | |
1874 List<ConstructorElement> get constructors => _constructors; | |
1875 | |
1876 /** | |
1877 * Given some name, this returns the [FieldElement] with the matching name, if
there is no | |
1878 * such field, then `null` is returned. | |
1879 * | |
1880 * @param name some name to lookup a field element with | |
1881 * @return the matching field element, or `null` if no such element was found | |
1882 */ | |
1883 FieldElement getField(String name) { | |
1884 for (FieldElement fieldElement in _fields) { | |
1885 if (name == fieldElement.name) { | |
1886 return fieldElement; | |
1887 } | |
1888 } | |
1889 return null; | |
1890 } | |
1891 List<FieldElement> get fields => _fields; | |
1892 PropertyAccessorElement getGetter(String getterName) { | |
1893 for (PropertyAccessorElement accessor in _accessors) { | |
1894 if (accessor.isGetter && accessor.name == getterName) { | |
1895 return accessor; | |
1896 } | |
1897 } | |
1898 return null; | |
1899 } | |
1900 List<InterfaceType> get interfaces => _interfaces; | |
1901 ElementKind get kind => ElementKind.CLASS; | |
1902 MethodElement getMethod(String methodName) { | |
1903 for (MethodElement method in _methods) { | |
1904 if (method.name == methodName) { | |
1905 return method; | |
1906 } | |
1907 } | |
1908 return null; | |
1909 } | |
1910 List<MethodElement> get methods => _methods; | |
1911 List<InterfaceType> get mixins => _mixins; | |
1912 ConstructorElement getNamedConstructor(String name) { | |
1913 for (ConstructorElement element in constructors) { | |
1914 String elementName = element.name; | |
1915 if (elementName != null && elementName == name) { | |
1916 return element; | |
1917 } | |
1918 } | |
1919 return null; | |
1920 } | |
1921 PropertyAccessorElement getSetter(String setterName) { | |
1922 if (!setterName.endsWith("=")) { | |
1923 setterName += '='; | |
1924 } | |
1925 for (PropertyAccessorElement accessor in _accessors) { | |
1926 if (accessor.isSetter && accessor.name == setterName) { | |
1927 return accessor; | |
1928 } | |
1929 } | |
1930 return null; | |
1931 } | |
1932 InterfaceType get supertype => _supertype; | |
1933 InterfaceType get type => _type; | |
1934 List<TypeParameterElement> get typeParameters => _typeParameters; | |
1935 ConstructorElement get unnamedConstructor { | |
1936 for (ConstructorElement element in constructors) { | |
1937 String name = element.displayName; | |
1938 if (name == null || name.isEmpty) { | |
1939 return element; | |
1940 } | |
1941 } | |
1942 return null; | |
1943 } | |
1944 bool hasNonFinalField() { | |
1945 List<ClassElement> classesToVisit = new List<ClassElement>(); | |
1946 Set<ClassElement> visitedClasses = new Set<ClassElement>(); | |
1947 classesToVisit.add(this); | |
1948 while (!classesToVisit.isEmpty) { | |
1949 ClassElement currentElement = classesToVisit.removeAt(0); | |
1950 if (javaSetAdd(visitedClasses, currentElement)) { | |
1951 for (FieldElement field in currentElement.fields) { | |
1952 if (!field.isFinal && !field.isConst && !field.isStatic && !field.isSy
nthetic) { | |
1953 return true; | |
1954 } | |
1955 } | |
1956 for (InterfaceType mixinType in currentElement.mixins) { | |
1957 ClassElement mixinElement = mixinType.element; | |
1958 classesToVisit.add(mixinElement); | |
1959 } | |
1960 InterfaceType supertype = currentElement.supertype; | |
1961 if (supertype != null) { | |
1962 ClassElement superElement = supertype.element; | |
1963 if (superElement != null) { | |
1964 classesToVisit.add(superElement); | |
1965 } | |
1966 } | |
1967 } | |
1968 } | |
1969 return false; | |
1970 } | |
1971 bool hasReferenceToSuper() => hasModifier(Modifier.REFERENCES_SUPER); | |
1972 bool get isAbstract => hasModifier(Modifier.ABSTRACT); | |
1973 bool get isTypedef => hasModifier(Modifier.TYPEDEF); | |
1974 bool get isValidMixin => hasModifier(Modifier.MIXIN); | |
1975 PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library
) { | |
1976 Set<ClassElement> visitedClasses = new Set<ClassElement>(); | |
1977 ClassElement currentElement = this; | |
1978 while (currentElement != null && !visitedClasses.contains(currentElement)) { | |
1979 javaSetAdd(visitedClasses, currentElement); | |
1980 PropertyAccessorElement element = currentElement.getGetter(getterName); | |
1981 if (element != null && element.isAccessibleIn(library)) { | |
1982 return element; | |
1983 } | |
1984 for (InterfaceType mixin in currentElement.mixins) { | |
1985 ClassElement mixinElement = mixin.element; | |
1986 if (mixinElement != null) { | |
1987 element = mixinElement.getGetter(getterName); | |
1988 if (element != null && element.isAccessibleIn(library)) { | |
1989 return element; | |
1990 } | |
1991 } | |
1992 } | |
1993 InterfaceType supertype = currentElement.supertype; | |
1994 if (supertype == null) { | |
1995 return null; | |
1996 } | |
1997 currentElement = supertype.element; | |
1998 } | |
1999 return null; | |
2000 } | |
2001 MethodElement lookUpMethod(String methodName, LibraryElement library) { | |
2002 Set<ClassElement> visitedClasses = new Set<ClassElement>(); | |
2003 ClassElement currentElement = this; | |
2004 while (currentElement != null && !visitedClasses.contains(currentElement)) { | |
2005 javaSetAdd(visitedClasses, currentElement); | |
2006 MethodElement element = currentElement.getMethod(methodName); | |
2007 if (element != null && element.isAccessibleIn(library)) { | |
2008 return element; | |
2009 } | |
2010 for (InterfaceType mixin in currentElement.mixins) { | |
2011 ClassElement mixinElement = mixin.element; | |
2012 if (mixinElement != null) { | |
2013 element = mixinElement.getMethod(methodName); | |
2014 if (element != null && element.isAccessibleIn(library)) { | |
2015 return element; | |
2016 } | |
2017 } | |
2018 } | |
2019 InterfaceType supertype = currentElement.supertype; | |
2020 if (supertype == null) { | |
2021 return null; | |
2022 } | |
2023 currentElement = supertype.element; | |
2024 } | |
2025 return null; | |
2026 } | |
2027 PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library
) { | |
2028 Set<ClassElement> visitedClasses = new Set<ClassElement>(); | |
2029 ClassElement currentElement = this; | |
2030 while (currentElement != null && !visitedClasses.contains(currentElement)) { | |
2031 javaSetAdd(visitedClasses, currentElement); | |
2032 PropertyAccessorElement element = currentElement.getSetter(setterName); | |
2033 if (element != null && element.isAccessibleIn(library)) { | |
2034 return element; | |
2035 } | |
2036 for (InterfaceType mixin in currentElement.mixins) { | |
2037 ClassElement mixinElement = mixin.element; | |
2038 if (mixinElement != null) { | |
2039 element = mixinElement.getSetter(setterName); | |
2040 if (element != null && element.isAccessibleIn(library)) { | |
2041 return element; | |
2042 } | |
2043 } | |
2044 } | |
2045 InterfaceType supertype = currentElement.supertype; | |
2046 if (supertype == null) { | |
2047 return null; | |
2048 } | |
2049 currentElement = supertype.element; | |
2050 } | |
2051 return null; | |
2052 } | |
2053 | |
2054 /** | |
2055 * Set whether this class is abstract to correspond to the given value. | |
2056 * | |
2057 * @param isAbstract `true` if the class is abstract | |
2058 */ | |
2059 void set abstract(bool isAbstract) { | |
2060 setModifier(Modifier.ABSTRACT, isAbstract); | |
2061 } | |
2062 | |
2063 /** | |
2064 * Set the accessors contained in this class to the given accessors. | |
2065 * | |
2066 * @param accessors the accessors contained in this class | |
2067 */ | |
2068 void set accessors(List<PropertyAccessorElement> accessors) { | |
2069 for (PropertyAccessorElement accessor in accessors) { | |
2070 ((accessor as PropertyAccessorElementImpl)).enclosingElement = this; | |
2071 } | |
2072 this._accessors = accessors; | |
2073 } | |
2074 | |
2075 /** | |
2076 * Set the constructors contained in this class to the given constructors. | |
2077 * | |
2078 * @param constructors the constructors contained in this class | |
2079 */ | |
2080 void set constructors(List<ConstructorElement> constructors) { | |
2081 for (ConstructorElement constructor in constructors) { | |
2082 ((constructor as ConstructorElementImpl)).enclosingElement = this; | |
2083 } | |
2084 this._constructors = constructors; | |
2085 } | |
2086 | |
2087 /** | |
2088 * Set the fields contained in this class to the given fields. | |
2089 * | |
2090 * @param fields the fields contained in this class | |
2091 */ | |
2092 void set fields(List<FieldElement> fields) { | |
2093 for (FieldElement field in fields) { | |
2094 ((field as FieldElementImpl)).enclosingElement = this; | |
2095 } | |
2096 this._fields = fields; | |
2097 } | |
2098 | |
2099 /** | |
2100 * Set whether this class references 'super' to the given value. | |
2101 * | |
2102 * @param isReferencedSuper `true` references 'super' | |
2103 */ | |
2104 void set hasReferenceToSuper2(bool isReferencedSuper) { | |
2105 setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper); | |
2106 } | |
2107 | |
2108 /** | |
2109 * Set the interfaces that are implemented by this class to the given types. | |
2110 * | |
2111 * @param the interfaces that are implemented by this class | |
2112 */ | |
2113 void set interfaces(List<InterfaceType> interfaces) { | |
2114 this._interfaces = interfaces; | |
2115 } | |
2116 | |
2117 /** | |
2118 * Set the methods contained in this class to the given methods. | |
2119 * | |
2120 * @param methods the methods contained in this class | |
2121 */ | |
2122 void set methods(List<MethodElement> methods) { | |
2123 for (MethodElement method in methods) { | |
2124 ((method as MethodElementImpl)).enclosingElement = this; | |
2125 } | |
2126 this._methods = methods; | |
2127 } | |
2128 | |
2129 /** | |
2130 * Set the mixins that are applied to the class being extended in order to der
ive the superclass | |
2131 * of this class to the given types. | |
2132 * | |
2133 * @param mixins the mixins that are applied to derive the superclass of this
class | |
2134 */ | |
2135 void set mixins(List<InterfaceType> mixins) { | |
2136 this._mixins = mixins; | |
2137 } | |
2138 | |
2139 /** | |
2140 * Set the superclass of the class to the given type. | |
2141 * | |
2142 * @param supertype the superclass of the class | |
2143 */ | |
2144 void set supertype(InterfaceType supertype) { | |
2145 this._supertype = supertype; | |
2146 } | |
2147 | |
2148 /** | |
2149 * Set the type defined by the class to the given type. | |
2150 * | |
2151 * @param type the type defined by the class | |
2152 */ | |
2153 void set type(InterfaceType type) { | |
2154 this._type = type; | |
2155 } | |
2156 | |
2157 /** | |
2158 * Set whether this class is defined by a typedef construct to correspond to t
he given value. | |
2159 * | |
2160 * @param isTypedef `true` if the class is defined by a typedef construct | |
2161 */ | |
2162 void set typedef(bool isTypedef) { | |
2163 setModifier(Modifier.TYPEDEF, isTypedef); | |
2164 } | |
2165 | |
2166 /** | |
2167 * Set the type parameters defined for this class to the given type parameters
. | |
2168 * | |
2169 * @param typeParameters the type parameters defined for this class | |
2170 */ | |
2171 void set typeParameters(List<TypeParameterElement> typeParameters) { | |
2172 for (TypeParameterElement typeParameter in typeParameters) { | |
2173 ((typeParameter as TypeParameterElementImpl)).enclosingElement = this; | |
2174 } | |
2175 this._typeParameters = typeParameters; | |
2176 } | |
2177 | |
2178 /** | |
2179 * Set whether this class is a valid mixin to correspond to the given value. | |
2180 * | |
2181 * @param isValidMixin `true` if this class can be used as a mixin | |
2182 */ | |
2183 void set validMixin(bool isValidMixin) { | |
2184 setModifier(Modifier.MIXIN, isValidMixin); | |
2185 } | |
2186 void visitChildren(ElementVisitor visitor) { | |
2187 super.visitChildren(visitor); | |
2188 safelyVisitChildren(_accessors, visitor); | |
2189 safelyVisitChildren(_constructors, visitor); | |
2190 safelyVisitChildren(_fields, visitor); | |
2191 safelyVisitChildren(_methods, visitor); | |
2192 safelyVisitChildren(_typeParameters, visitor); | |
2193 } | |
2194 void appendTo(JavaStringBuilder builder) { | |
2195 String name = displayName; | |
2196 if (name == null) { | |
2197 builder.append("{unnamed class}"); | |
2198 } else { | |
2199 builder.append(name); | |
2200 } | |
2201 int variableCount = _typeParameters.length; | |
2202 if (variableCount > 0) { | |
2203 builder.append("<"); | |
2204 for (int i = 0; i < variableCount; i++) { | |
2205 if (i > 0) { | |
2206 builder.append(", "); | |
2207 } | |
2208 ((_typeParameters[i] as TypeParameterElementImpl)).appendTo(builder); | |
2209 } | |
2210 builder.append(">"); | |
2211 } | |
2212 } | |
2213 void collectAllSupertypes(List<InterfaceType> supertypes) { | |
2214 List<InterfaceType> typesToVisit = new List<InterfaceType>(); | |
2215 List<ClassElement> visitedClasses = new List<ClassElement>(); | |
2216 typesToVisit.add(this.type); | |
2217 while (!typesToVisit.isEmpty) { | |
2218 InterfaceType currentType = typesToVisit.removeAt(0); | |
2219 ClassElement currentElement = currentType.element; | |
2220 if (!visitedClasses.contains(currentElement)) { | |
2221 visitedClasses.add(currentElement); | |
2222 if (currentType != this.type) { | |
2223 supertypes.add(currentType); | |
2224 } | |
2225 InterfaceType supertype = currentType.superclass; | |
2226 if (supertype != null) { | |
2227 typesToVisit.add(supertype); | |
2228 } | |
2229 for (InterfaceType type in currentElement.interfaces) { | |
2230 typesToVisit.add(type); | |
2231 } | |
2232 for (InterfaceType type in currentElement.mixins) { | |
2233 ClassElement element = type.element; | |
2234 if (!visitedClasses.contains(element)) { | |
2235 supertypes.add(type); | |
2236 } | |
2237 } | |
2238 } | |
2239 } | |
2240 } | |
2241 } | |
2242 /** | |
2243 * Instances of the class `CompilationUnitElementImpl` implement a | |
2244 * [CompilationUnitElement]. | |
2245 * | |
2246 * @coverage dart.engine.element | |
2247 */ | |
2248 class CompilationUnitElementImpl extends ElementImpl implements CompilationUnitE
lement { | |
2249 | |
2250 /** | |
2251 * An empty array of compilation unit elements. | |
2252 */ | |
2253 static List<CompilationUnitElement> EMPTY_ARRAY = new List<CompilationUnitElem
ent>(0); | |
2254 | |
2255 /** | |
2256 * An array containing all of the top-level accessors (getters and setters) co
ntained in this | |
2257 * compilation unit. | |
2258 */ | |
2259 List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_A
RRAY; | |
2260 | |
2261 /** | |
2262 * An array containing all of the top-level functions contained in this compil
ation unit. | |
2263 */ | |
2264 List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY; | |
2265 | |
2266 /** | |
2267 * An array containing all of the variables contained in this compilation unit
. | |
2268 */ | |
2269 List<TopLevelVariableElement> _variables = TopLevelVariableElementImpl.EMPTY_A
RRAY; | |
2270 | |
2271 /** | |
2272 * The source that corresponds to this compilation unit. | |
2273 */ | |
2274 Source _source; | |
2275 | |
2276 /** | |
2277 * An array containing all of the function type aliases contained in this comp
ilation unit. | |
2278 */ | |
2279 List<FunctionTypeAliasElement> _typeAliases = FunctionTypeAliasElementImpl.EMP
TY_ARRAY; | |
2280 | |
2281 /** | |
2282 * An array containing all of the types contained in this compilation unit. | |
2283 */ | |
2284 List<ClassElement> _types = ClassElementImpl.EMPTY_ARRAY; | |
2285 | |
2286 /** | |
2287 * The URI that is specified by the "part" directive in the enclosing library,
or `null` if | |
2288 * this is the defining compilation unit of a library. | |
2289 */ | |
2290 String _uri; | |
2291 | |
2292 /** | |
2293 * Initialize a newly created compilation unit element to have the given name. | |
2294 * | |
2295 * @param name the name of this element | |
2296 */ | |
2297 CompilationUnitElementImpl(String name) : super.con2(name, -1); | |
2298 accept(ElementVisitor visitor) => visitor.visitCompilationUnitElement(this); | |
2299 bool operator ==(Object object) => object != null && runtimeType == object.run
timeType && _source == ((object as CompilationUnitElementImpl)).source; | |
2300 List<PropertyAccessorElement> get accessors => _accessors; | |
2301 ElementImpl getChild(String identifier) { | |
2302 for (PropertyAccessorElement accessor in _accessors) { | |
2303 if (((accessor as PropertyAccessorElementImpl)).identifier == identifier)
{ | |
2304 return accessor as PropertyAccessorElementImpl; | |
2305 } | |
2306 } | |
2307 for (VariableElement variable in _variables) { | |
2308 if (((variable as VariableElementImpl)).identifier == identifier) { | |
2309 return variable as VariableElementImpl; | |
2310 } | |
2311 } | |
2312 for (ExecutableElement function in _functions) { | |
2313 if (((function as ExecutableElementImpl)).identifier == identifier) { | |
2314 return function as ExecutableElementImpl; | |
2315 } | |
2316 } | |
2317 for (FunctionTypeAliasElement typeAlias in _typeAliases) { | |
2318 if (((typeAlias as FunctionTypeAliasElementImpl)).identifier == identifier
) { | |
2319 return typeAlias as FunctionTypeAliasElementImpl; | |
2320 } | |
2321 } | |
2322 for (ClassElement type in _types) { | |
2323 if (((type as ClassElementImpl)).identifier == identifier) { | |
2324 return type as ClassElementImpl; | |
2325 } | |
2326 } | |
2327 return null; | |
2328 } | |
2329 LibraryElement get enclosingElement => super.enclosingElement as LibraryElemen
t; | |
2330 List<FunctionElement> get functions => _functions; | |
2331 List<FunctionTypeAliasElement> get functionTypeAliases => _typeAliases; | |
2332 ElementKind get kind => ElementKind.COMPILATION_UNIT; | |
2333 Source get source => _source; | |
2334 List<TopLevelVariableElement> get topLevelVariables => _variables; | |
2335 ClassElement getType(String className) { | |
2336 for (ClassElement type in _types) { | |
2337 if (type.name == className) { | |
2338 return type; | |
2339 } | |
2340 } | |
2341 return null; | |
2342 } | |
2343 List<ClassElement> get types => _types; | |
2344 String get uri => _uri; | |
2345 int get hashCode => _source.hashCode; | |
2346 | |
2347 /** | |
2348 * Set the top-level accessors (getters and setters) contained in this compila
tion unit to the | |
2349 * given accessors. | |
2350 * | |
2351 * @param the top-level accessors (getters and setters) contained in this comp
ilation unit | |
2352 */ | |
2353 void set accessors(List<PropertyAccessorElement> accessors) { | |
2354 for (PropertyAccessorElement accessor in accessors) { | |
2355 ((accessor as PropertyAccessorElementImpl)).enclosingElement = this; | |
2356 } | |
2357 this._accessors = accessors; | |
2358 } | |
2359 | |
2360 /** | |
2361 * Set the top-level functions contained in this compilation unit to the given
functions. | |
2362 * | |
2363 * @param functions the top-level functions contained in this compilation unit | |
2364 */ | |
2365 void set functions(List<FunctionElement> functions) { | |
2366 for (FunctionElement function in functions) { | |
2367 ((function as FunctionElementImpl)).enclosingElement = this; | |
2368 } | |
2369 this._functions = functions; | |
2370 } | |
2371 | |
2372 /** | |
2373 * Set the source that corresponds to this compilation unit to the given sourc
e. | |
2374 * | |
2375 * @param source the source that corresponds to this compilation unit | |
2376 */ | |
2377 void set source(Source source) { | |
2378 this._source = source; | |
2379 } | |
2380 | |
2381 /** | |
2382 * Set the top-level variables contained in this compilation unit to the given
variables. | |
2383 * | |
2384 * @param variables the top-level variables contained in this compilation unit | |
2385 */ | |
2386 void set topLevelVariables(List<TopLevelVariableElement> variables) { | |
2387 for (TopLevelVariableElement field in variables) { | |
2388 ((field as TopLevelVariableElementImpl)).enclosingElement = this; | |
2389 } | |
2390 this._variables = variables; | |
2391 } | |
2392 | |
2393 /** | |
2394 * Set the function type aliases contained in this compilation unit to the giv
en type aliases. | |
2395 * | |
2396 * @param typeAliases the function type aliases contained in this compilation
unit | |
2397 */ | |
2398 void set typeAliases(List<FunctionTypeAliasElement> typeAliases) { | |
2399 for (FunctionTypeAliasElement typeAlias in typeAliases) { | |
2400 ((typeAlias as FunctionTypeAliasElementImpl)).enclosingElement = this; | |
2401 } | |
2402 this._typeAliases = typeAliases; | |
2403 } | |
2404 | |
2405 /** | |
2406 * Set the types contained in this compilation unit to the given types. | |
2407 * | |
2408 * @param types types contained in this compilation unit | |
2409 */ | |
2410 void set types(List<ClassElement> types) { | |
2411 for (ClassElement type in types) { | |
2412 ((type as ClassElementImpl)).enclosingElement = this; | |
2413 } | |
2414 this._types = types; | |
2415 } | |
2416 | |
2417 /** | |
2418 * Set the URI that is specified by the "part" directive in the enclosing libr
ary. | |
2419 * | |
2420 * @param uri the URI that is specified by the "part" directive in the enclosi
ng library. | |
2421 */ | |
2422 void set uri(String uri) { | |
2423 this._uri = uri; | |
2424 } | |
2425 void visitChildren(ElementVisitor visitor) { | |
2426 super.visitChildren(visitor); | |
2427 safelyVisitChildren(_accessors, visitor); | |
2428 safelyVisitChildren(_functions, visitor); | |
2429 safelyVisitChildren(_typeAliases, visitor); | |
2430 safelyVisitChildren(_types, visitor); | |
2431 safelyVisitChildren(_variables, visitor); | |
2432 } | |
2433 void appendTo(JavaStringBuilder builder) { | |
2434 if (_source == null) { | |
2435 builder.append("{compilation unit}"); | |
2436 } else { | |
2437 builder.append(_source.fullName); | |
2438 } | |
2439 } | |
2440 String get identifier => source.encoding; | |
2441 } | |
2442 /** | |
2443 * Instances of the class `ConstFieldElementImpl` implement a `FieldElement` for
a | |
2444 * 'const' field that has an initializer. | |
2445 */ | |
2446 class ConstFieldElementImpl extends FieldElementImpl { | |
2447 | |
2448 /** | |
2449 * The result of evaluating this variable's initializer. | |
2450 */ | |
2451 EvaluationResultImpl _result; | |
2452 | |
2453 /** | |
2454 * Initialize a newly created field element to have the given name. | |
2455 * | |
2456 * @param name the name of this element | |
2457 */ | |
2458 ConstFieldElementImpl(Identifier name) : super.con1(name); | |
2459 EvaluationResultImpl get evaluationResult => _result; | |
2460 void set evaluationResult(EvaluationResultImpl result) { | |
2461 this._result = result; | |
2462 } | |
2463 } | |
2464 /** | |
2465 * Instances of the class `ConstLocalVariableElementImpl` implement a | |
2466 * `LocalVariableElement` for a local 'const' variable that has an initializer. | |
2467 * | |
2468 * @coverage dart.engine.element | |
2469 */ | |
2470 class ConstLocalVariableElementImpl extends LocalVariableElementImpl { | |
2471 | |
2472 /** | |
2473 * The result of evaluating this variable's initializer. | |
2474 */ | |
2475 EvaluationResultImpl _result; | |
2476 | |
2477 /** | |
2478 * Initialize a newly created local variable element to have the given name. | |
2479 * | |
2480 * @param name the name of this element | |
2481 */ | |
2482 ConstLocalVariableElementImpl(Identifier name) : super(name); | |
2483 EvaluationResultImpl get evaluationResult => _result; | |
2484 void set evaluationResult(EvaluationResultImpl result) { | |
2485 this._result = result; | |
2486 } | |
2487 } | |
2488 /** | |
2489 * Instances of the class `ConstTopLevelVariableElementImpl` implement a | |
2490 * `TopLevelVariableElement` for a top-level 'const' variable that has an initia
lizer. | |
2491 */ | |
2492 class ConstTopLevelVariableElementImpl extends TopLevelVariableElementImpl { | |
2493 | |
2494 /** | |
2495 * The result of evaluating this variable's initializer. | |
2496 */ | |
2497 EvaluationResultImpl _result; | |
2498 | |
2499 /** | |
2500 * Initialize a newly created top-level variable element to have the given nam
e. | |
2501 * | |
2502 * @param name the name of this element | |
2503 */ | |
2504 ConstTopLevelVariableElementImpl(Identifier name) : super.con1(name); | |
2505 EvaluationResultImpl get evaluationResult => _result; | |
2506 void set evaluationResult(EvaluationResultImpl result) { | |
2507 this._result = result; | |
2508 } | |
2509 } | |
2510 /** | |
2511 * Instances of the class `ConstructorElementImpl` implement a `ConstructorEleme
nt`. | |
2512 * | |
2513 * @coverage dart.engine.element | |
2514 */ | |
2515 class ConstructorElementImpl extends ExecutableElementImpl implements Constructo
rElement { | |
2516 | |
2517 /** | |
2518 * An empty array of constructor elements. | |
2519 */ | |
2520 static List<ConstructorElement> EMPTY_ARRAY = new List<ConstructorElement>(0); | |
2521 | |
2522 /** | |
2523 * The constructor to which this constructor is redirecting. | |
2524 */ | |
2525 ConstructorElement _redirectedConstructor; | |
2526 | |
2527 /** | |
2528 * Initialize a newly created constructor element to have the given name. | |
2529 * | |
2530 * @param name the name of this element | |
2531 */ | |
2532 ConstructorElementImpl(Identifier name) : super.con1(name); | |
2533 accept(ElementVisitor visitor) => visitor.visitConstructorElement(this); | |
2534 ClassElement get enclosingElement => super.enclosingElement as ClassElement; | |
2535 ElementKind get kind => ElementKind.CONSTRUCTOR; | |
2536 ConstructorElement get redirectedConstructor => _redirectedConstructor; | |
2537 bool get isConst => hasModifier(Modifier.CONST); | |
2538 bool get isDefaultConstructor { | |
2539 String name = this.name; | |
2540 if (name != null && name.length != 0) { | |
2541 return false; | |
2542 } | |
2543 for (ParameterElement parameter in parameters) { | |
2544 if (identical(parameter.parameterKind, ParameterKind.REQUIRED)) { | |
2545 return false; | |
2546 } | |
2547 } | |
2548 return true; | |
2549 } | |
2550 bool get isFactory => hasModifier(Modifier.FACTORY); | |
2551 bool get isStatic => false; | |
2552 | |
2553 /** | |
2554 * Set whether this constructor represents a 'const' constructor to the given
value. | |
2555 * | |
2556 * @param isConst `true` if this constructor represents a 'const' constructor | |
2557 */ | |
2558 void set const2(bool isConst) { | |
2559 setModifier(Modifier.CONST, isConst); | |
2560 } | |
2561 | |
2562 /** | |
2563 * Set whether this constructor represents a factory method to the given value
. | |
2564 * | |
2565 * @param isFactory `true` if this constructor represents a factory method | |
2566 */ | |
2567 void set factory(bool isFactory) { | |
2568 setModifier(Modifier.FACTORY, isFactory); | |
2569 } | |
2570 | |
2571 /** | |
2572 * Sets the constructor to which this constructor is redirecting. | |
2573 * | |
2574 * @param redirectedConstructor the constructor to which this constructor is r
edirecting | |
2575 */ | |
2576 void set redirectedConstructor(ConstructorElement redirectedConstructor) { | |
2577 this._redirectedConstructor = redirectedConstructor; | |
2578 } | |
2579 void appendTo(JavaStringBuilder builder) { | |
2580 builder.append(enclosingElement.displayName); | |
2581 String name = displayName; | |
2582 if (name != null && !name.isEmpty) { | |
2583 builder.append("."); | |
2584 builder.append(name); | |
2585 } | |
2586 super.appendTo(builder); | |
2587 } | |
2588 } | |
2589 /** | |
2590 * Instances of the class `DefaultFieldFormalParameterElementImpl` implement a | |
2591 * `FieldFormalParameterElementImpl` for parameters that have an initializer. | |
2592 * | |
2593 * @coverage dart.engine.element | |
2594 */ | |
2595 class DefaultFieldFormalParameterElementImpl extends FieldFormalParameterElement
Impl { | |
2596 | |
2597 /** | |
2598 * The result of evaluating this variable's initializer. | |
2599 */ | |
2600 EvaluationResultImpl _result; | |
2601 | |
2602 /** | |
2603 * Initialize a newly created parameter element to have the given name. | |
2604 * | |
2605 * @param name the name of this element | |
2606 */ | |
2607 DefaultFieldFormalParameterElementImpl(Identifier name) : super(name); | |
2608 EvaluationResultImpl get evaluationResult => _result; | |
2609 void set evaluationResult(EvaluationResultImpl result) { | |
2610 this._result = result; | |
2611 } | |
2612 } | |
2613 /** | |
2614 * Instances of the class `DefaultParameterElementImpl` implement a `ParameterEl
ement` | |
2615 * for parameters that have an initializer. | |
2616 * | |
2617 * @coverage dart.engine.element | |
2618 */ | |
2619 class DefaultParameterElementImpl extends ParameterElementImpl { | |
2620 | |
2621 /** | |
2622 * The result of evaluating this variable's initializer. | |
2623 */ | |
2624 EvaluationResultImpl _result; | |
2625 | |
2626 /** | |
2627 * Initialize a newly created parameter element to have the given name. | |
2628 * | |
2629 * @param name the name of this element | |
2630 */ | |
2631 DefaultParameterElementImpl(Identifier name) : super.con1(name); | |
2632 EvaluationResultImpl get evaluationResult => _result; | |
2633 void set evaluationResult(EvaluationResultImpl result) { | |
2634 this._result = result; | |
2635 } | |
2636 } | |
2637 /** | |
2638 * Instances of the class `DynamicElementImpl` represent the synthetic element r
epresenting | |
2639 * the declaration of the type `dynamic`. | |
2640 * | |
2641 * @coverage dart.engine.element | |
2642 */ | |
2643 class DynamicElementImpl extends ElementImpl { | |
2644 | |
2645 /** | |
2646 * Return the unique instance of this class. | |
2647 * | |
2648 * @return the unique instance of this class | |
2649 */ | |
2650 static DynamicElementImpl get instance => DynamicTypeImpl.instance.element as
DynamicElementImpl; | |
2651 | |
2652 /** | |
2653 * The type defined by this element. | |
2654 */ | |
2655 DynamicTypeImpl type; | |
2656 | |
2657 /** | |
2658 * Initialize a newly created instance of this class. Instances of this class
should <b>not</b> be | |
2659 * created except as part of creating the type associated with this element. T
he single instance | |
2660 * of this class should be accessed through the method [getInstance]. | |
2661 */ | |
2662 DynamicElementImpl() : super.con2(Keyword.DYNAMIC.syntax, -1) { | |
2663 setModifier(Modifier.SYNTHETIC, true); | |
2664 } | |
2665 accept(ElementVisitor visitor) => null; | |
2666 ElementKind get kind => ElementKind.DYNAMIC; | |
2667 } | |
2668 /** | |
2669 * Instances of the class `ElementAnnotationImpl` implement an [ElementAnnotatio
n]. | |
2670 * | |
2671 * @coverage dart.engine.element | |
2672 */ | |
2673 class ElementAnnotationImpl implements ElementAnnotation { | |
2674 | |
2675 /** | |
2676 * The element representing the field, variable, or constructor being used as
an annotation. | |
2677 */ | |
2678 Element _element; | |
2679 | |
2680 /** | |
2681 * An empty array of annotations. | |
2682 */ | |
2683 static List<ElementAnnotationImpl> EMPTY_ARRAY = new List<ElementAnnotationImp
l>(0); | |
2684 | |
2685 /** | |
2686 * Initialize a newly created annotation. | |
2687 * | |
2688 * @param element the element representing the field, variable, or constructor
being used as an | |
2689 * annotation | |
2690 */ | |
2691 ElementAnnotationImpl(Element element) { | |
2692 this._element = element; | |
2693 } | |
2694 Element get element => _element; | |
2695 String toString() => "@${_element.toString()}"; | |
2696 } | |
2697 /** | |
2698 * The abstract class `ElementImpl` implements the behavior common to objects th
at implement | |
2699 * an [Element]. | |
2700 * | |
2701 * @coverage dart.engine.element | |
2702 */ | |
2703 abstract class ElementImpl implements Element { | |
2704 | |
2705 /** | |
2706 * The enclosing element of this element, or `null` if this element is at the
root of the | |
2707 * element structure. | |
2708 */ | |
2709 ElementImpl _enclosingElement; | |
2710 | |
2711 /** | |
2712 * The name of this element. | |
2713 */ | |
2714 String _name; | |
2715 | |
2716 /** | |
2717 * The offset of the name of this element in the file that contains the declar
ation of this | |
2718 * element. | |
2719 */ | |
2720 int _nameOffset = 0; | |
2721 | |
2722 /** | |
2723 * A bit-encoded form of the modifiers associated with this element. | |
2724 */ | |
2725 int _modifiers = 0; | |
2726 | |
2727 /** | |
2728 * An array containing all of the metadata associated with this element. | |
2729 */ | |
2730 List<ElementAnnotation> _metadata = ElementAnnotationImpl.EMPTY_ARRAY; | |
2731 | |
2732 /** | |
2733 * A cached copy of the calculated hashCode for this element. | |
2734 */ | |
2735 int _cachedHashCode = 0; | |
2736 | |
2737 /** | |
2738 * Initialize a newly created element to have the given name. | |
2739 * | |
2740 * @param name the name of this element | |
2741 */ | |
2742 ElementImpl.con1(Identifier name) : this.con2(name == null ? "" : name.name, n
ame == null ? -1 : name.offset); | |
2743 | |
2744 /** | |
2745 * Initialize a newly created element to have the given name. | |
2746 * | |
2747 * @param name the name of this element | |
2748 * @param nameOffset the offset of the name of this element in the file that c
ontains the | |
2749 * declaration of this element | |
2750 */ | |
2751 ElementImpl.con2(String name, int nameOffset) { | |
2752 this._name = StringUtilities.intern(name); | |
2753 this._nameOffset = nameOffset; | |
2754 } | |
2755 String computeDocumentationComment() { | |
2756 AnalysisContext context = this.context; | |
2757 if (context == null) { | |
2758 return null; | |
2759 } | |
2760 return context.computeDocumentationComment(this); | |
2761 } | |
2762 bool operator ==(Object object) { | |
2763 if (identical(this, object)) { | |
2764 return true; | |
2765 } | |
2766 if (object == null || hashCode != object.hashCode) { | |
2767 return false; | |
2768 } | |
2769 return object.runtimeType == runtimeType && ((object as Element)).location =
= location; | |
2770 } | |
2771 Element getAncestor(Type elementClass) { | |
2772 Element ancestor = _enclosingElement; | |
2773 while (ancestor != null && !isInstanceOf(ancestor, elementClass)) { | |
2774 ancestor = ancestor.enclosingElement; | |
2775 } | |
2776 return ancestor as Element; | |
2777 } | |
2778 | |
2779 /** | |
2780 * Return the child of this element that is uniquely identified by the given i
dentifier, or | |
2781 * `null` if there is no such child. | |
2782 * | |
2783 * @param identifier the identifier used to select a child | |
2784 * @return the child of this element with the given identifier | |
2785 */ | |
2786 ElementImpl getChild(String identifier) => null; | |
2787 AnalysisContext get context { | |
2788 if (_enclosingElement == null) { | |
2789 return null; | |
2790 } | |
2791 return _enclosingElement.context; | |
2792 } | |
2793 String get displayName => _name; | |
2794 Element get enclosingElement => _enclosingElement; | |
2795 LibraryElement get library => getAncestor(LibraryElement); | |
2796 ElementLocation get location => new ElementLocationImpl.con1(this); | |
2797 List<ElementAnnotation> get metadata => _metadata; | |
2798 String get name => _name; | |
2799 int get nameOffset => _nameOffset; | |
2800 Source get source { | |
2801 if (_enclosingElement == null) { | |
2802 return null; | |
2803 } | |
2804 return _enclosingElement.source; | |
2805 } | |
2806 int get hashCode { | |
2807 if (_cachedHashCode == 0) { | |
2808 _cachedHashCode = location.hashCode; | |
2809 } | |
2810 return _cachedHashCode; | |
2811 } | |
2812 bool isAccessibleIn(LibraryElement library) { | |
2813 if (Identifier.isPrivateName(_name)) { | |
2814 return library == this.library; | |
2815 } | |
2816 return true; | |
2817 } | |
2818 bool get isSynthetic => hasModifier(Modifier.SYNTHETIC); | |
2819 | |
2820 /** | |
2821 * Set the metadata associate with this element to the given array of annotati
ons. | |
2822 * | |
2823 * @param metadata the metadata to be associated with this element | |
2824 */ | |
2825 void set metadata(List<ElementAnnotation> metadata) { | |
2826 this._metadata = metadata; | |
2827 } | |
2828 | |
2829 /** | |
2830 * Set the offset of the name of this element in the file that contains the de
claration of this | |
2831 * element to the given value. This is normally done via the constructor, but
this method is | |
2832 * provided to support unnamed constructors. | |
2833 * | |
2834 * @param nameOffset the offset to the beginning of the name | |
2835 */ | |
2836 void set nameOffset(int nameOffset) { | |
2837 this._nameOffset = nameOffset; | |
2838 } | |
2839 | |
2840 /** | |
2841 * Set whether this element is synthetic to correspond to the given value. | |
2842 * | |
2843 * @param isSynthetic `true` if the element is synthetic | |
2844 */ | |
2845 void set synthetic(bool isSynthetic) { | |
2846 setModifier(Modifier.SYNTHETIC, isSynthetic); | |
2847 } | |
2848 String toString() { | |
2849 JavaStringBuilder builder = new JavaStringBuilder(); | |
2850 appendTo(builder); | |
2851 return builder.toString(); | |
2852 } | |
2853 void visitChildren(ElementVisitor visitor) { | |
2854 } | |
2855 | |
2856 /** | |
2857 * Append a textual representation of this type to the given builder. | |
2858 * | |
2859 * @param builder the builder to which the text is to be appended | |
2860 */ | |
2861 void appendTo(JavaStringBuilder builder) { | |
2862 if (_name == null) { | |
2863 builder.append("<unnamed "); | |
2864 builder.append(runtimeType.toString()); | |
2865 builder.append(">"); | |
2866 } else { | |
2867 builder.append(_name); | |
2868 } | |
2869 } | |
2870 | |
2871 /** | |
2872 * Return an identifier that uniquely identifies this element among the childr
en of this element's | |
2873 * parent. | |
2874 * | |
2875 * @return an identifier that uniquely identifies this element relative to its
parent | |
2876 */ | |
2877 String get identifier => name; | |
2878 | |
2879 /** | |
2880 * Return `true` if this element has the given modifier associated with it. | |
2881 * | |
2882 * @param modifier the modifier being tested for | |
2883 * @return `true` if this element has the given modifier associated with it | |
2884 */ | |
2885 bool hasModifier(Modifier modifier) => BooleanArray.get(_modifiers, modifier); | |
2886 | |
2887 /** | |
2888 * If the given child is not `null`, use the given visitor to visit it. | |
2889 * | |
2890 * @param child the child to be visited | |
2891 * @param visitor the visitor to be used to visit the child | |
2892 */ | |
2893 void safelyVisitChild(Element child, ElementVisitor visitor) { | |
2894 if (child != null) { | |
2895 child.accept(visitor); | |
2896 } | |
2897 } | |
2898 | |
2899 /** | |
2900 * Use the given visitor to visit all of the children in the given array. | |
2901 * | |
2902 * @param children the children to be visited | |
2903 * @param visitor the visitor being used to visit the children | |
2904 */ | |
2905 void safelyVisitChildren(List<Element> children, ElementVisitor visitor) { | |
2906 if (children != null) { | |
2907 for (Element child in children) { | |
2908 child.accept(visitor); | |
2909 } | |
2910 } | |
2911 } | |
2912 | |
2913 /** | |
2914 * Set the enclosing element of this element to the given element. | |
2915 * | |
2916 * @param element the enclosing element of this element | |
2917 */ | |
2918 void set enclosingElement(Element element) { | |
2919 _enclosingElement = element as ElementImpl; | |
2920 } | |
2921 | |
2922 /** | |
2923 * Set whether the given modifier is associated with this element to correspon
d to the given | |
2924 * value. | |
2925 * | |
2926 * @param modifier the modifier to be set | |
2927 * @param value `true` if the modifier is to be associated with this element | |
2928 */ | |
2929 void setModifier(Modifier modifier, bool value) { | |
2930 _modifiers = BooleanArray.set(_modifiers, modifier, value); | |
2931 } | |
2932 } | |
2933 /** | |
2934 * Instances of the class `ElementLocationImpl` implement an [ElementLocation]. | |
2935 * | |
2936 * @coverage dart.engine.element | |
2937 */ | |
2938 class ElementLocationImpl implements ElementLocation { | |
2939 | |
2940 /** | |
2941 * The path to the element whose location is represented by this object. | |
2942 */ | |
2943 List<String> components; | |
2944 | |
2945 /** | |
2946 * The character used to separate components in the encoded form. | |
2947 */ | |
2948 static int _SEPARATOR_CHAR = 0x3B; | |
2949 | |
2950 /** | |
2951 * Initialize a newly created location to represent the given element. | |
2952 * | |
2953 * @param element the element whose location is being represented | |
2954 */ | |
2955 ElementLocationImpl.con1(Element element) { | |
2956 List<String> components = new List<String>(); | |
2957 Element ancestor = element; | |
2958 while (ancestor != null) { | |
2959 components.insert(0, ((ancestor as ElementImpl)).identifier); | |
2960 ancestor = ancestor.enclosingElement; | |
2961 } | |
2962 this.components = new List.from(components); | |
2963 } | |
2964 | |
2965 /** | |
2966 * Initialize a newly created location from the given encoded form. | |
2967 * | |
2968 * @param encoding the encoded form of a location | |
2969 */ | |
2970 ElementLocationImpl.con2(String encoding) { | |
2971 this.components = decode(encoding); | |
2972 } | |
2973 bool operator ==(Object object) { | |
2974 if (identical(this, object)) { | |
2975 return true; | |
2976 } | |
2977 if (object is! ElementLocationImpl) { | |
2978 return false; | |
2979 } | |
2980 ElementLocationImpl location = object as ElementLocationImpl; | |
2981 List<String> otherComponents = location.components; | |
2982 int length = components.length; | |
2983 if (otherComponents.length != length) { | |
2984 return false; | |
2985 } | |
2986 for (int i = length - 1; i >= 2; i--) { | |
2987 if (components[i] != otherComponents[i]) { | |
2988 return false; | |
2989 } | |
2990 } | |
2991 if (length > 1 && !equalSourceComponents(components[1], otherComponents[1]))
{ | |
2992 return false; | |
2993 } | |
2994 if (length > 0 && !equalSourceComponents(components[0], otherComponents[0]))
{ | |
2995 return false; | |
2996 } | |
2997 return true; | |
2998 } | |
2999 String get encoding { | |
3000 JavaStringBuilder builder = new JavaStringBuilder(); | |
3001 int length = components.length; | |
3002 for (int i = 0; i < length; i++) { | |
3003 if (i > 0) { | |
3004 builder.appendChar(_SEPARATOR_CHAR); | |
3005 } | |
3006 encode(builder, components[i]); | |
3007 } | |
3008 return builder.toString(); | |
3009 } | |
3010 int get hashCode { | |
3011 int result = 1; | |
3012 for (int i = 0; i < components.length; i++) { | |
3013 String component = components[i]; | |
3014 int componentHash; | |
3015 if (i <= 1) { | |
3016 componentHash = hashSourceComponent(component); | |
3017 } else { | |
3018 componentHash = component.hashCode; | |
3019 } | |
3020 result = 31 * result + componentHash; | |
3021 } | |
3022 return result; | |
3023 } | |
3024 String toString() => encoding; | |
3025 | |
3026 /** | |
3027 * Decode the encoded form of a location into an array of components. | |
3028 * | |
3029 * @param encoding the encoded form of a location | |
3030 * @return the components that were encoded | |
3031 */ | |
3032 List<String> decode(String encoding) { | |
3033 List<String> components = new List<String>(); | |
3034 JavaStringBuilder builder = new JavaStringBuilder(); | |
3035 int index = 0; | |
3036 int length = encoding.length; | |
3037 while (index < length) { | |
3038 int currentChar = encoding.codeUnitAt(index); | |
3039 if (currentChar == _SEPARATOR_CHAR) { | |
3040 if (index + 1 < length && encoding.codeUnitAt(index + 1) == _SEPARATOR_C
HAR) { | |
3041 builder.appendChar(_SEPARATOR_CHAR); | |
3042 index += 2; | |
3043 } else { | |
3044 components.add(builder.toString()); | |
3045 builder.length = 0; | |
3046 index++; | |
3047 } | |
3048 } else { | |
3049 builder.appendChar(currentChar); | |
3050 index++; | |
3051 } | |
3052 } | |
3053 if (builder.length > 0) { | |
3054 components.add(builder.toString()); | |
3055 } | |
3056 return new List.from(components); | |
3057 } | |
3058 | |
3059 /** | |
3060 * Append an encoded form of the given component to the given builder. | |
3061 * | |
3062 * @param builder the builder to which the encoded component is to be appended | |
3063 * @param component the component to be appended to the builder | |
3064 */ | |
3065 void encode(JavaStringBuilder builder, String component) { | |
3066 int length = component.length; | |
3067 for (int i = 0; i < length; i++) { | |
3068 int currentChar = component.codeUnitAt(i); | |
3069 if (currentChar == _SEPARATOR_CHAR) { | |
3070 builder.appendChar(_SEPARATOR_CHAR); | |
3071 } | |
3072 builder.appendChar(currentChar); | |
3073 } | |
3074 } | |
3075 | |
3076 /** | |
3077 * Return `true` if the given components, when interpreted to be encoded sourc
es with a | |
3078 * leading source type indicator, are equal when the source type's are ignored
. | |
3079 * | |
3080 * @param left the left component being compared | |
3081 * @param right the right component being compared | |
3082 * @return `true` if the given components are equal when the source type's are
ignored | |
3083 */ | |
3084 bool equalSourceComponents(String left, String right) { | |
3085 if (left == null) { | |
3086 return right == null; | |
3087 } else if (right == null) { | |
3088 return false; | |
3089 } | |
3090 int leftLength = left.length; | |
3091 int rightLength = right.length; | |
3092 if (leftLength != rightLength) { | |
3093 return false; | |
3094 } else if (leftLength <= 1 || rightLength <= 1) { | |
3095 return left == right; | |
3096 } | |
3097 return javaStringRegionMatches(left, 1, right, 1, leftLength - 1); | |
3098 } | |
3099 | |
3100 /** | |
3101 * Return the hash code of the given encoded source component, ignoring the so
urce type indicator. | |
3102 * | |
3103 * @param sourceComponent the component to compute a hash code | |
3104 * @return the hash code of the given encoded source component | |
3105 */ | |
3106 int hashSourceComponent(String sourceComponent) { | |
3107 if (sourceComponent.length <= 1) { | |
3108 return sourceComponent.hashCode; | |
3109 } | |
3110 return sourceComponent.substring(1).hashCode; | |
3111 } | |
3112 } | |
3113 /** | |
3114 * Instances of the class `EmbeddedHtmlScriptElementImpl` implement an | |
3115 * [EmbeddedHtmlScriptElement]. | |
3116 * | |
3117 * @coverage dart.engine.element | |
3118 */ | |
3119 class EmbeddedHtmlScriptElementImpl extends HtmlScriptElementImpl implements Emb
eddedHtmlScriptElement { | |
3120 | |
3121 /** | |
3122 * The library defined by the script tag's content. | |
3123 */ | |
3124 LibraryElement _scriptLibrary; | |
3125 | |
3126 /** | |
3127 * Initialize a newly created script element to have the specified tag name an
d offset. | |
3128 * | |
3129 * @param node the XML node from which this element is derived (not `null`) | |
3130 */ | |
3131 EmbeddedHtmlScriptElementImpl(XmlTagNode node) : super(node); | |
3132 accept(ElementVisitor visitor) => visitor.visitEmbeddedHtmlScriptElement(this)
; | |
3133 ElementKind get kind => ElementKind.EMBEDDED_HTML_SCRIPT; | |
3134 LibraryElement get scriptLibrary => _scriptLibrary; | |
3135 | |
3136 /** | |
3137 * Set the script library defined by the script tag's content. | |
3138 * | |
3139 * @param scriptLibrary the library or `null` if none | |
3140 */ | |
3141 void set scriptLibrary(LibraryElementImpl scriptLibrary) { | |
3142 scriptLibrary.enclosingElement = this; | |
3143 this._scriptLibrary = scriptLibrary; | |
3144 } | |
3145 void visitChildren(ElementVisitor visitor) { | |
3146 safelyVisitChild(_scriptLibrary, visitor); | |
3147 } | |
3148 } | |
3149 /** | |
3150 * The abstract class `ExecutableElementImpl` implements the behavior common to | |
3151 * `ExecutableElement`s. | |
3152 * | |
3153 * @coverage dart.engine.element | |
3154 */ | |
3155 abstract class ExecutableElementImpl extends ElementImpl implements ExecutableEl
ement { | |
3156 | |
3157 /** | |
3158 * An array containing all of the functions defined within this executable ele
ment. | |
3159 */ | |
3160 List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY; | |
3161 | |
3162 /** | |
3163 * An array containing all of the labels defined within this executable elemen
t. | |
3164 */ | |
3165 List<LabelElement> _labels = LabelElementImpl.EMPTY_ARRAY; | |
3166 | |
3167 /** | |
3168 * An array containing all of the local variables defined within this executab
le element. | |
3169 */ | |
3170 List<LocalVariableElement> _localVariables = LocalVariableElementImpl.EMPTY_AR
RAY; | |
3171 | |
3172 /** | |
3173 * An array containing all of the parameters defined by this executable elemen
t. | |
3174 */ | |
3175 List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY; | |
3176 | |
3177 /** | |
3178 * The return type defined by this executable element. | |
3179 */ | |
3180 Type2 _returnType; | |
3181 | |
3182 /** | |
3183 * The type of function defined by this executable element. | |
3184 */ | |
3185 FunctionType _type; | |
3186 | |
3187 /** | |
3188 * An empty array of executable elements. | |
3189 */ | |
3190 static List<ExecutableElement> EMPTY_ARRAY = new List<ExecutableElement>(0); | |
3191 | |
3192 /** | |
3193 * Initialize a newly created executable element to have the given name. | |
3194 * | |
3195 * @param name the name of this element | |
3196 */ | |
3197 ExecutableElementImpl.con1(Identifier name) : super.con1(name); | |
3198 | |
3199 /** | |
3200 * Initialize a newly created executable element to have the given name. | |
3201 * | |
3202 * @param name the name of this element | |
3203 * @param nameOffset the offset of the name of this element in the file that c
ontains the | |
3204 * declaration of this element | |
3205 */ | |
3206 ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nam
eOffset); | |
3207 ElementImpl getChild(String identifier) { | |
3208 for (ExecutableElement function in _functions) { | |
3209 if (((function as ExecutableElementImpl)).identifier == identifier) { | |
3210 return function as ExecutableElementImpl; | |
3211 } | |
3212 } | |
3213 for (LabelElement label in _labels) { | |
3214 if (((label as LabelElementImpl)).identifier == identifier) { | |
3215 return label as LabelElementImpl; | |
3216 } | |
3217 } | |
3218 for (VariableElement variable in _localVariables) { | |
3219 if (((variable as VariableElementImpl)).identifier == identifier) { | |
3220 return variable as VariableElementImpl; | |
3221 } | |
3222 } | |
3223 for (ParameterElement parameter in _parameters) { | |
3224 if (((parameter as ParameterElementImpl)).identifier == identifier) { | |
3225 return parameter as ParameterElementImpl; | |
3226 } | |
3227 } | |
3228 return null; | |
3229 } | |
3230 List<FunctionElement> get functions => _functions; | |
3231 List<LabelElement> get labels => _labels; | |
3232 List<LocalVariableElement> get localVariables => _localVariables; | |
3233 List<ParameterElement> get parameters => _parameters; | |
3234 Type2 get returnType => _returnType; | |
3235 FunctionType get type => _type; | |
3236 bool get isOperator => false; | |
3237 | |
3238 /** | |
3239 * Set the functions defined within this executable element to the given funct
ions. | |
3240 * | |
3241 * @param functions the functions defined within this executable element | |
3242 */ | |
3243 void set functions(List<FunctionElement> functions) { | |
3244 for (FunctionElement function in functions) { | |
3245 ((function as FunctionElementImpl)).enclosingElement = this; | |
3246 } | |
3247 this._functions = functions; | |
3248 } | |
3249 | |
3250 /** | |
3251 * Set the labels defined within this executable element to the given labels. | |
3252 * | |
3253 * @param labels the labels defined within this executable element | |
3254 */ | |
3255 void set labels(List<LabelElement> labels) { | |
3256 for (LabelElement label in labels) { | |
3257 ((label as LabelElementImpl)).enclosingElement = this; | |
3258 } | |
3259 this._labels = labels; | |
3260 } | |
3261 | |
3262 /** | |
3263 * Set the local variables defined within this executable element to the given
variables. | |
3264 * | |
3265 * @param localVariables the local variables defined within this executable el
ement | |
3266 */ | |
3267 void set localVariables(List<LocalVariableElement> localVariables) { | |
3268 for (LocalVariableElement variable in localVariables) { | |
3269 ((variable as LocalVariableElementImpl)).enclosingElement = this; | |
3270 } | |
3271 this._localVariables = localVariables; | |
3272 } | |
3273 | |
3274 /** | |
3275 * Set the parameters defined by this executable element to the given paramete
rs. | |
3276 * | |
3277 * @param parameters the parameters defined by this executable element | |
3278 */ | |
3279 void set parameters(List<ParameterElement> parameters) { | |
3280 for (ParameterElement parameter in parameters) { | |
3281 ((parameter as ParameterElementImpl)).enclosingElement = this; | |
3282 } | |
3283 this._parameters = parameters; | |
3284 } | |
3285 | |
3286 /** | |
3287 * Set the return type defined by this executable element. | |
3288 * | |
3289 * @param returnType the return type defined by this executable element | |
3290 */ | |
3291 void set returnType(Type2 returnType) { | |
3292 this._returnType = returnType; | |
3293 } | |
3294 | |
3295 /** | |
3296 * Set the type of function defined by this executable element to the given ty
pe. | |
3297 * | |
3298 * @param type the type of function defined by this executable element | |
3299 */ | |
3300 void set type(FunctionType type) { | |
3301 this._type = type; | |
3302 } | |
3303 void visitChildren(ElementVisitor visitor) { | |
3304 super.visitChildren(visitor); | |
3305 safelyVisitChildren(_functions, visitor); | |
3306 safelyVisitChildren(_labels, visitor); | |
3307 safelyVisitChildren(_localVariables, visitor); | |
3308 safelyVisitChildren(_parameters, visitor); | |
3309 } | |
3310 void appendTo(JavaStringBuilder builder) { | |
3311 builder.append("("); | |
3312 int parameterCount = _parameters.length; | |
3313 for (int i = 0; i < parameterCount; i++) { | |
3314 if (i > 0) { | |
3315 builder.append(", "); | |
3316 } | |
3317 ((_parameters[i] as ParameterElementImpl)).appendTo(builder); | |
3318 } | |
3319 builder.append(")"); | |
3320 if (_type != null) { | |
3321 builder.append(" -> "); | |
3322 builder.append(_type.returnType); | |
3323 } | |
3324 } | |
3325 } | |
3326 /** | |
3327 * Instances of the class `ExportElementImpl` implement an [ExportElement]. | |
3328 * | |
3329 * @coverage dart.engine.element | |
3330 */ | |
3331 class ExportElementImpl extends ElementImpl implements ExportElement { | |
3332 | |
3333 /** | |
3334 * The URI that is specified by this directive. | |
3335 */ | |
3336 String _uri; | |
3337 | |
3338 /** | |
3339 * The library that is exported from this library by this export directive. | |
3340 */ | |
3341 LibraryElement _exportedLibrary; | |
3342 | |
3343 /** | |
3344 * The combinators that were specified as part of the export directive in the
order in which they | |
3345 * were specified. | |
3346 */ | |
3347 List<NamespaceCombinator> _combinators = NamespaceCombinator.EMPTY_ARRAY; | |
3348 | |
3349 /** | |
3350 * Initialize a newly created export element. | |
3351 */ | |
3352 ExportElementImpl() : super.con1(null); | |
3353 accept(ElementVisitor visitor) => visitor.visitExportElement(this); | |
3354 List<NamespaceCombinator> get combinators => _combinators; | |
3355 LibraryElement get exportedLibrary => _exportedLibrary; | |
3356 ElementKind get kind => ElementKind.EXPORT; | |
3357 String get uri => _uri; | |
3358 | |
3359 /** | |
3360 * Set the combinators that were specified as part of the export directive to
the given array of | |
3361 * combinators. | |
3362 * | |
3363 * @param combinators the combinators that were specified as part of the expor
t directive | |
3364 */ | |
3365 void set combinators(List<NamespaceCombinator> combinators) { | |
3366 this._combinators = combinators; | |
3367 } | |
3368 | |
3369 /** | |
3370 * Set the library that is exported from this library by this import directive
to the given | |
3371 * library. | |
3372 * | |
3373 * @param exportedLibrary the library that is exported from this library | |
3374 */ | |
3375 void set exportedLibrary(LibraryElement exportedLibrary) { | |
3376 this._exportedLibrary = exportedLibrary; | |
3377 } | |
3378 | |
3379 /** | |
3380 * Set the URI that is specified by this directive. | |
3381 * | |
3382 * @param uri the URI that is specified by this directive. | |
3383 */ | |
3384 void set uri(String uri) { | |
3385 this._uri = uri; | |
3386 } | |
3387 void appendTo(JavaStringBuilder builder) { | |
3388 builder.append("export "); | |
3389 ((_exportedLibrary as LibraryElementImpl)).appendTo(builder); | |
3390 } | |
3391 String get identifier => _exportedLibrary.name; | |
3392 } | |
3393 /** | |
3394 * Instances of the class `ExternalHtmlScriptElementImpl` implement an | |
3395 * [ExternalHtmlScriptElement]. | |
3396 * | |
3397 * @coverage dart.engine.element | |
3398 */ | |
3399 class ExternalHtmlScriptElementImpl extends HtmlScriptElementImpl implements Ext
ernalHtmlScriptElement { | |
3400 | |
3401 /** | |
3402 * The source specified in the `source` attribute or `null` if unspecified. | |
3403 */ | |
3404 Source _scriptSource; | |
3405 | |
3406 /** | |
3407 * Initialize a newly created script element to have the specified tag name an
d offset. | |
3408 * | |
3409 * @param node the XML node from which this element is derived (not `null`) | |
3410 */ | |
3411 ExternalHtmlScriptElementImpl(XmlTagNode node) : super(node); | |
3412 accept(ElementVisitor visitor) => visitor.visitExternalHtmlScriptElement(this)
; | |
3413 ElementKind get kind => ElementKind.EXTERNAL_HTML_SCRIPT; | |
3414 Source get scriptSource => _scriptSource; | |
3415 | |
3416 /** | |
3417 * Set the source specified in the `source` attribute. | |
3418 * | |
3419 * @param scriptSource the script source or `null` if unspecified | |
3420 */ | |
3421 void set scriptSource(Source scriptSource) { | |
3422 this._scriptSource = scriptSource; | |
3423 } | |
3424 } | |
3425 /** | |
3426 * Instances of the class `FieldElementImpl` implement a `FieldElement`. | |
3427 * | |
3428 * @coverage dart.engine.element | |
3429 */ | |
3430 class FieldElementImpl extends PropertyInducingElementImpl implements FieldEleme
nt { | |
3431 | |
3432 /** | |
3433 * An empty array of field elements. | |
3434 */ | |
3435 static List<FieldElement> EMPTY_ARRAY = new List<FieldElement>(0); | |
3436 | |
3437 /** | |
3438 * Initialize a newly created field element to have the given name. | |
3439 * | |
3440 * @param name the name of this element | |
3441 */ | |
3442 FieldElementImpl.con1(Identifier name) : super.con1(name); | |
3443 | |
3444 /** | |
3445 * Initialize a newly created synthetic field element to have the given name. | |
3446 * | |
3447 * @param name the name of this element | |
3448 */ | |
3449 FieldElementImpl.con2(String name) : super.con2(name); | |
3450 accept(ElementVisitor visitor) => visitor.visitFieldElement(this); | |
3451 ClassElement get enclosingElement => super.enclosingElement as ClassElement; | |
3452 ElementKind get kind => ElementKind.FIELD; | |
3453 bool get isStatic => hasModifier(Modifier.STATIC); | |
3454 | |
3455 /** | |
3456 * Set whether this field is static to correspond to the given value. | |
3457 * | |
3458 * @param isStatic `true` if the field is static | |
3459 */ | |
3460 void set static(bool isStatic) { | |
3461 setModifier(Modifier.STATIC, isStatic); | |
3462 } | |
3463 } | |
3464 /** | |
3465 * Instances of the class `FieldFormalParameterElementImpl` extend | |
3466 * [ParameterElementImpl] to provide the additional information of the [FieldEle
ment] | |
3467 * associated with the parameter. | |
3468 * | |
3469 * @coverage dart.engine.element | |
3470 */ | |
3471 class FieldFormalParameterElementImpl extends ParameterElementImpl implements Fi
eldFormalParameterElement { | |
3472 | |
3473 /** | |
3474 * The field associated with this field formal parameter. | |
3475 */ | |
3476 FieldElement _field; | |
3477 | |
3478 /** | |
3479 * Initialize a newly created parameter element to have the given name. | |
3480 * | |
3481 * @param name the name of this element | |
3482 */ | |
3483 FieldFormalParameterElementImpl(Identifier name) : super.con1(name); | |
3484 accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(thi
s); | |
3485 FieldElement get field => _field; | |
3486 bool get isInitializingFormal => true; | |
3487 | |
3488 /** | |
3489 * Set the field element associated with this field formal parameter to the gi
ven element. | |
3490 * | |
3491 * @param field the new field element | |
3492 */ | |
3493 void set field(FieldElement field) { | |
3494 this._field = field; | |
3495 } | |
3496 } | |
3497 /** | |
3498 * Instances of the class `FunctionElementImpl` implement a `FunctionElement`. | |
3499 * | |
3500 * @coverage dart.engine.element | |
3501 */ | |
3502 class FunctionElementImpl extends ExecutableElementImpl implements FunctionEleme
nt { | |
3503 | |
3504 /** | |
3505 * The offset to the beginning of the visible range for this element. | |
3506 */ | |
3507 int _visibleRangeOffset = 0; | |
3508 | |
3509 /** | |
3510 * The length of the visible range for this element, or `-1` if this element d
oes not have a | |
3511 * visible range. | |
3512 */ | |
3513 int _visibleRangeLength = -1; | |
3514 | |
3515 /** | |
3516 * An empty array of function elements. | |
3517 */ | |
3518 static List<FunctionElement> EMPTY_ARRAY = new List<FunctionElement>(0); | |
3519 | |
3520 /** | |
3521 * Initialize a newly created synthetic function element. | |
3522 */ | |
3523 FunctionElementImpl() : super.con2("", -1) { | |
3524 synthetic = true; | |
3525 } | |
3526 | |
3527 /** | |
3528 * Initialize a newly created function element to have the given name. | |
3529 * | |
3530 * @param name the name of this element | |
3531 */ | |
3532 FunctionElementImpl.con1(Identifier name) : super.con1(name); | |
3533 | |
3534 /** | |
3535 * Initialize a newly created function element to have no name and the given o
ffset. This is used | |
3536 * for function expressions, which have no name. | |
3537 * | |
3538 * @param nameOffset the offset of the name of this element in the file that c
ontains the | |
3539 * declaration of this element | |
3540 */ | |
3541 FunctionElementImpl.con2(int nameOffset) : super.con2("", nameOffset); | |
3542 accept(ElementVisitor visitor) => visitor.visitFunctionElement(this); | |
3543 ElementKind get kind => ElementKind.FUNCTION; | |
3544 SourceRange get visibleRange { | |
3545 if (_visibleRangeLength < 0) { | |
3546 return null; | |
3547 } | |
3548 return new SourceRange(_visibleRangeOffset, _visibleRangeLength); | |
3549 } | |
3550 bool get isStatic => enclosingElement is CompilationUnitElement; | |
3551 | |
3552 /** | |
3553 * Set the visible range for this element to the range starting at the given o
ffset with the given | |
3554 * length. | |
3555 * | |
3556 * @param offset the offset to the beginning of the visible range for this ele
ment | |
3557 * @param length the length of the visible range for this element, or `-1` if
this element | |
3558 * does not have a visible range | |
3559 */ | |
3560 void setVisibleRange(int offset, int length) { | |
3561 _visibleRangeOffset = offset; | |
3562 _visibleRangeLength = length; | |
3563 } | |
3564 void appendTo(JavaStringBuilder builder) { | |
3565 String name = displayName; | |
3566 if (name != null) { | |
3567 builder.append(name); | |
3568 } | |
3569 super.appendTo(builder); | |
3570 } | |
3571 String get identifier => "${name}@${nameOffset}"; | |
3572 } | |
3573 /** | |
3574 * Instances of the class `FunctionTypeAliasElementImpl` implement a | |
3575 * `FunctionTypeAliasElement`. | |
3576 * | |
3577 * @coverage dart.engine.element | |
3578 */ | |
3579 class FunctionTypeAliasElementImpl extends ElementImpl implements FunctionTypeAl
iasElement { | |
3580 | |
3581 /** | |
3582 * An array containing all of the parameters defined by this type alias. | |
3583 */ | |
3584 List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY; | |
3585 | |
3586 /** | |
3587 * The return type defined by this type alias. | |
3588 */ | |
3589 Type2 _returnType; | |
3590 | |
3591 /** | |
3592 * The type of function defined by this type alias. | |
3593 */ | |
3594 FunctionType _type; | |
3595 | |
3596 /** | |
3597 * An array containing all of the type parameters defined for this type. | |
3598 */ | |
3599 List<TypeParameterElement> _typeParameters = TypeParameterElementImpl.EMPTY_AR
RAY; | |
3600 | |
3601 /** | |
3602 * An empty array of type alias elements. | |
3603 */ | |
3604 static List<FunctionTypeAliasElement> EMPTY_ARRAY = new List<FunctionTypeAlias
Element>(0); | |
3605 | |
3606 /** | |
3607 * Initialize a newly created type alias element to have the given name. | |
3608 * | |
3609 * @param name the name of this element | |
3610 */ | |
3611 FunctionTypeAliasElementImpl(Identifier name) : super.con1(name); | |
3612 accept(ElementVisitor visitor) => visitor.visitFunctionTypeAliasElement(this); | |
3613 ElementImpl getChild(String identifier) { | |
3614 for (VariableElement parameter in _parameters) { | |
3615 if (((parameter as VariableElementImpl)).identifier == identifier) { | |
3616 return parameter as VariableElementImpl; | |
3617 } | |
3618 } | |
3619 for (TypeParameterElement typeParameter in _typeParameters) { | |
3620 if (((typeParameter as TypeParameterElementImpl)).identifier == identifier
) { | |
3621 return typeParameter as TypeParameterElementImpl; | |
3622 } | |
3623 } | |
3624 return null; | |
3625 } | |
3626 CompilationUnitElement get enclosingElement => super.enclosingElement as Compi
lationUnitElement; | |
3627 ElementKind get kind => ElementKind.FUNCTION_TYPE_ALIAS; | |
3628 List<ParameterElement> get parameters => _parameters; | |
3629 Type2 get returnType => _returnType; | |
3630 FunctionType get type => _type; | |
3631 List<TypeParameterElement> get typeParameters => _typeParameters; | |
3632 | |
3633 /** | |
3634 * Set the parameters defined by this type alias to the given parameters. | |
3635 * | |
3636 * @param parameters the parameters defined by this type alias | |
3637 */ | |
3638 void set parameters(List<ParameterElement> parameters) { | |
3639 if (parameters != null) { | |
3640 for (ParameterElement parameter in parameters) { | |
3641 ((parameter as ParameterElementImpl)).enclosingElement = this; | |
3642 } | |
3643 } | |
3644 this._parameters = parameters; | |
3645 } | |
3646 | |
3647 /** | |
3648 * Set the return type defined by this type alias. | |
3649 * | |
3650 * @param returnType the return type defined by this type alias | |
3651 */ | |
3652 void set returnType(Type2 returnType) { | |
3653 this._returnType = returnType; | |
3654 } | |
3655 | |
3656 /** | |
3657 * Set the type of function defined by this type alias to the given type. | |
3658 * | |
3659 * @param type the type of function defined by this type alias | |
3660 */ | |
3661 void set type(FunctionType type) { | |
3662 this._type = type; | |
3663 } | |
3664 | |
3665 /** | |
3666 * Set the type parameters defined for this type to the given parameters. | |
3667 * | |
3668 * @param typeParameters the type parameters defined for this type | |
3669 */ | |
3670 void set typeParameters(List<TypeParameterElement> typeParameters) { | |
3671 for (TypeParameterElement typeParameter in typeParameters) { | |
3672 ((typeParameter as TypeParameterElementImpl)).enclosingElement = this; | |
3673 } | |
3674 this._typeParameters = typeParameters; | |
3675 } | |
3676 | |
3677 /** | |
3678 * Set the parameters defined by this type alias to the given parameters witho
ut becoming the | |
3679 * parent of the parameters. This should only be used by the [TypeResolverVisi
tor] when | |
3680 * creating a synthetic type alias. | |
3681 * | |
3682 * @param parameters the parameters defined by this type alias | |
3683 */ | |
3684 void shareParameters(List<ParameterElement> parameters) { | |
3685 this._parameters = parameters; | |
3686 } | |
3687 | |
3688 /** | |
3689 * Set the type parameters defined for this type to the given parameters witho
ut becoming the | |
3690 * parent of the parameters. This should only be used by the [TypeResolverVisi
tor] when | |
3691 * creating a synthetic type alias. | |
3692 * | |
3693 * @param typeParameters the type parameters defined for this type | |
3694 */ | |
3695 void shareTypeParameters(List<TypeParameterElement> typeParameters) { | |
3696 this._typeParameters = typeParameters; | |
3697 } | |
3698 void visitChildren(ElementVisitor visitor) { | |
3699 super.visitChildren(visitor); | |
3700 safelyVisitChildren(_parameters, visitor); | |
3701 safelyVisitChildren(_typeParameters, visitor); | |
3702 } | |
3703 void appendTo(JavaStringBuilder builder) { | |
3704 builder.append("typedef "); | |
3705 builder.append(displayName); | |
3706 int typeParameterCount = _typeParameters.length; | |
3707 if (typeParameterCount > 0) { | |
3708 builder.append("<"); | |
3709 for (int i = 0; i < typeParameterCount; i++) { | |
3710 if (i > 0) { | |
3711 builder.append(", "); | |
3712 } | |
3713 ((_typeParameters[i] as TypeParameterElementImpl)).appendTo(builder); | |
3714 } | |
3715 builder.append(">"); | |
3716 } | |
3717 builder.append("("); | |
3718 int parameterCount = _parameters.length; | |
3719 for (int i = 0; i < parameterCount; i++) { | |
3720 if (i > 0) { | |
3721 builder.append(", "); | |
3722 } | |
3723 ((_parameters[i] as ParameterElementImpl)).appendTo(builder); | |
3724 } | |
3725 builder.append(")"); | |
3726 if (_type != null) { | |
3727 builder.append(" -> "); | |
3728 builder.append(_type.returnType); | |
3729 } | |
3730 } | |
3731 } | |
3732 /** | |
3733 * Instances of the class `HideElementCombinatorImpl` implement a | |
3734 * [HideElementCombinator]. | |
3735 * | |
3736 * @coverage dart.engine.element | |
3737 */ | |
3738 class HideElementCombinatorImpl implements HideElementCombinator { | |
3739 | |
3740 /** | |
3741 * The names that are not to be made visible in the importing library even if
they are defined in | |
3742 * the imported library. | |
3743 */ | |
3744 List<String> _hiddenNames = StringUtilities.EMPTY_ARRAY; | |
3745 List<String> get hiddenNames => _hiddenNames; | |
3746 | |
3747 /** | |
3748 * Set the names that are not to be made visible in the importing library even
if they are defined | |
3749 * in the imported library to the given names. | |
3750 * | |
3751 * @param hiddenNames the names that are not to be made visible in the importi
ng library | |
3752 */ | |
3753 void set hiddenNames(List<String> hiddenNames) { | |
3754 this._hiddenNames = hiddenNames; | |
3755 } | |
3756 String toString() { | |
3757 JavaStringBuilder builder = new JavaStringBuilder(); | |
3758 builder.append("show "); | |
3759 int count = _hiddenNames.length; | |
3760 for (int i = 0; i < count; i++) { | |
3761 if (i > 0) { | |
3762 builder.append(", "); | |
3763 } | |
3764 builder.append(_hiddenNames[i]); | |
3765 } | |
3766 return builder.toString(); | |
3767 } | |
3768 } | |
3769 /** | |
3770 * Instances of the class `HtmlElementImpl` implement an [HtmlElement]. | |
3771 * | |
3772 * @coverage dart.engine.element | |
3773 */ | |
3774 class HtmlElementImpl extends ElementImpl implements HtmlElement { | |
3775 | |
3776 /** | |
3777 * An empty array of HTML file elements. | |
3778 */ | |
3779 static List<HtmlElement> EMPTY_ARRAY = new List<HtmlElement>(0); | |
3780 | |
3781 /** | |
3782 * The analysis context in which this library is defined. | |
3783 */ | |
3784 AnalysisContext _context; | |
3785 | |
3786 /** | |
3787 * The scripts contained in or referenced from script tags in the HTML file. | |
3788 */ | |
3789 List<HtmlScriptElement> _scripts = HtmlScriptElementImpl.EMPTY_ARRAY; | |
3790 | |
3791 /** | |
3792 * The source that corresponds to this HTML file. | |
3793 */ | |
3794 Source _source; | |
3795 | |
3796 /** | |
3797 * Initialize a newly created HTML element to have the given name. | |
3798 * | |
3799 * @param context the analysis context in which the HTML file is defined | |
3800 * @param name the name of this element | |
3801 */ | |
3802 HtmlElementImpl(AnalysisContext context, String name) : super.con2(name, -1) { | |
3803 this._context = context; | |
3804 } | |
3805 accept(ElementVisitor visitor) => visitor.visitHtmlElement(this); | |
3806 bool operator ==(Object object) => runtimeType == object.runtimeType && _sourc
e == ((object as CompilationUnitElementImpl)).source; | |
3807 AnalysisContext get context => _context; | |
3808 ElementKind get kind => ElementKind.HTML; | |
3809 List<HtmlScriptElement> get scripts => _scripts; | |
3810 Source get source => _source; | |
3811 int get hashCode => _source.hashCode; | |
3812 | |
3813 /** | |
3814 * Set the scripts contained in the HTML file to the given scripts. | |
3815 * | |
3816 * @param scripts the scripts | |
3817 */ | |
3818 void set scripts(List<HtmlScriptElement> scripts) { | |
3819 if (scripts.length == 0) { | |
3820 scripts = HtmlScriptElementImpl.EMPTY_ARRAY; | |
3821 } | |
3822 for (HtmlScriptElement script in scripts) { | |
3823 ((script as HtmlScriptElementImpl)).enclosingElement = this; | |
3824 } | |
3825 this._scripts = scripts; | |
3826 } | |
3827 | |
3828 /** | |
3829 * Set the source that corresponds to this HTML file to the given source. | |
3830 * | |
3831 * @param source the source that corresponds to this HTML file | |
3832 */ | |
3833 void set source(Source source) { | |
3834 this._source = source; | |
3835 } | |
3836 void visitChildren(ElementVisitor visitor) { | |
3837 super.visitChildren(visitor); | |
3838 safelyVisitChildren(_scripts, visitor); | |
3839 } | |
3840 void appendTo(JavaStringBuilder builder) { | |
3841 if (_source == null) { | |
3842 builder.append("{HTML file}"); | |
3843 } else { | |
3844 builder.append(_source.fullName); | |
3845 } | |
3846 } | |
3847 } | |
3848 /** | |
3849 * Instances of the class `HtmlScriptElementImpl` implement an [HtmlScriptElemen
t]. | |
3850 * | |
3851 * @coverage dart.engine.element | |
3852 */ | |
3853 abstract class HtmlScriptElementImpl extends ElementImpl implements HtmlScriptEl
ement { | |
3854 | |
3855 /** | |
3856 * An empty array of HTML script elements. | |
3857 */ | |
3858 static List<HtmlScriptElement> EMPTY_ARRAY = new List<HtmlScriptElement>(0); | |
3859 | |
3860 /** | |
3861 * Initialize a newly created script element to have the specified tag name an
d offset. | |
3862 * | |
3863 * @param node the XML node from which this element is derived (not `null`) | |
3864 */ | |
3865 HtmlScriptElementImpl(XmlTagNode node) : super.con2(node.tag.lexeme, node.tag.
offset); | |
3866 } | |
3867 /** | |
3868 * Instances of the class `ImportElementImpl` implement an [ImportElement]. | |
3869 * | |
3870 * @coverage dart.engine.element | |
3871 */ | |
3872 class ImportElementImpl extends ElementImpl implements ImportElement { | |
3873 | |
3874 /** | |
3875 * The offset of this directive, may be `-1` if synthetic. | |
3876 */ | |
3877 int _offset = -1; | |
3878 | |
3879 /** | |
3880 * The offset of the character immediately following the last character of thi
s node's URI, may be | |
3881 * `-1` if synthetic. | |
3882 */ | |
3883 int _uriEnd = -1; | |
3884 | |
3885 /** | |
3886 * The offset of the prefix of this import in the file that contains the this
import directive, or | |
3887 * `-1` if this import is synthetic. | |
3888 */ | |
3889 int _prefixOffset = 0; | |
3890 | |
3891 /** | |
3892 * The URI that is specified by this directive. | |
3893 */ | |
3894 String _uri; | |
3895 | |
3896 /** | |
3897 * The library that is imported into this library by this import directive. | |
3898 */ | |
3899 LibraryElement _importedLibrary; | |
3900 | |
3901 /** | |
3902 * The combinators that were specified as part of the import directive in the
order in which they | |
3903 * were specified. | |
3904 */ | |
3905 List<NamespaceCombinator> _combinators = NamespaceCombinator.EMPTY_ARRAY; | |
3906 | |
3907 /** | |
3908 * The prefix that was specified as part of the import directive, or `null` if
there was no | |
3909 * prefix specified. | |
3910 */ | |
3911 PrefixElement _prefix; | |
3912 | |
3913 /** | |
3914 * Initialize a newly created import element. | |
3915 */ | |
3916 ImportElementImpl() : super.con1(null); | |
3917 accept(ElementVisitor visitor) => visitor.visitImportElement(this); | |
3918 List<NamespaceCombinator> get combinators => _combinators; | |
3919 LibraryElement get importedLibrary => _importedLibrary; | |
3920 ElementKind get kind => ElementKind.IMPORT; | |
3921 PrefixElement get prefix => _prefix; | |
3922 int get prefixOffset => _prefixOffset; | |
3923 String get uri => _uri; | |
3924 int get uriEnd => _uriEnd; | |
3925 | |
3926 /** | |
3927 * Set the combinators that were specified as part of the import directive to
the given array of | |
3928 * combinators. | |
3929 * | |
3930 * @param combinators the combinators that were specified as part of the impor
t directive | |
3931 */ | |
3932 void set combinators(List<NamespaceCombinator> combinators) { | |
3933 this._combinators = combinators; | |
3934 } | |
3935 | |
3936 /** | |
3937 * Set the library that is imported into this library by this import directive
to the given | |
3938 * library. | |
3939 * | |
3940 * @param importedLibrary the library that is imported into this library | |
3941 */ | |
3942 void set importedLibrary(LibraryElement importedLibrary) { | |
3943 this._importedLibrary = importedLibrary; | |
3944 } | |
3945 | |
3946 /** | |
3947 * Set the offset of this directive. | |
3948 */ | |
3949 void set offset(int offset) { | |
3950 this._offset = offset; | |
3951 } | |
3952 | |
3953 /** | |
3954 * Set the prefix that was specified as part of the import directive to the gi
ven prefix. | |
3955 * | |
3956 * @param prefix the prefix that was specified as part of the import directive | |
3957 */ | |
3958 void set prefix(PrefixElement prefix) { | |
3959 this._prefix = prefix; | |
3960 } | |
3961 | |
3962 /** | |
3963 * Set the offset of the prefix of this import in the file that contains the t
his import | |
3964 * directive. | |
3965 */ | |
3966 void set prefixOffset(int prefixOffset) { | |
3967 this._prefixOffset = prefixOffset; | |
3968 } | |
3969 | |
3970 /** | |
3971 * Set the URI that is specified by this directive. | |
3972 * | |
3973 * @param uri the URI that is specified by this directive. | |
3974 */ | |
3975 void set uri(String uri) { | |
3976 this._uri = uri; | |
3977 } | |
3978 | |
3979 /** | |
3980 * Set the the offset of the character immediately following the last characte
r of this node's | |
3981 * URI. `-1` for synthetic import. | |
3982 */ | |
3983 void set uriEnd(int uriEnd) { | |
3984 this._uriEnd = uriEnd; | |
3985 } | |
3986 void visitChildren(ElementVisitor visitor) { | |
3987 super.visitChildren(visitor); | |
3988 safelyVisitChild(_prefix, visitor); | |
3989 } | |
3990 void appendTo(JavaStringBuilder builder) { | |
3991 builder.append("import "); | |
3992 ((_importedLibrary as LibraryElementImpl)).appendTo(builder); | |
3993 } | |
3994 String get identifier => "${((_importedLibrary as LibraryElementImpl)).identif
ier}@${_offset}"; | |
3995 } | |
3996 /** | |
3997 * Instances of the class `LabelElementImpl` implement a `LabelElement`. | |
3998 * | |
3999 * @coverage dart.engine.element | |
4000 */ | |
4001 class LabelElementImpl extends ElementImpl implements LabelElement { | |
4002 | |
4003 /** | |
4004 * A flag indicating whether this label is associated with a `switch` statemen
t. | |
4005 */ | |
4006 bool isOnSwitchStatement = false; | |
4007 | |
4008 /** | |
4009 * A flag indicating whether this label is associated with a `switch` member (
`case` | |
4010 * or `default`). | |
4011 */ | |
4012 bool isOnSwitchMember = false; | |
4013 | |
4014 /** | |
4015 * An empty array of label elements. | |
4016 */ | |
4017 static List<LabelElement> EMPTY_ARRAY = new List<LabelElement>(0); | |
4018 | |
4019 /** | |
4020 * Initialize a newly created label element to have the given name. | |
4021 * | |
4022 * @param name the name of this element | |
4023 * @param onSwitchStatement `true` if this label is associated with a `switch` | |
4024 * statement | |
4025 * @param onSwitchMember `true` if this label is associated with a `switch` me
mber | |
4026 */ | |
4027 LabelElementImpl(Identifier name, bool onSwitchStatement, bool onSwitchMember)
: super.con1(name) { | |
4028 this.isOnSwitchStatement = onSwitchStatement; | |
4029 this.isOnSwitchMember = onSwitchMember; | |
4030 } | |
4031 accept(ElementVisitor visitor) => visitor.visitLabelElement(this); | |
4032 ExecutableElement get enclosingElement => super.enclosingElement as Executable
Element; | |
4033 ElementKind get kind => ElementKind.LABEL; | |
4034 } | |
4035 /** | |
4036 * Instances of the class `LibraryElementImpl` implement a `LibraryElement`. | |
4037 * | |
4038 * @coverage dart.engine.element | |
4039 */ | |
4040 class LibraryElementImpl extends ElementImpl implements LibraryElement { | |
4041 | |
4042 /** | |
4043 * An empty array of library elements. | |
4044 */ | |
4045 static List<LibraryElement> EMPTY_ARRAY = new List<LibraryElement>(0); | |
4046 | |
4047 /** | |
4048 * Determine if the given library is up to date with respect to the given time
stamp. | |
4049 * | |
4050 * @param library the library to process | |
4051 * @param timeStamp the time stamp to check against | |
4052 * @param visitedLibraries the set of visited libraries | |
4053 */ | |
4054 static bool isUpToDate(LibraryElement library, int timeStamp, Set<LibraryEleme
nt> visitedLibraries) { | |
4055 if (!visitedLibraries.contains(library)) { | |
4056 javaSetAdd(visitedLibraries, library); | |
4057 if (timeStamp < library.definingCompilationUnit.source.modificationStamp)
{ | |
4058 return false; | |
4059 } | |
4060 for (CompilationUnitElement element in library.parts) { | |
4061 if (timeStamp < element.source.modificationStamp) { | |
4062 return false; | |
4063 } | |
4064 } | |
4065 for (LibraryElement importedLibrary in library.importedLibraries) { | |
4066 if (!isUpToDate(importedLibrary, timeStamp, visitedLibraries)) { | |
4067 return false; | |
4068 } | |
4069 } | |
4070 for (LibraryElement exportedLibrary in library.exportedLibraries) { | |
4071 if (!isUpToDate(exportedLibrary, timeStamp, visitedLibraries)) { | |
4072 return false; | |
4073 } | |
4074 } | |
4075 } | |
4076 return true; | |
4077 } | |
4078 | |
4079 /** | |
4080 * The analysis context in which this library is defined. | |
4081 */ | |
4082 AnalysisContext _context; | |
4083 | |
4084 /** | |
4085 * The compilation unit that defines this library. | |
4086 */ | |
4087 CompilationUnitElement _definingCompilationUnit; | |
4088 | |
4089 /** | |
4090 * The entry point for this library, or `null` if this library does not have a
n entry point. | |
4091 */ | |
4092 FunctionElement _entryPoint; | |
4093 | |
4094 /** | |
4095 * An array containing specifications of all of the imports defined in this li
brary. | |
4096 */ | |
4097 List<ImportElement> _imports = ImportElement.EMPTY_ARRAY; | |
4098 | |
4099 /** | |
4100 * An array containing specifications of all of the exports defined in this li
brary. | |
4101 */ | |
4102 List<ExportElement> _exports = ExportElement.EMPTY_ARRAY; | |
4103 | |
4104 /** | |
4105 * An array containing all of the compilation units that are included in this
library using a | |
4106 * `part` directive. | |
4107 */ | |
4108 List<CompilationUnitElement> _parts = CompilationUnitElementImpl.EMPTY_ARRAY; | |
4109 | |
4110 /** | |
4111 * Initialize a newly created library element to have the given name. | |
4112 * | |
4113 * @param context the analysis context in which the library is defined | |
4114 * @param name the name of this element | |
4115 */ | |
4116 LibraryElementImpl(AnalysisContext context, LibraryIdentifier name) : super.co
n1(name) { | |
4117 this._context = context; | |
4118 } | |
4119 accept(ElementVisitor visitor) => visitor.visitLibraryElement(this); | |
4120 bool operator ==(Object object) => object != null && runtimeType == object.run
timeType && _definingCompilationUnit == ((object as LibraryElementImpl)).definin
gCompilationUnit; | |
4121 ElementImpl getChild(String identifier) { | |
4122 if (((_definingCompilationUnit as CompilationUnitElementImpl)).identifier ==
identifier) { | |
4123 return _definingCompilationUnit as CompilationUnitElementImpl; | |
4124 } | |
4125 for (CompilationUnitElement part in _parts) { | |
4126 if (((part as CompilationUnitElementImpl)).identifier == identifier) { | |
4127 return part as CompilationUnitElementImpl; | |
4128 } | |
4129 } | |
4130 for (ImportElement importElement in _imports) { | |
4131 if (((importElement as ImportElementImpl)).identifier == identifier) { | |
4132 return importElement as ImportElementImpl; | |
4133 } | |
4134 } | |
4135 for (ExportElement exportElement in _exports) { | |
4136 if (((exportElement as ExportElementImpl)).identifier == identifier) { | |
4137 return exportElement as ExportElementImpl; | |
4138 } | |
4139 } | |
4140 return null; | |
4141 } | |
4142 AnalysisContext get context => _context; | |
4143 CompilationUnitElement get definingCompilationUnit => _definingCompilationUnit
; | |
4144 FunctionElement get entryPoint => _entryPoint; | |
4145 List<LibraryElement> get exportedLibraries { | |
4146 Set<LibraryElement> libraries = new Set<LibraryElement>(); | |
4147 for (ExportElement element in _exports) { | |
4148 LibraryElement library = element.exportedLibrary; | |
4149 if (library != null) { | |
4150 javaSetAdd(libraries, library); | |
4151 } | |
4152 } | |
4153 return new List.from(libraries); | |
4154 } | |
4155 List<ExportElement> get exports => _exports; | |
4156 List<LibraryElement> get importedLibraries { | |
4157 Set<LibraryElement> libraries = new Set<LibraryElement>(); | |
4158 for (ImportElement element in _imports) { | |
4159 LibraryElement library = element.importedLibrary; | |
4160 if (library != null) { | |
4161 javaSetAdd(libraries, library); | |
4162 } | |
4163 } | |
4164 return new List.from(libraries); | |
4165 } | |
4166 List<ImportElement> get imports => _imports; | |
4167 ElementKind get kind => ElementKind.LIBRARY; | |
4168 LibraryElement get library => this; | |
4169 List<CompilationUnitElement> get parts => _parts; | |
4170 List<PrefixElement> get prefixes { | |
4171 Set<PrefixElement> prefixes = new Set<PrefixElement>(); | |
4172 for (ImportElement element in _imports) { | |
4173 PrefixElement prefix = element.prefix; | |
4174 if (prefix != null) { | |
4175 javaSetAdd(prefixes, prefix); | |
4176 } | |
4177 } | |
4178 return new List.from(prefixes); | |
4179 } | |
4180 Source get source { | |
4181 if (_definingCompilationUnit == null) { | |
4182 return null; | |
4183 } | |
4184 return _definingCompilationUnit.source; | |
4185 } | |
4186 ClassElement getType(String className) { | |
4187 ClassElement type = _definingCompilationUnit.getType(className); | |
4188 if (type != null) { | |
4189 return type; | |
4190 } | |
4191 for (CompilationUnitElement part in _parts) { | |
4192 type = part.getType(className); | |
4193 if (type != null) { | |
4194 return type; | |
4195 } | |
4196 } | |
4197 return null; | |
4198 } | |
4199 int get hashCode => _definingCompilationUnit.hashCode; | |
4200 bool get isBrowserApplication => _entryPoint != null && isOrImportsBrowserLibr
ary; | |
4201 bool get isDartCore => name == "dart.core"; | |
4202 bool get isInSdk => name.startsWith("dart."); | |
4203 bool isUpToDate2(int timeStamp) { | |
4204 Set<LibraryElement> visitedLibraries = new Set(); | |
4205 return isUpToDate(this, timeStamp, visitedLibraries); | |
4206 } | |
4207 | |
4208 /** | |
4209 * Set the compilation unit that defines this library to the given compilation
unit. | |
4210 * | |
4211 * @param definingCompilationUnit the compilation unit that defines this libra
ry | |
4212 */ | |
4213 void set definingCompilationUnit(CompilationUnitElement definingCompilationUni
t) { | |
4214 ((definingCompilationUnit as CompilationUnitElementImpl)).enclosingElement =
this; | |
4215 this._definingCompilationUnit = definingCompilationUnit; | |
4216 } | |
4217 | |
4218 /** | |
4219 * Set the entry point for this library to the given function. | |
4220 * | |
4221 * @param entryPoint the entry point for this library | |
4222 */ | |
4223 void set entryPoint(FunctionElement entryPoint) { | |
4224 this._entryPoint = entryPoint; | |
4225 } | |
4226 | |
4227 /** | |
4228 * Set the specifications of all of the exports defined in this library to the
given array. | |
4229 * | |
4230 * @param exports the specifications of all of the exports defined in this lib
rary | |
4231 */ | |
4232 void set exports(List<ExportElement> exports) { | |
4233 for (ExportElement exportElement in exports) { | |
4234 ((exportElement as ExportElementImpl)).enclosingElement = this; | |
4235 } | |
4236 this._exports = exports; | |
4237 } | |
4238 | |
4239 /** | |
4240 * Set the specifications of all of the imports defined in this library to the
given array. | |
4241 * | |
4242 * @param imports the specifications of all of the imports defined in this lib
rary | |
4243 */ | |
4244 void set imports(List<ImportElement> imports) { | |
4245 for (ImportElement importElement in imports) { | |
4246 ((importElement as ImportElementImpl)).enclosingElement = this; | |
4247 PrefixElementImpl prefix = importElement.prefix as PrefixElementImpl; | |
4248 if (prefix != null) { | |
4249 prefix.enclosingElement = this; | |
4250 } | |
4251 } | |
4252 this._imports = imports; | |
4253 } | |
4254 | |
4255 /** | |
4256 * Set the compilation units that are included in this library using a `part`
directive. | |
4257 * | |
4258 * @param parts the compilation units that are included in this library using
a `part` | |
4259 * directive | |
4260 */ | |
4261 void set parts(List<CompilationUnitElement> parts) { | |
4262 for (CompilationUnitElement compilationUnit in parts) { | |
4263 ((compilationUnit as CompilationUnitElementImpl)).enclosingElement = this; | |
4264 } | |
4265 this._parts = parts; | |
4266 } | |
4267 void visitChildren(ElementVisitor visitor) { | |
4268 super.visitChildren(visitor); | |
4269 safelyVisitChild(_definingCompilationUnit, visitor); | |
4270 safelyVisitChildren(_exports, visitor); | |
4271 safelyVisitChildren(_imports, visitor); | |
4272 safelyVisitChildren(_parts, visitor); | |
4273 } | |
4274 String get identifier => _definingCompilationUnit.source.encoding; | |
4275 | |
4276 /** | |
4277 * Answer `true` if the receiver directly or indirectly imports the dart:html
libraries. | |
4278 * | |
4279 * @return `true` if the receiver directly or indirectly imports the dart:html
libraries | |
4280 */ | |
4281 bool get isOrImportsBrowserLibrary { | |
4282 List<LibraryElement> visited = new List<LibraryElement>(); | |
4283 Source htmlLibSource = _context.sourceFactory.forUri(DartSdk.DART_HTML); | |
4284 visited.add(this); | |
4285 for (int index = 0; index < visited.length; index++) { | |
4286 LibraryElement library = visited[index]; | |
4287 Source source = library.definingCompilationUnit.source; | |
4288 if (source == htmlLibSource) { | |
4289 return true; | |
4290 } | |
4291 for (LibraryElement importedLibrary in library.importedLibraries) { | |
4292 if (!visited.contains(importedLibrary)) { | |
4293 visited.add(importedLibrary); | |
4294 } | |
4295 } | |
4296 for (LibraryElement exportedLibrary in library.exportedLibraries) { | |
4297 if (!visited.contains(exportedLibrary)) { | |
4298 visited.add(exportedLibrary); | |
4299 } | |
4300 } | |
4301 } | |
4302 return false; | |
4303 } | |
4304 } | |
4305 /** | |
4306 * Instances of the class `LocalVariableElementImpl` implement a `LocalVariableE
lement`. | |
4307 * | |
4308 * @coverage dart.engine.element | |
4309 */ | |
4310 class LocalVariableElementImpl extends VariableElementImpl implements LocalVaria
bleElement { | |
4311 | |
4312 /** | |
4313 * Is `true` if this variable is potentially mutated somewhere in its scope. | |
4314 */ | |
4315 bool _isPotentiallyMutated2 = false; | |
4316 | |
4317 /** | |
4318 * The offset to the beginning of the visible range for this element. | |
4319 */ | |
4320 int _visibleRangeOffset = 0; | |
4321 | |
4322 /** | |
4323 * The length of the visible range for this element, or `-1` if this element d
oes not have a | |
4324 * visible range. | |
4325 */ | |
4326 int _visibleRangeLength = -1; | |
4327 | |
4328 /** | |
4329 * An empty array of field elements. | |
4330 */ | |
4331 static List<LocalVariableElement> EMPTY_ARRAY = new List<LocalVariableElement>
(0); | |
4332 | |
4333 /** | |
4334 * Initialize a newly created local variable element to have the given name. | |
4335 * | |
4336 * @param name the name of this element | |
4337 */ | |
4338 LocalVariableElementImpl(Identifier name) : super.con1(name); | |
4339 accept(ElementVisitor visitor) => visitor.visitLocalVariableElement(this); | |
4340 ElementKind get kind => ElementKind.LOCAL_VARIABLE; | |
4341 SourceRange get visibleRange { | |
4342 if (_visibleRangeLength < 0) { | |
4343 return null; | |
4344 } | |
4345 return new SourceRange(_visibleRangeOffset, _visibleRangeLength); | |
4346 } | |
4347 bool get isPotentiallyMutated => _isPotentiallyMutated2; | |
4348 | |
4349 /** | |
4350 * Specifies that this variable is potentially mutated somewhere in its scope. | |
4351 */ | |
4352 void markPotentiallyMutated() { | |
4353 _isPotentiallyMutated2 = true; | |
4354 } | |
4355 | |
4356 /** | |
4357 * Set the visible range for this element to the range starting at the given o
ffset with the given | |
4358 * length. | |
4359 * | |
4360 * @param offset the offset to the beginning of the visible range for this ele
ment | |
4361 * @param length the length of the visible range for this element, or `-1` if
this element | |
4362 * does not have a visible range | |
4363 */ | |
4364 void setVisibleRange(int offset, int length) { | |
4365 _visibleRangeOffset = offset; | |
4366 _visibleRangeLength = length; | |
4367 } | |
4368 void appendTo(JavaStringBuilder builder) { | |
4369 builder.append(type); | |
4370 builder.append(" "); | |
4371 builder.append(displayName); | |
4372 } | |
4373 String get identifier => "${super.identifier}@${nameOffset}"; | |
4374 } | |
4375 /** | |
4376 * Instances of the class `MethodElementImpl` implement a `MethodElement`. | |
4377 * | |
4378 * @coverage dart.engine.element | |
4379 */ | |
4380 class MethodElementImpl extends ExecutableElementImpl implements MethodElement { | |
4381 | |
4382 /** | |
4383 * An empty array of method elements. | |
4384 */ | |
4385 static List<MethodElement> EMPTY_ARRAY = new List<MethodElement>(0); | |
4386 | |
4387 /** | |
4388 * Initialize a newly created method element to have the given name. | |
4389 * | |
4390 * @param name the name of this element | |
4391 */ | |
4392 MethodElementImpl.con1(Identifier name) : super.con1(name); | |
4393 | |
4394 /** | |
4395 * Initialize a newly created method element to have the given name. | |
4396 * | |
4397 * @param name the name of this element | |
4398 * @param nameOffset the offset of the name of this element in the file that c
ontains the | |
4399 * declaration of this element | |
4400 */ | |
4401 MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOff
set); | |
4402 accept(ElementVisitor visitor) => visitor.visitMethodElement(this); | |
4403 ClassElement get enclosingElement => super.enclosingElement as ClassElement; | |
4404 ElementKind get kind => ElementKind.METHOD; | |
4405 String get name { | |
4406 String name = super.name; | |
4407 if (isOperator && name == "-") { | |
4408 if (parameters.length == 0) { | |
4409 return "unary-"; | |
4410 } | |
4411 } | |
4412 return super.name; | |
4413 } | |
4414 bool get isAbstract => hasModifier(Modifier.ABSTRACT); | |
4415 bool get isOperator { | |
4416 String name = displayName; | |
4417 if (name.isEmpty) { | |
4418 return false; | |
4419 } | |
4420 int first = name.codeUnitAt(0); | |
4421 return !((0x61 <= first && first <= 0x7A) || (0x41 <= first && first <= 0x5A
) || first == 0x5F || first == 0x24); | |
4422 } | |
4423 bool get isStatic => hasModifier(Modifier.STATIC); | |
4424 | |
4425 /** | |
4426 * Set whether this method is abstract to correspond to the given value. | |
4427 * | |
4428 * @param isAbstract `true` if the method is abstract | |
4429 */ | |
4430 void set abstract(bool isAbstract) { | |
4431 setModifier(Modifier.ABSTRACT, isAbstract); | |
4432 } | |
4433 | |
4434 /** | |
4435 * Set whether this method is static to correspond to the given value. | |
4436 * | |
4437 * @param isStatic `true` if the method is static | |
4438 */ | |
4439 void set static(bool isStatic) { | |
4440 setModifier(Modifier.STATIC, isStatic); | |
4441 } | |
4442 void appendTo(JavaStringBuilder builder) { | |
4443 builder.append(enclosingElement.displayName); | |
4444 builder.append("."); | |
4445 builder.append(displayName); | |
4446 super.appendTo(builder); | |
4447 } | |
4448 } | |
4449 /** | |
4450 * The enumeration `Modifier` defines constants for all of the modifiers defined
by the Dart | |
4451 * language and for a few additional flags that are useful. | |
4452 * | |
4453 * @coverage dart.engine.element | |
4454 */ | |
4455 class Modifier extends Enum<Modifier> { | |
4456 static final Modifier ABSTRACT = new Modifier('ABSTRACT', 0); | |
4457 static final Modifier CONST = new Modifier('CONST', 1); | |
4458 static final Modifier FACTORY = new Modifier('FACTORY', 2); | |
4459 static final Modifier FINAL = new Modifier('FINAL', 3); | |
4460 static final Modifier GETTER = new Modifier('GETTER', 4); | |
4461 static final Modifier MIXIN = new Modifier('MIXIN', 5); | |
4462 static final Modifier REFERENCES_SUPER = new Modifier('REFERENCES_SUPER', 6); | |
4463 static final Modifier SETTER = new Modifier('SETTER', 7); | |
4464 static final Modifier STATIC = new Modifier('STATIC', 8); | |
4465 static final Modifier SYNTHETIC = new Modifier('SYNTHETIC', 9); | |
4466 static final Modifier TYPEDEF = new Modifier('TYPEDEF', 10); | |
4467 static final List<Modifier> values = [ | |
4468 ABSTRACT, | |
4469 CONST, | |
4470 FACTORY, | |
4471 FINAL, | |
4472 GETTER, | |
4473 MIXIN, | |
4474 REFERENCES_SUPER, | |
4475 SETTER, | |
4476 STATIC, | |
4477 SYNTHETIC, | |
4478 TYPEDEF]; | |
4479 Modifier(String name, int ordinal) : super(name, ordinal); | |
4480 } | |
4481 /** | |
4482 * Instances of the class `MultiplyDefinedElementImpl` represent a collection of
elements that | |
4483 * have the same name within the same scope. | |
4484 * | |
4485 * @coverage dart.engine.element | |
4486 */ | |
4487 class MultiplyDefinedElementImpl implements MultiplyDefinedElement { | |
4488 | |
4489 /** | |
4490 * Return an element that represents the given conflicting elements. | |
4491 * | |
4492 * @param context the analysis context in which the multiply defined elements
are defined | |
4493 * @param firstElement the first element that conflicts | |
4494 * @param secondElement the second element that conflicts | |
4495 */ | |
4496 static Element fromElements(AnalysisContext context, Element firstElement, Ele
ment secondElement) { | |
4497 List<Element> conflictingElements = computeConflictingElements(firstElement,
secondElement); | |
4498 int length = conflictingElements.length; | |
4499 if (length == 0) { | |
4500 return null; | |
4501 } else if (length == 1) { | |
4502 return conflictingElements[0]; | |
4503 } | |
4504 return new MultiplyDefinedElementImpl(context, conflictingElements); | |
4505 } | |
4506 | |
4507 /** | |
4508 * Add the given element to the list of elements. If the element is a multiply
-defined element, | |
4509 * add all of the conflicting elements that it represents. | |
4510 * | |
4511 * @param elements the list to which the element(s) are to be added | |
4512 * @param element the element(s) to be added | |
4513 */ | |
4514 static void add(Set<Element> elements, Element element) { | |
4515 if (element is MultiplyDefinedElementImpl) { | |
4516 for (Element conflictingElement in ((element as MultiplyDefinedElementImpl
))._conflictingElements) { | |
4517 javaSetAdd(elements, conflictingElement); | |
4518 } | |
4519 } else { | |
4520 javaSetAdd(elements, element); | |
4521 } | |
4522 } | |
4523 | |
4524 /** | |
4525 * Use the given elements to construct an array of conflicting elements. If ei
ther of the given | |
4526 * elements are multiply-defined elements then the conflicting elements they r
epresent will be | |
4527 * included in the array. Otherwise, the element itself will be included. | |
4528 * | |
4529 * @param firstElement the first element to be included | |
4530 * @param secondElement the second element to be included | |
4531 * @return an array containing all of the conflicting elements | |
4532 */ | |
4533 static List<Element> computeConflictingElements(Element firstElement, Element
secondElement) { | |
4534 Set<Element> elements = new Set<Element>(); | |
4535 add(elements, firstElement); | |
4536 add(elements, secondElement); | |
4537 return new List.from(elements); | |
4538 } | |
4539 | |
4540 /** | |
4541 * The analysis context in which the multiply defined elements are defined. | |
4542 */ | |
4543 AnalysisContext _context; | |
4544 | |
4545 /** | |
4546 * The name of the conflicting elements. | |
4547 */ | |
4548 String _name; | |
4549 | |
4550 /** | |
4551 * A list containing all of the elements that conflict. | |
4552 */ | |
4553 List<Element> _conflictingElements; | |
4554 | |
4555 /** | |
4556 * Initialize a newly created element to represent a list of conflicting eleme
nts. | |
4557 * | |
4558 * @param context the analysis context in which the multiply defined elements
are defined | |
4559 * @param conflictingElements the elements that conflict | |
4560 */ | |
4561 MultiplyDefinedElementImpl(AnalysisContext context, List<Element> conflictingE
lements) { | |
4562 this._context = context; | |
4563 _name = conflictingElements[0].name; | |
4564 this._conflictingElements = conflictingElements; | |
4565 } | |
4566 accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this); | |
4567 String computeDocumentationComment() => null; | |
4568 Element getAncestor(Type elementClass) => null; | |
4569 List<Element> get conflictingElements => _conflictingElements; | |
4570 AnalysisContext get context => _context; | |
4571 String get displayName => _name; | |
4572 Element get enclosingElement => null; | |
4573 ElementKind get kind => ElementKind.ERROR; | |
4574 LibraryElement get library => null; | |
4575 ElementLocation get location => null; | |
4576 List<ElementAnnotation> get metadata => ElementAnnotationImpl.EMPTY_ARRAY; | |
4577 String get name => _name; | |
4578 int get nameOffset => -1; | |
4579 Source get source => null; | |
4580 Type2 get type => DynamicTypeImpl.instance; | |
4581 bool isAccessibleIn(LibraryElement library) { | |
4582 for (Element element in _conflictingElements) { | |
4583 if (element.isAccessibleIn(library)) { | |
4584 return true; | |
4585 } | |
4586 } | |
4587 return false; | |
4588 } | |
4589 bool get isSynthetic => true; | |
4590 String toString() { | |
4591 JavaStringBuilder builder = new JavaStringBuilder(); | |
4592 builder.append("["); | |
4593 int count = _conflictingElements.length; | |
4594 for (int i = 0; i < count; i++) { | |
4595 if (i > 0) { | |
4596 builder.append(", "); | |
4597 } | |
4598 ((_conflictingElements[i] as ElementImpl)).appendTo(builder); | |
4599 } | |
4600 builder.append("]"); | |
4601 return builder.toString(); | |
4602 } | |
4603 void visitChildren(ElementVisitor visitor) { | |
4604 } | |
4605 } | |
4606 /** | |
4607 * Instances of the class `ParameterElementImpl` implement a `ParameterElement`. | |
4608 * | |
4609 * @coverage dart.engine.element | |
4610 */ | |
4611 class ParameterElementImpl extends VariableElementImpl implements ParameterEleme
nt { | |
4612 | |
4613 /** | |
4614 * Is `true` if this variable is potentially mutated somewhere in its scope. | |
4615 */ | |
4616 bool _isPotentiallyMutated3 = false; | |
4617 | |
4618 /** | |
4619 * An array containing all of the parameters defined by this parameter element
. There will only be | |
4620 * parameters if this parameter is a function typed parameter. | |
4621 */ | |
4622 List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY; | |
4623 | |
4624 /** | |
4625 * The kind of this parameter. | |
4626 */ | |
4627 ParameterKind _parameterKind; | |
4628 | |
4629 /** | |
4630 * The offset to the beginning of the default value range for this element. | |
4631 */ | |
4632 int _defaultValueRangeOffset = 0; | |
4633 | |
4634 /** | |
4635 * The length of the default value range for this element, or `-1` if this ele
ment does not | |
4636 * have a default value. | |
4637 */ | |
4638 int _defaultValueRangeLength = -1; | |
4639 | |
4640 /** | |
4641 * The offset to the beginning of the visible range for this element. | |
4642 */ | |
4643 int _visibleRangeOffset = 0; | |
4644 | |
4645 /** | |
4646 * The length of the visible range for this element, or `-1` if this element d
oes not have a | |
4647 * visible range. | |
4648 */ | |
4649 int _visibleRangeLength = -1; | |
4650 | |
4651 /** | |
4652 * An empty array of field elements. | |
4653 */ | |
4654 static List<ParameterElement> EMPTY_ARRAY = new List<ParameterElement>(0); | |
4655 | |
4656 /** | |
4657 * Initialize a newly created parameter element to have the given name. | |
4658 * | |
4659 * @param name the name of this element | |
4660 */ | |
4661 ParameterElementImpl.con1(Identifier name) : super.con1(name); | |
4662 | |
4663 /** | |
4664 * Initialize a newly created parameter element to have the given name. | |
4665 * | |
4666 * @param name the name of this element | |
4667 * @param nameOffset the offset of the name of this element in the file that c
ontains the | |
4668 * declaration of this element | |
4669 */ | |
4670 ParameterElementImpl.con2(String name, int nameOffset) : super.con2(name, name
Offset); | |
4671 accept(ElementVisitor visitor) => visitor.visitParameterElement(this); | |
4672 SourceRange get defaultValueRange { | |
4673 if (_defaultValueRangeLength < 0) { | |
4674 return null; | |
4675 } | |
4676 return new SourceRange(_defaultValueRangeOffset, _defaultValueRangeLength); | |
4677 } | |
4678 ElementKind get kind => ElementKind.PARAMETER; | |
4679 ParameterKind get parameterKind => _parameterKind; | |
4680 List<ParameterElement> get parameters => _parameters; | |
4681 SourceRange get visibleRange { | |
4682 if (_visibleRangeLength < 0) { | |
4683 return null; | |
4684 } | |
4685 return new SourceRange(_visibleRangeOffset, _visibleRangeLength); | |
4686 } | |
4687 bool get isInitializingFormal => false; | |
4688 bool get isPotentiallyMutated => _isPotentiallyMutated3; | |
4689 | |
4690 /** | |
4691 * Specifies that this variable is potentially mutated somewhere in its scope. | |
4692 */ | |
4693 void markPotentiallyMutated() { | |
4694 _isPotentiallyMutated3 = true; | |
4695 } | |
4696 | |
4697 /** | |
4698 * Set the range of the default value for this parameter to the range starting
at the given offset | |
4699 * with the given length. | |
4700 * | |
4701 * @param offset the offset to the beginning of the default value range for th
is element | |
4702 * @param length the length of the default value range for this element, or `-
1` if this | |
4703 * element does not have a default value | |
4704 */ | |
4705 void setDefaultValueRange(int offset, int length) { | |
4706 _defaultValueRangeOffset = offset; | |
4707 _defaultValueRangeLength = length; | |
4708 } | |
4709 | |
4710 /** | |
4711 * Set the kind of this parameter to the given kind. | |
4712 * | |
4713 * @param parameterKind the new kind of this parameter | |
4714 */ | |
4715 void set parameterKind(ParameterKind parameterKind) { | |
4716 this._parameterKind = parameterKind; | |
4717 } | |
4718 | |
4719 /** | |
4720 * Set the parameters defined by this executable element to the given paramete
rs. | |
4721 * | |
4722 * @param parameters the parameters defined by this executable element | |
4723 */ | |
4724 void set parameters(List<ParameterElement> parameters) { | |
4725 for (ParameterElement parameter in parameters) { | |
4726 ((parameter as ParameterElementImpl)).enclosingElement = this; | |
4727 } | |
4728 this._parameters = parameters; | |
4729 } | |
4730 | |
4731 /** | |
4732 * Set the visible range for this element to the range starting at the given o
ffset with the given | |
4733 * length. | |
4734 * | |
4735 * @param offset the offset to the beginning of the visible range for this ele
ment | |
4736 * @param length the length of the visible range for this element, or `-1` if
this element | |
4737 * does not have a visible range | |
4738 */ | |
4739 void setVisibleRange(int offset, int length) { | |
4740 _visibleRangeOffset = offset; | |
4741 _visibleRangeLength = length; | |
4742 } | |
4743 void visitChildren(ElementVisitor visitor) { | |
4744 super.visitChildren(visitor); | |
4745 safelyVisitChildren(_parameters, visitor); | |
4746 } | |
4747 void appendTo(JavaStringBuilder builder) { | |
4748 String left = ""; | |
4749 String right = ""; | |
4750 while (true) { | |
4751 if (parameterKind == ParameterKind.NAMED) { | |
4752 left = "{"; | |
4753 right = "}"; | |
4754 } else if (parameterKind == ParameterKind.POSITIONAL) { | |
4755 left = "["; | |
4756 right = "]"; | |
4757 } | |
4758 break; | |
4759 } | |
4760 builder.append(left); | |
4761 builder.append(type); | |
4762 builder.append(" "); | |
4763 builder.append(displayName); | |
4764 builder.append(right); | |
4765 } | |
4766 } | |
4767 /** | |
4768 * Instances of the class `PrefixElementImpl` implement a `PrefixElement`. | |
4769 * | |
4770 * @coverage dart.engine.element | |
4771 */ | |
4772 class PrefixElementImpl extends ElementImpl implements PrefixElement { | |
4773 | |
4774 /** | |
4775 * An array containing all of the libraries that are imported using this prefi
x. | |
4776 */ | |
4777 List<LibraryElement> _importedLibraries = LibraryElementImpl.EMPTY_ARRAY; | |
4778 | |
4779 /** | |
4780 * An empty array of prefix elements. | |
4781 */ | |
4782 static List<PrefixElement> EMPTY_ARRAY = new List<PrefixElement>(0); | |
4783 | |
4784 /** | |
4785 * Initialize a newly created prefix element to have the given name. | |
4786 * | |
4787 * @param name the name of this element | |
4788 */ | |
4789 PrefixElementImpl(Identifier name) : super.con1(name); | |
4790 accept(ElementVisitor visitor) => visitor.visitPrefixElement(this); | |
4791 LibraryElement get enclosingElement => super.enclosingElement as LibraryElemen
t; | |
4792 List<LibraryElement> get importedLibraries => _importedLibraries; | |
4793 ElementKind get kind => ElementKind.PREFIX; | |
4794 | |
4795 /** | |
4796 * Set the libraries that are imported using this prefix to the given librarie
s. | |
4797 * | |
4798 * @param importedLibraries the libraries that are imported using this prefix | |
4799 */ | |
4800 void set importedLibraries(List<LibraryElement> importedLibraries) { | |
4801 for (LibraryElement library in importedLibraries) { | |
4802 ((library as LibraryElementImpl)).enclosingElement = this; | |
4803 } | |
4804 this._importedLibraries = importedLibraries; | |
4805 } | |
4806 void appendTo(JavaStringBuilder builder) { | |
4807 builder.append("as "); | |
4808 super.appendTo(builder); | |
4809 } | |
4810 String get identifier => "_${super.identifier}"; | |
4811 } | |
4812 /** | |
4813 * Instances of the class `PropertyAccessorElementImpl` implement a | |
4814 * `PropertyAccessorElement`. | |
4815 * | |
4816 * @coverage dart.engine.element | |
4817 */ | |
4818 class PropertyAccessorElementImpl extends ExecutableElementImpl implements Prope
rtyAccessorElement { | |
4819 | |
4820 /** | |
4821 * The variable associated with this accessor. | |
4822 */ | |
4823 PropertyInducingElement _variable; | |
4824 | |
4825 /** | |
4826 * An empty array of property accessor elements. | |
4827 */ | |
4828 static List<PropertyAccessorElement> EMPTY_ARRAY = new List<PropertyAccessorEl
ement>(0); | |
4829 | |
4830 /** | |
4831 * Initialize a newly created property accessor element to have the given name
. | |
4832 * | |
4833 * @param name the name of this element | |
4834 */ | |
4835 PropertyAccessorElementImpl.con1(Identifier name) : super.con1(name); | |
4836 | |
4837 /** | |
4838 * Initialize a newly created synthetic property accessor element to be associ
ated with the given | |
4839 * variable. | |
4840 * | |
4841 * @param variable the variable with which this access is associated | |
4842 */ | |
4843 PropertyAccessorElementImpl.con2(PropertyInducingElementImpl variable) : super
.con2(variable.name, variable.nameOffset) { | |
4844 this._variable = variable; | |
4845 synthetic = true; | |
4846 } | |
4847 accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this); | |
4848 bool operator ==(Object object) => super == object && identical(isGetter, ((ob
ject as PropertyAccessorElement)).isGetter); | |
4849 PropertyAccessorElement get correspondingGetter { | |
4850 if (isGetter || _variable == null) { | |
4851 return null; | |
4852 } | |
4853 return _variable.getter; | |
4854 } | |
4855 PropertyAccessorElement get correspondingSetter { | |
4856 if (isSetter || _variable == null) { | |
4857 return null; | |
4858 } | |
4859 return _variable.setter; | |
4860 } | |
4861 ElementKind get kind { | |
4862 if (isGetter) { | |
4863 return ElementKind.GETTER; | |
4864 } | |
4865 return ElementKind.SETTER; | |
4866 } | |
4867 String get name { | |
4868 if (isSetter) { | |
4869 return "${super.name}="; | |
4870 } | |
4871 return super.name; | |
4872 } | |
4873 PropertyInducingElement get variable => _variable; | |
4874 bool get isAbstract => hasModifier(Modifier.ABSTRACT); | |
4875 bool get isGetter => hasModifier(Modifier.GETTER); | |
4876 bool get isSetter => hasModifier(Modifier.SETTER); | |
4877 bool get isStatic => hasModifier(Modifier.STATIC); | |
4878 | |
4879 /** | |
4880 * Set whether this accessor is abstract to correspond to the given value. | |
4881 * | |
4882 * @param isAbstract `true` if the accessor is abstract | |
4883 */ | |
4884 void set abstract(bool isAbstract) { | |
4885 setModifier(Modifier.ABSTRACT, isAbstract); | |
4886 } | |
4887 | |
4888 /** | |
4889 * Set whether this accessor is a getter to correspond to the given value. | |
4890 * | |
4891 * @param isGetter `true` if the accessor is a getter | |
4892 */ | |
4893 void set getter(bool isGetter) { | |
4894 setModifier(Modifier.GETTER, isGetter); | |
4895 } | |
4896 | |
4897 /** | |
4898 * Set whether this accessor is a setter to correspond to the given value. | |
4899 * | |
4900 * @param isSetter `true` if the accessor is a setter | |
4901 */ | |
4902 void set setter(bool isSetter) { | |
4903 setModifier(Modifier.SETTER, isSetter); | |
4904 } | |
4905 | |
4906 /** | |
4907 * Set whether this accessor is static to correspond to the given value. | |
4908 * | |
4909 * @param isStatic `true` if the accessor is static | |
4910 */ | |
4911 void set static(bool isStatic) { | |
4912 setModifier(Modifier.STATIC, isStatic); | |
4913 } | |
4914 | |
4915 /** | |
4916 * Set the variable associated with this accessor to the given variable. | |
4917 * | |
4918 * @param variable the variable associated with this accessor | |
4919 */ | |
4920 void set variable(PropertyInducingElement variable) { | |
4921 this._variable = variable; | |
4922 } | |
4923 void appendTo(JavaStringBuilder builder) { | |
4924 builder.append(isGetter ? "get " : "set "); | |
4925 builder.append(variable.displayName); | |
4926 super.appendTo(builder); | |
4927 } | |
4928 } | |
4929 /** | |
4930 * Instances of the class `PropertyInducingElementImpl` implement a | |
4931 * `PropertyInducingElement`. | |
4932 * | |
4933 * @coverage dart.engine.element | |
4934 */ | |
4935 abstract class PropertyInducingElementImpl extends VariableElementImpl implement
s PropertyInducingElement { | |
4936 | |
4937 /** | |
4938 * The getter associated with this element. | |
4939 */ | |
4940 PropertyAccessorElement _getter; | |
4941 | |
4942 /** | |
4943 * The setter associated with this element, or `null` if the element is effect
ively | |
4944 * `final` and therefore does not have a setter associated with it. | |
4945 */ | |
4946 PropertyAccessorElement _setter; | |
4947 | |
4948 /** | |
4949 * An empty array of elements. | |
4950 */ | |
4951 static List<PropertyInducingElement> EMPTY_ARRAY = new List<PropertyInducingEl
ement>(0); | |
4952 | |
4953 /** | |
4954 * Initialize a newly created element to have the given name. | |
4955 * | |
4956 * @param name the name of this element | |
4957 */ | |
4958 PropertyInducingElementImpl.con1(Identifier name) : super.con1(name); | |
4959 | |
4960 /** | |
4961 * Initialize a newly created synthetic element to have the given name. | |
4962 * | |
4963 * @param name the name of this element | |
4964 */ | |
4965 PropertyInducingElementImpl.con2(String name) : super.con2(name, -1) { | |
4966 synthetic = true; | |
4967 } | |
4968 PropertyAccessorElement get getter => _getter; | |
4969 PropertyAccessorElement get setter => _setter; | |
4970 | |
4971 /** | |
4972 * Set the getter associated with this element to the given accessor. | |
4973 * | |
4974 * @param getter the getter associated with this element | |
4975 */ | |
4976 void set getter(PropertyAccessorElement getter) { | |
4977 this._getter = getter; | |
4978 } | |
4979 | |
4980 /** | |
4981 * Set the setter associated with this element to the given accessor. | |
4982 * | |
4983 * @param setter the setter associated with this element | |
4984 */ | |
4985 void set setter(PropertyAccessorElement setter) { | |
4986 this._setter = setter; | |
4987 } | |
4988 } | |
4989 /** | |
4990 * Instances of the class `ShowElementCombinatorImpl` implement a | |
4991 * [ShowElementCombinator]. | |
4992 * | |
4993 * @coverage dart.engine.element | |
4994 */ | |
4995 class ShowElementCombinatorImpl implements ShowElementCombinator { | |
4996 | |
4997 /** | |
4998 * The names that are to be made visible in the importing library if they are
defined in the | |
4999 * imported library. | |
5000 */ | |
5001 List<String> _shownNames = StringUtilities.EMPTY_ARRAY; | |
5002 | |
5003 /** | |
5004 * The offset of the character immediately following the last character of thi
s node. | |
5005 */ | |
5006 int _end = -1; | |
5007 | |
5008 /** | |
5009 * The offset of the 'show' keyword of this element. | |
5010 */ | |
5011 int _offset = 0; | |
5012 int get end => _end; | |
5013 int get offset => _offset; | |
5014 List<String> get shownNames => _shownNames; | |
5015 | |
5016 /** | |
5017 * Set the the offset of the character immediately following the last characte
r of this node. | |
5018 */ | |
5019 void set end(int endOffset) { | |
5020 this._end = endOffset; | |
5021 } | |
5022 | |
5023 /** | |
5024 * Sets the offset of the 'show' keyword of this directive. | |
5025 */ | |
5026 void set offset(int offset) { | |
5027 this._offset = offset; | |
5028 } | |
5029 | |
5030 /** | |
5031 * Set the names that are to be made visible in the importing library if they
are defined in the | |
5032 * imported library to the given names. | |
5033 * | |
5034 * @param shownNames the names that are to be made visible in the importing li
brary | |
5035 */ | |
5036 void set shownNames(List<String> shownNames) { | |
5037 this._shownNames = shownNames; | |
5038 } | |
5039 String toString() { | |
5040 JavaStringBuilder builder = new JavaStringBuilder(); | |
5041 builder.append("show "); | |
5042 int count = _shownNames.length; | |
5043 for (int i = 0; i < count; i++) { | |
5044 if (i > 0) { | |
5045 builder.append(", "); | |
5046 } | |
5047 builder.append(_shownNames[i]); | |
5048 } | |
5049 return builder.toString(); | |
5050 } | |
5051 } | |
5052 /** | |
5053 * Instances of the class `TopLevelVariableElementImpl` implement a | |
5054 * `TopLevelVariableElement`. | |
5055 * | |
5056 * @coverage dart.engine.element | |
5057 */ | |
5058 class TopLevelVariableElementImpl extends PropertyInducingElementImpl implements
TopLevelVariableElement { | |
5059 | |
5060 /** | |
5061 * An empty array of top-level variable elements. | |
5062 */ | |
5063 static List<TopLevelVariableElement> EMPTY_ARRAY = new List<TopLevelVariableEl
ement>(0); | |
5064 | |
5065 /** | |
5066 * Initialize a newly created top-level variable element to have the given nam
e. | |
5067 * | |
5068 * @param name the name of this element | |
5069 */ | |
5070 TopLevelVariableElementImpl.con1(Identifier name) : super.con1(name); | |
5071 | |
5072 /** | |
5073 * Initialize a newly created synthetic top-level variable element to have the
given name. | |
5074 * | |
5075 * @param name the name of this element | |
5076 */ | |
5077 TopLevelVariableElementImpl.con2(String name) : super.con2(name); | |
5078 accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this); | |
5079 ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE; | |
5080 bool get isStatic => true; | |
5081 } | |
5082 /** | |
5083 * Instances of the class `TypeParameterElementImpl` implement a [TypeParameterE
lement]. | |
5084 * | |
5085 * @coverage dart.engine.element | |
5086 */ | |
5087 class TypeParameterElementImpl extends ElementImpl implements TypeParameterEleme
nt { | |
5088 | |
5089 /** | |
5090 * The type defined by this type parameter. | |
5091 */ | |
5092 TypeParameterType _type; | |
5093 | |
5094 /** | |
5095 * The type representing the bound associated with this parameter, or `null` i
f this | |
5096 * parameter does not have an explicit bound. | |
5097 */ | |
5098 Type2 _bound; | |
5099 | |
5100 /** | |
5101 * An empty array of type parameter elements. | |
5102 */ | |
5103 static List<TypeParameterElement> EMPTY_ARRAY = new List<TypeParameterElement>
(0); | |
5104 | |
5105 /** | |
5106 * Initialize a newly created type parameter element to have the given name. | |
5107 * | |
5108 * @param name the name of this element | |
5109 */ | |
5110 TypeParameterElementImpl(Identifier name) : super.con1(name); | |
5111 accept(ElementVisitor visitor) => visitor.visitTypeParameterElement(this); | |
5112 Type2 get bound => _bound; | |
5113 ElementKind get kind => ElementKind.TYPE_PARAMETER; | |
5114 TypeParameterType get type => _type; | |
5115 | |
5116 /** | |
5117 * Set the type representing the bound associated with this parameter to the g
iven type. | |
5118 * | |
5119 * @param bound the type representing the bound associated with this parameter | |
5120 */ | |
5121 void set bound(Type2 bound) { | |
5122 this._bound = bound; | |
5123 } | |
5124 | |
5125 /** | |
5126 * Set the type defined by this type parameter to the given type | |
5127 * | |
5128 * @param type the type defined by this type parameter | |
5129 */ | |
5130 void set type(TypeParameterType type) { | |
5131 this._type = type; | |
5132 } | |
5133 void appendTo(JavaStringBuilder builder) { | |
5134 builder.append(displayName); | |
5135 if (_bound != null) { | |
5136 builder.append(" extends "); | |
5137 builder.append(_bound); | |
5138 } | |
5139 } | |
5140 } | |
5141 /** | |
5142 * Instances of the class `VariableElementImpl` implement a `VariableElement`. | |
5143 * | |
5144 * @coverage dart.engine.element | |
5145 */ | |
5146 abstract class VariableElementImpl extends ElementImpl implements VariableElemen
t { | |
5147 | |
5148 /** | |
5149 * The declared type of this variable. | |
5150 */ | |
5151 Type2 _type; | |
5152 | |
5153 /** | |
5154 * A synthetic function representing this variable's initializer, or `null` if
this variable | |
5155 * does not have an initializer. | |
5156 */ | |
5157 FunctionElement _initializer; | |
5158 | |
5159 /** | |
5160 * An empty array of variable elements. | |
5161 */ | |
5162 static List<VariableElement> EMPTY_ARRAY = new List<VariableElement>(0); | |
5163 | |
5164 /** | |
5165 * Initialize a newly created variable element to have the given name. | |
5166 * | |
5167 * @param name the name of this element | |
5168 */ | |
5169 VariableElementImpl.con1(Identifier name) : super.con1(name); | |
5170 | |
5171 /** | |
5172 * Initialize a newly created variable element to have the given name. | |
5173 * | |
5174 * @param name the name of this element | |
5175 * @param nameOffset the offset of the name of this element in the file that c
ontains the | |
5176 * declaration of this element | |
5177 */ | |
5178 VariableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameO
ffset); | |
5179 | |
5180 /** | |
5181 * Return the result of evaluating this variable's initializer as a compile-ti
me constant | |
5182 * expression, or `null` if this variable is not a 'const' variable or does no
t have an | |
5183 * initializer. | |
5184 * | |
5185 * @return the result of evaluating this variable's initializer | |
5186 */ | |
5187 EvaluationResultImpl get evaluationResult => null; | |
5188 FunctionElement get initializer => _initializer; | |
5189 Type2 get type => _type; | |
5190 bool get isConst => hasModifier(Modifier.CONST); | |
5191 bool get isFinal => hasModifier(Modifier.FINAL); | |
5192 | |
5193 /** | |
5194 * Return `true` if this variable is potentially mutated somewhere in its scop
e. This | |
5195 * information is only available for local variables (including parameters). | |
5196 * | |
5197 * @return `true` if this variable is potentially mutated somewhere in its sco
pe | |
5198 */ | |
5199 bool get isPotentiallyMutated => false; | |
5200 | |
5201 /** | |
5202 * Set whether this variable is const to correspond to the given value. | |
5203 * | |
5204 * @param isConst `true` if the variable is const | |
5205 */ | |
5206 void set const3(bool isConst) { | |
5207 setModifier(Modifier.CONST, isConst); | |
5208 } | |
5209 | |
5210 /** | |
5211 * Set the result of evaluating this variable's initializer as a compile-time
constant expression | |
5212 * to the given result. | |
5213 * | |
5214 * @param result the result of evaluating this variable's initializer | |
5215 */ | |
5216 void set evaluationResult(EvaluationResultImpl result) { | |
5217 throw new IllegalStateException("Invalid attempt to set a compile-time const
ant result"); | |
5218 } | |
5219 | |
5220 /** | |
5221 * Set whether this variable is final to correspond to the given value. | |
5222 * | |
5223 * @param isFinal `true` if the variable is final | |
5224 */ | |
5225 void set final2(bool isFinal) { | |
5226 setModifier(Modifier.FINAL, isFinal); | |
5227 } | |
5228 | |
5229 /** | |
5230 * Set the function representing this variable's initializer to the given func
tion. | |
5231 * | |
5232 * @param initializer the function representing this variable's initializer | |
5233 */ | |
5234 void set initializer(FunctionElement initializer) { | |
5235 if (initializer != null) { | |
5236 ((initializer as FunctionElementImpl)).enclosingElement = this; | |
5237 } | |
5238 this._initializer = initializer; | |
5239 } | |
5240 | |
5241 /** | |
5242 * Set the declared type of this variable to the given type. | |
5243 * | |
5244 * @param type the declared type of this variable | |
5245 */ | |
5246 void set type(Type2 type) { | |
5247 this._type = type; | |
5248 } | |
5249 void visitChildren(ElementVisitor visitor) { | |
5250 super.visitChildren(visitor); | |
5251 safelyVisitChild(_initializer, visitor); | |
5252 } | |
5253 void appendTo(JavaStringBuilder builder) { | |
5254 builder.append(type); | |
5255 builder.append(" "); | |
5256 builder.append(displayName); | |
5257 } | |
5258 } | |
5259 /** | |
5260 * Instances of the class `ConstructorMember` represent a constructor element de
fined in a | |
5261 * parameterized type where the values of the type parameters are known. | |
5262 */ | |
5263 class ConstructorMember extends ExecutableMember implements ConstructorElement { | |
5264 | |
5265 /** | |
5266 * If the given constructor's type is different when any type parameters from
the defining type's | |
5267 * declaration are replaced with the actual type arguments from the defining t
ype, create a | |
5268 * constructor member representing the given constructor. Return the member th
at was created, or | |
5269 * the base constructor if no member was created. | |
5270 * | |
5271 * @param baseConstructor the base constructor for which a member might be cre
ated | |
5272 * @param definingType the type defining the parameters and arguments to be us
ed in the | |
5273 * substitution | |
5274 * @return the constructor element that will return the correctly substituted
types | |
5275 */ | |
5276 static ConstructorElement from(ConstructorElement baseConstructor, InterfaceTy
pe definingType) { | |
5277 if (baseConstructor == null || definingType.typeArguments.length == 0) { | |
5278 return baseConstructor; | |
5279 } | |
5280 FunctionType baseType = baseConstructor.type; | |
5281 if (baseType == null) { | |
5282 return baseConstructor; | |
5283 } | |
5284 List<Type2> argumentTypes = definingType.typeArguments; | |
5285 List<Type2> parameterTypes = definingType.element.type.typeArguments; | |
5286 FunctionType substitutedType = baseType.substitute2(argumentTypes, parameter
Types); | |
5287 if (baseType == substitutedType) { | |
5288 return baseConstructor; | |
5289 } | |
5290 return new ConstructorMember(baseConstructor, definingType); | |
5291 } | |
5292 | |
5293 /** | |
5294 * Initialize a newly created element to represent a constructor of the given
parameterized type. | |
5295 * | |
5296 * @param baseElement the element on which the parameterized element was creat
ed | |
5297 * @param definingType the type in which the element is defined | |
5298 */ | |
5299 ConstructorMember(ConstructorElement baseElement, InterfaceType definingType)
: super(baseElement, definingType); | |
5300 accept(ElementVisitor visitor) => visitor.visitConstructorElement(this); | |
5301 ConstructorElement get baseElement => super.baseElement as ConstructorElement; | |
5302 ClassElement get enclosingElement => baseElement.enclosingElement; | |
5303 ConstructorElement get redirectedConstructor => from(baseElement.redirectedCon
structor, definingType); | |
5304 bool get isConst => baseElement.isConst; | |
5305 bool get isDefaultConstructor => baseElement.isDefaultConstructor; | |
5306 bool get isFactory => baseElement.isFactory; | |
5307 String toString() { | |
5308 ConstructorElement baseElement = this.baseElement; | |
5309 List<ParameterElement> parameters = this.parameters; | |
5310 FunctionType type = this.type; | |
5311 JavaStringBuilder builder = new JavaStringBuilder(); | |
5312 builder.append(baseElement.enclosingElement.displayName); | |
5313 String name = displayName; | |
5314 if (name != null && !name.isEmpty) { | |
5315 builder.append("."); | |
5316 builder.append(name); | |
5317 } | |
5318 builder.append("("); | |
5319 int parameterCount = parameters.length; | |
5320 for (int i = 0; i < parameterCount; i++) { | |
5321 if (i > 0) { | |
5322 builder.append(", "); | |
5323 } | |
5324 builder.append(parameters[i]).toString(); | |
5325 } | |
5326 builder.append(")"); | |
5327 if (type != null) { | |
5328 builder.append(" -> "); | |
5329 builder.append(type.returnType); | |
5330 } | |
5331 return builder.toString(); | |
5332 } | |
5333 InterfaceType get definingType => super.definingType as InterfaceType; | |
5334 } | |
5335 /** | |
5336 * The abstract class `ExecutableMember` defines the behavior common to members
that represent | |
5337 * an executable element defined in a parameterized type where the values of the
type parameters are | |
5338 * known. | |
5339 */ | |
5340 abstract class ExecutableMember extends Member implements ExecutableElement { | |
5341 | |
5342 /** | |
5343 * Initialize a newly created element to represent an executable element of th
e given | |
5344 * parameterized type. | |
5345 * | |
5346 * @param baseElement the element on which the parameterized element was creat
ed | |
5347 * @param definingType the type in which the element is defined | |
5348 */ | |
5349 ExecutableMember(ExecutableElement baseElement, InterfaceType definingType) :
super(baseElement, definingType); | |
5350 ExecutableElement get baseElement => super.baseElement as ExecutableElement; | |
5351 List<FunctionElement> get functions { | |
5352 throw new UnsupportedOperationException(); | |
5353 } | |
5354 List<LabelElement> get labels => baseElement.labels; | |
5355 List<LocalVariableElement> get localVariables { | |
5356 throw new UnsupportedOperationException(); | |
5357 } | |
5358 List<ParameterElement> get parameters { | |
5359 List<ParameterElement> baseParameters = baseElement.parameters; | |
5360 int parameterCount = baseParameters.length; | |
5361 if (parameterCount == 0) { | |
5362 return baseParameters; | |
5363 } | |
5364 List<ParameterElement> parameterizedParameters = new List<ParameterElement>(
parameterCount); | |
5365 for (int i = 0; i < parameterCount; i++) { | |
5366 parameterizedParameters[i] = ParameterMember.from(baseParameters[i], defin
ingType); | |
5367 } | |
5368 return parameterizedParameters; | |
5369 } | |
5370 Type2 get returnType => substituteFor(baseElement.returnType); | |
5371 FunctionType get type => substituteFor(baseElement.type); | |
5372 bool get isOperator => baseElement.isOperator; | |
5373 bool get isStatic => baseElement.isStatic; | |
5374 void visitChildren(ElementVisitor visitor) { | |
5375 super.visitChildren(visitor); | |
5376 safelyVisitChildren(baseElement.functions, visitor); | |
5377 safelyVisitChildren(labels, visitor); | |
5378 safelyVisitChildren(baseElement.localVariables, visitor); | |
5379 safelyVisitChildren(parameters, visitor); | |
5380 } | |
5381 } | |
5382 /** | |
5383 * Instances of the class `FieldMember` represent a field element defined in a p
arameterized | |
5384 * type where the values of the type parameters are known. | |
5385 */ | |
5386 class FieldMember extends VariableMember implements FieldElement { | |
5387 | |
5388 /** | |
5389 * If the given field's type is different when any type parameters from the de
fining type's | |
5390 * declaration are replaced with the actual type arguments from the defining t
ype, create a field | |
5391 * member representing the given field. Return the member that was created, or
the base field if | |
5392 * no member was created. | |
5393 * | |
5394 * @param baseField the base field for which a member might be created | |
5395 * @param definingType the type defining the parameters and arguments to be us
ed in the | |
5396 * substitution | |
5397 * @return the field element that will return the correctly substituted types | |
5398 */ | |
5399 static FieldElement from(FieldElement baseField, InterfaceType definingType) { | |
5400 if (baseField == null || definingType.typeArguments.length == 0) { | |
5401 return baseField; | |
5402 } | |
5403 Type2 baseType = baseField.type; | |
5404 if (baseType == null) { | |
5405 return baseField; | |
5406 } | |
5407 List<Type2> argumentTypes = definingType.typeArguments; | |
5408 List<Type2> parameterTypes = definingType.element.type.typeArguments; | |
5409 Type2 substitutedType = baseType.substitute2(argumentTypes, parameterTypes); | |
5410 if (baseType == substitutedType) { | |
5411 return baseField; | |
5412 } | |
5413 return new FieldMember(baseField, definingType); | |
5414 } | |
5415 | |
5416 /** | |
5417 * Initialize a newly created element to represent a field of the given parame
terized type. | |
5418 * | |
5419 * @param baseElement the element on which the parameterized element was creat
ed | |
5420 * @param definingType the type in which the element is defined | |
5421 */ | |
5422 FieldMember(FieldElement baseElement, InterfaceType definingType) : super(base
Element, definingType); | |
5423 accept(ElementVisitor visitor) => visitor.visitFieldElement(this); | |
5424 FieldElement get baseElement => super.baseElement as FieldElement; | |
5425 ClassElement get enclosingElement => baseElement.enclosingElement; | |
5426 PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.
getter, definingType); | |
5427 PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.
setter, definingType); | |
5428 bool get isStatic => baseElement.isStatic; | |
5429 InterfaceType get definingType => super.definingType as InterfaceType; | |
5430 } | |
5431 /** | |
5432 * The abstract class `Member` defines the behavior common to elements that repr
esent members | |
5433 * of parameterized types. | |
5434 */ | |
5435 abstract class Member implements Element { | |
5436 | |
5437 /** | |
5438 * The element on which the parameterized element was created. | |
5439 */ | |
5440 Element _baseElement; | |
5441 | |
5442 /** | |
5443 * The type in which the element is defined. | |
5444 */ | |
5445 ParameterizedType _definingType; | |
5446 | |
5447 /** | |
5448 * Initialize a newly created element to represent the member of the given par
ameterized type. | |
5449 * | |
5450 * @param baseElement the element on which the parameterized element was creat
ed | |
5451 * @param definingType the type in which the element is defined | |
5452 */ | |
5453 Member(Element baseElement, ParameterizedType definingType) { | |
5454 this._baseElement = baseElement; | |
5455 this._definingType = definingType; | |
5456 } | |
5457 String computeDocumentationComment() => _baseElement.computeDocumentationComme
nt(); | |
5458 Element getAncestor(Type elementClass) => baseElement.getAncestor(elementClass
); | |
5459 | |
5460 /** | |
5461 * Return the element on which the parameterized element was created. | |
5462 * | |
5463 * @return the element on which the parameterized element was created | |
5464 */ | |
5465 Element get baseElement => _baseElement; | |
5466 AnalysisContext get context => _baseElement.context; | |
5467 String get displayName => _baseElement.displayName; | |
5468 ElementKind get kind => _baseElement.kind; | |
5469 LibraryElement get library => _baseElement.library; | |
5470 ElementLocation get location => _baseElement.location; | |
5471 List<ElementAnnotation> get metadata => _baseElement.metadata; | |
5472 String get name => _baseElement.name; | |
5473 int get nameOffset => _baseElement.nameOffset; | |
5474 Source get source => _baseElement.source; | |
5475 bool isAccessibleIn(LibraryElement library) => _baseElement.isAccessibleIn(lib
rary); | |
5476 bool get isSynthetic => _baseElement.isSynthetic; | |
5477 void visitChildren(ElementVisitor visitor) { | |
5478 } | |
5479 | |
5480 /** | |
5481 * Return the type in which the element is defined. | |
5482 * | |
5483 * @return the type in which the element is defined | |
5484 */ | |
5485 ParameterizedType get definingType => _definingType; | |
5486 | |
5487 /** | |
5488 * If the given child is not `null`, use the given visitor to visit it. | |
5489 * | |
5490 * @param child the child to be visited | |
5491 * @param visitor the visitor to be used to visit the child | |
5492 */ | |
5493 void safelyVisitChild(Element child, ElementVisitor visitor) { | |
5494 if (child != null) { | |
5495 child.accept(visitor); | |
5496 } | |
5497 } | |
5498 | |
5499 /** | |
5500 * Use the given visitor to visit all of the children in the given array. | |
5501 * | |
5502 * @param children the children to be visited | |
5503 * @param visitor the visitor being used to visit the children | |
5504 */ | |
5505 void safelyVisitChildren(List<Element> children, ElementVisitor visitor) { | |
5506 if (children != null) { | |
5507 for (Element child in children) { | |
5508 child.accept(visitor); | |
5509 } | |
5510 } | |
5511 } | |
5512 | |
5513 /** | |
5514 * Return the type that results from replacing the type parameters in the give
n type with the type | |
5515 * arguments. | |
5516 * | |
5517 * @param type the type to be transformed | |
5518 * @return the result of transforming the type | |
5519 */ | |
5520 Type2 substituteFor(Type2 type) { | |
5521 List<Type2> argumentTypes = _definingType.typeArguments; | |
5522 List<Type2> parameterTypes = TypeParameterTypeImpl.getTypes(_definingType.ty
peParameters); | |
5523 return type.substitute2(argumentTypes, parameterTypes) as Type2; | |
5524 } | |
5525 | |
5526 /** | |
5527 * Return the array of types that results from replacing the type parameters i
n the given types | |
5528 * with the type arguments. | |
5529 * | |
5530 * @param types the types to be transformed | |
5531 * @return the result of transforming the types | |
5532 */ | |
5533 List<InterfaceType> substituteFor2(List<InterfaceType> types) { | |
5534 int count = types.length; | |
5535 List<InterfaceType> substitutedTypes = new List<InterfaceType>(count); | |
5536 for (int i = 0; i < count; i++) { | |
5537 substitutedTypes[i] = substituteFor(types[i]); | |
5538 } | |
5539 return substitutedTypes; | |
5540 } | |
5541 } | |
5542 /** | |
5543 * Instances of the class `MethodMember` represent a method element defined in a
parameterized | |
5544 * type where the values of the type parameters are known. | |
5545 */ | |
5546 class MethodMember extends ExecutableMember implements MethodElement { | |
5547 | |
5548 /** | |
5549 * If the given method's type is different when any type parameters from the d
efining type's | |
5550 * declaration are replaced with the actual type arguments from the defining t
ype, create a method | |
5551 * member representing the given method. Return the member that was created, o
r the base method if | |
5552 * no member was created. | |
5553 * | |
5554 * @param baseMethod the base method for which a member might be created | |
5555 * @param definingType the type defining the parameters and arguments to be us
ed in the | |
5556 * substitution | |
5557 * @return the method element that will return the correctly substituted types | |
5558 */ | |
5559 static MethodElement from(MethodElement baseMethod, InterfaceType definingType
) { | |
5560 if (baseMethod == null || definingType.typeArguments.length == 0) { | |
5561 return baseMethod; | |
5562 } | |
5563 FunctionType baseType = baseMethod.type; | |
5564 List<Type2> argumentTypes = definingType.typeArguments; | |
5565 List<Type2> parameterTypes = definingType.element.type.typeArguments; | |
5566 FunctionType substitutedType = baseType.substitute2(argumentTypes, parameter
Types); | |
5567 if (baseType == substitutedType) { | |
5568 return baseMethod; | |
5569 } | |
5570 return new MethodMember(baseMethod, definingType); | |
5571 } | |
5572 | |
5573 /** | |
5574 * Initialize a newly created element to represent a method of the given param
eterized type. | |
5575 * | |
5576 * @param baseElement the element on which the parameterized element was creat
ed | |
5577 * @param definingType the type in which the element is defined | |
5578 */ | |
5579 MethodMember(MethodElement baseElement, InterfaceType definingType) : super(ba
seElement, definingType); | |
5580 accept(ElementVisitor visitor) => visitor.visitMethodElement(this); | |
5581 MethodElement get baseElement => super.baseElement as MethodElement; | |
5582 ClassElement get enclosingElement => baseElement.enclosingElement; | |
5583 bool get isAbstract => baseElement.isAbstract; | |
5584 String toString() { | |
5585 MethodElement baseElement = this.baseElement; | |
5586 List<ParameterElement> parameters = this.parameters; | |
5587 FunctionType type = this.type; | |
5588 JavaStringBuilder builder = new JavaStringBuilder(); | |
5589 builder.append(baseElement.enclosingElement.displayName); | |
5590 builder.append("."); | |
5591 builder.append(baseElement.displayName); | |
5592 builder.append("("); | |
5593 int parameterCount = parameters.length; | |
5594 for (int i = 0; i < parameterCount; i++) { | |
5595 if (i > 0) { | |
5596 builder.append(", "); | |
5597 } | |
5598 builder.append(parameters[i]).toString(); | |
5599 } | |
5600 builder.append(")"); | |
5601 if (type != null) { | |
5602 builder.append(" -> "); | |
5603 builder.append(type.returnType); | |
5604 } | |
5605 return builder.toString(); | |
5606 } | |
5607 } | |
5608 /** | |
5609 * Instances of the class `ParameterMember` represent a parameter element define
d in a | |
5610 * parameterized type where the values of the type parameters are known. | |
5611 */ | |
5612 class ParameterMember extends VariableMember implements ParameterElement { | |
5613 | |
5614 /** | |
5615 * If the given parameter's type is different when any type parameters from th
e defining type's | |
5616 * declaration are replaced with the actual type arguments from the defining t
ype, create a | |
5617 * parameter member representing the given parameter. Return the member that w
as created, or the | |
5618 * base parameter if no member was created. | |
5619 * | |
5620 * @param baseParameter the base parameter for which a member might be created | |
5621 * @param definingType the type defining the parameters and arguments to be us
ed in the | |
5622 * substitution | |
5623 * @return the parameter element that will return the correctly substituted ty
pes | |
5624 */ | |
5625 static ParameterElement from(ParameterElement baseParameter, ParameterizedType
definingType) { | |
5626 if (baseParameter == null || definingType.typeArguments.length == 0) { | |
5627 return baseParameter; | |
5628 } | |
5629 if (baseParameter is! FieldFormalParameterElement) { | |
5630 Type2 baseType = baseParameter.type; | |
5631 List<Type2> argumentTypes = definingType.typeArguments; | |
5632 List<Type2> parameterTypes = TypeParameterTypeImpl.getTypes(definingType.t
ypeParameters); | |
5633 Type2 substitutedType = baseType.substitute2(argumentTypes, parameterTypes
); | |
5634 if (baseType == substitutedType) { | |
5635 return baseParameter; | |
5636 } | |
5637 } | |
5638 return new ParameterMember(baseParameter, definingType); | |
5639 } | |
5640 | |
5641 /** | |
5642 * Initialize a newly created element to represent a parameter of the given pa
rameterized type. | |
5643 * | |
5644 * @param baseElement the element on which the parameterized element was creat
ed | |
5645 * @param definingType the type in which the element is defined | |
5646 */ | |
5647 ParameterMember(ParameterElement baseElement, ParameterizedType definingType)
: super(baseElement, definingType); | |
5648 accept(ElementVisitor visitor) => visitor.visitParameterElement(this); | |
5649 Element getAncestor(Type elementClass) { | |
5650 Element element = baseElement.getAncestor(elementClass); | |
5651 ParameterizedType definingType = this.definingType; | |
5652 if (definingType is InterfaceType) { | |
5653 InterfaceType definingInterfaceType = definingType as InterfaceType; | |
5654 if (element is ConstructorElement) { | |
5655 return ConstructorMember.from(element as ConstructorElement, definingInt
erfaceType) as Element; | |
5656 } else if (element is MethodElement) { | |
5657 return MethodMember.from(element as MethodElement, definingInterfaceType
) as Element; | |
5658 } else if (element is PropertyAccessorElement) { | |
5659 return PropertyAccessorMember.from(element as PropertyAccessorElement, d
efiningInterfaceType) as Element; | |
5660 } | |
5661 } | |
5662 return element; | |
5663 } | |
5664 ParameterElement get baseElement => super.baseElement as ParameterElement; | |
5665 SourceRange get defaultValueRange => baseElement.defaultValueRange; | |
5666 Element get enclosingElement => baseElement.enclosingElement; | |
5667 ParameterKind get parameterKind => baseElement.parameterKind; | |
5668 List<ParameterElement> get parameters { | |
5669 List<ParameterElement> baseParameters = baseElement.parameters; | |
5670 int parameterCount = baseParameters.length; | |
5671 if (parameterCount == 0) { | |
5672 return baseParameters; | |
5673 } | |
5674 List<ParameterElement> parameterizedParameters = new List<ParameterElement>(
parameterCount); | |
5675 for (int i = 0; i < parameterCount; i++) { | |
5676 parameterizedParameters[i] = ParameterMember.from(baseParameters[i], defin
ingType); | |
5677 } | |
5678 return parameterizedParameters; | |
5679 } | |
5680 SourceRange get visibleRange => baseElement.visibleRange; | |
5681 bool get isInitializingFormal => baseElement.isInitializingFormal; | |
5682 String toString() { | |
5683 ParameterElement baseElement = this.baseElement; | |
5684 String left = ""; | |
5685 String right = ""; | |
5686 while (true) { | |
5687 if (baseElement.parameterKind == ParameterKind.NAMED) { | |
5688 left = "{"; | |
5689 right = "}"; | |
5690 } else if (baseElement.parameterKind == ParameterKind.POSITIONAL) { | |
5691 left = "["; | |
5692 right = "]"; | |
5693 } | |
5694 break; | |
5695 } | |
5696 JavaStringBuilder builder = new JavaStringBuilder(); | |
5697 builder.append(left); | |
5698 builder.append(type); | |
5699 builder.append(" "); | |
5700 builder.append(baseElement.displayName); | |
5701 builder.append(right); | |
5702 return builder.toString(); | |
5703 } | |
5704 void visitChildren(ElementVisitor visitor) { | |
5705 super.visitChildren(visitor); | |
5706 safelyVisitChildren(parameters, visitor); | |
5707 } | |
5708 } | |
5709 /** | |
5710 * Instances of the class `PropertyAccessorMember` represent a property accessor
element | |
5711 * defined in a parameterized type where the values of the type parameters are k
nown. | |
5712 */ | |
5713 class PropertyAccessorMember extends ExecutableMember implements PropertyAccesso
rElement { | |
5714 | |
5715 /** | |
5716 * If the given property accessor's type is different when any type parameters
from the defining | |
5717 * type's declaration are replaced with the actual type arguments from the def
ining type, create a | |
5718 * property accessor member representing the given property accessor. Return t
he member that was | |
5719 * created, or the base accessor if no member was created. | |
5720 * | |
5721 * @param baseAccessor the base property accessor for which a member might be
created | |
5722 * @param definingType the type defining the parameters and arguments to be us
ed in the | |
5723 * substitution | |
5724 * @return the property accessor element that will return the correctly substi
tuted types | |
5725 */ | |
5726 static PropertyAccessorElement from(PropertyAccessorElement baseAccessor, Inte
rfaceType definingType) { | |
5727 if (baseAccessor == null || definingType.typeArguments.length == 0) { | |
5728 return baseAccessor; | |
5729 } | |
5730 FunctionType baseType = baseAccessor.type; | |
5731 List<Type2> argumentTypes = definingType.typeArguments; | |
5732 List<Type2> parameterTypes = definingType.element.type.typeArguments; | |
5733 FunctionType substitutedType = baseType.substitute2(argumentTypes, parameter
Types); | |
5734 if (baseType == substitutedType) { | |
5735 return baseAccessor; | |
5736 } | |
5737 return new PropertyAccessorMember(baseAccessor, definingType); | |
5738 } | |
5739 | |
5740 /** | |
5741 * Initialize a newly created element to represent a property accessor of the
given parameterized | |
5742 * type. | |
5743 * | |
5744 * @param baseElement the element on which the parameterized element was creat
ed | |
5745 * @param definingType the type in which the element is defined | |
5746 */ | |
5747 PropertyAccessorMember(PropertyAccessorElement baseElement, InterfaceType defi
ningType) : super(baseElement, definingType); | |
5748 accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this); | |
5749 PropertyAccessorElement get baseElement => super.baseElement as PropertyAccess
orElement; | |
5750 PropertyAccessorElement get correspondingGetter => from(baseElement.correspond
ingGetter, definingType); | |
5751 PropertyAccessorElement get correspondingSetter => from(baseElement.correspond
ingSetter, definingType); | |
5752 Element get enclosingElement => baseElement.enclosingElement; | |
5753 PropertyInducingElement get variable { | |
5754 PropertyInducingElement variable = baseElement.variable; | |
5755 if (variable is FieldElement) { | |
5756 return FieldMember.from(variable as FieldElement, definingType); | |
5757 } | |
5758 return variable; | |
5759 } | |
5760 bool get isAbstract => baseElement.isAbstract; | |
5761 bool get isGetter => baseElement.isGetter; | |
5762 bool get isSetter => baseElement.isSetter; | |
5763 String toString() { | |
5764 PropertyAccessorElement baseElement = this.baseElement; | |
5765 List<ParameterElement> parameters = this.parameters; | |
5766 FunctionType type = this.type; | |
5767 JavaStringBuilder builder = new JavaStringBuilder(); | |
5768 if (isGetter) { | |
5769 builder.append("get "); | |
5770 } else { | |
5771 builder.append("set "); | |
5772 } | |
5773 builder.append(baseElement.enclosingElement.displayName); | |
5774 builder.append("."); | |
5775 builder.append(baseElement.displayName); | |
5776 builder.append("("); | |
5777 int parameterCount = parameters.length; | |
5778 for (int i = 0; i < parameterCount; i++) { | |
5779 if (i > 0) { | |
5780 builder.append(", "); | |
5781 } | |
5782 builder.append(parameters[i]).toString(); | |
5783 } | |
5784 builder.append(")"); | |
5785 if (type != null) { | |
5786 builder.append(" -> "); | |
5787 builder.append(type.returnType); | |
5788 } | |
5789 return builder.toString(); | |
5790 } | |
5791 InterfaceType get definingType => super.definingType as InterfaceType; | |
5792 } | |
5793 /** | |
5794 * The abstract class `VariableMember` defines the behavior common to members th
at represent a | |
5795 * variable element defined in a parameterized type where the values of the type
parameters are | |
5796 * known. | |
5797 */ | |
5798 abstract class VariableMember extends Member implements VariableElement { | |
5799 | |
5800 /** | |
5801 * Initialize a newly created element to represent an executable element of th
e given | |
5802 * parameterized type. | |
5803 * | |
5804 * @param baseElement the element on which the parameterized element was creat
ed | |
5805 * @param definingType the type in which the element is defined | |
5806 */ | |
5807 VariableMember(VariableElement baseElement, ParameterizedType definingType) :
super(baseElement, definingType); | |
5808 VariableElement get baseElement => super.baseElement as VariableElement; | |
5809 FunctionElement get initializer { | |
5810 throw new UnsupportedOperationException(); | |
5811 } | |
5812 Type2 get type => substituteFor(baseElement.type); | |
5813 bool get isConst => baseElement.isConst; | |
5814 bool get isFinal => baseElement.isFinal; | |
5815 void visitChildren(ElementVisitor visitor) { | |
5816 super.visitChildren(visitor); | |
5817 safelyVisitChild(baseElement.initializer, visitor); | |
5818 } | |
5819 } | |
5820 /** | |
5821 * The unique instance of the class `BottomTypeImpl` implements the type `bottom
`. | |
5822 * | |
5823 * @coverage dart.engine.type | |
5824 */ | |
5825 class BottomTypeImpl extends TypeImpl { | |
5826 | |
5827 /** | |
5828 * The unique instance of this class. | |
5829 */ | |
5830 static final BottomTypeImpl instance = new BottomTypeImpl(); | |
5831 | |
5832 /** | |
5833 * Prevent the creation of instances of this class. | |
5834 */ | |
5835 BottomTypeImpl() : super(null, "<bottom>"); | |
5836 bool operator ==(Object object) => identical(object, this); | |
5837 bool get isBottom => true; | |
5838 bool isMoreSpecificThan(Type2 type) => true; | |
5839 bool isSubtypeOf(Type2 type) => true; | |
5840 bool isSupertypeOf(Type2 type) => false; | |
5841 BottomTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTyp
es) => this; | |
5842 } | |
5843 /** | |
5844 * The unique instance of the class `DynamicTypeImpl` implements the type `dynam
ic`. | |
5845 * | |
5846 * @coverage dart.engine.type | |
5847 */ | |
5848 class DynamicTypeImpl extends TypeImpl { | |
5849 | |
5850 /** | |
5851 * The unique instance of this class. | |
5852 */ | |
5853 static final DynamicTypeImpl instance = new DynamicTypeImpl(); | |
5854 | |
5855 /** | |
5856 * Prevent the creation of instances of this class. | |
5857 */ | |
5858 DynamicTypeImpl() : super(new DynamicElementImpl(), Keyword.DYNAMIC.syntax) { | |
5859 ((element as DynamicElementImpl)).type = this; | |
5860 } | |
5861 bool operator ==(Object object) => object is DynamicTypeImpl; | |
5862 bool get isDynamic => true; | |
5863 bool isMoreSpecificThan(Type2 type) { | |
5864 if (identical(this, type)) { | |
5865 return true; | |
5866 } | |
5867 return false; | |
5868 } | |
5869 bool isSubtypeOf(Type2 type) => true; | |
5870 bool isSupertypeOf(Type2 type) => true; | |
5871 Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) { | |
5872 int length = parameterTypes.length; | |
5873 for (int i = 0; i < length; i++) { | |
5874 if (parameterTypes[i] == this) { | |
5875 return argumentTypes[i]; | |
5876 } | |
5877 } | |
5878 return this; | |
5879 } | |
5880 } | |
5881 /** | |
5882 * Instances of the class `FunctionTypeImpl` defines the behavior common to obje
cts | |
5883 * representing the type of a function, method, constructor, getter, or setter. | |
5884 * | |
5885 * @coverage dart.engine.type | |
5886 */ | |
5887 class FunctionTypeImpl extends TypeImpl implements FunctionType { | |
5888 | |
5889 /** | |
5890 * Return `true` if all of the name/type pairs in the first map are equal to t
he | |
5891 * corresponding name/type pairs in the second map. The maps are expected to i
terate over their | |
5892 * entries in the same order in which those entries were added to the map. | |
5893 * | |
5894 * @param firstTypes the first map of name/type pairs being compared | |
5895 * @param secondTypes the second map of name/type pairs being compared | |
5896 * @return `true` if all of the name/type pairs in the first map are equal to
the | |
5897 * corresponding name/type pairs in the second map | |
5898 */ | |
5899 static bool equals2(Map<String, Type2> firstTypes, Map<String, Type2> secondTy
pes) { | |
5900 if (secondTypes.length != firstTypes.length) { | |
5901 return false; | |
5902 } | |
5903 JavaIterator<MapEntry<String, Type2>> firstIterator = new JavaIterator(getMa
pEntrySet(firstTypes)); | |
5904 JavaIterator<MapEntry<String, Type2>> secondIterator = new JavaIterator(getM
apEntrySet(secondTypes)); | |
5905 while (firstIterator.hasNext) { | |
5906 MapEntry<String, Type2> firstEntry = firstIterator.next(); | |
5907 MapEntry<String, Type2> secondEntry = secondIterator.next(); | |
5908 if (firstEntry.getKey() != secondEntry.getKey() || firstEntry.getValue() !
= secondEntry.getValue()) { | |
5909 return false; | |
5910 } | |
5911 } | |
5912 return true; | |
5913 } | |
5914 | |
5915 /** | |
5916 * An array containing the actual types of the type arguments. | |
5917 */ | |
5918 List<Type2> _typeArguments = TypeImpl.EMPTY_ARRAY; | |
5919 | |
5920 /** | |
5921 * Initialize a newly created function type to be declared by the given elemen
t and to have the | |
5922 * given name. | |
5923 * | |
5924 * @param element the element representing the declaration of the function typ
e | |
5925 */ | |
5926 FunctionTypeImpl.con1(ExecutableElement element) : super(element, element == n
ull ? null : element.name); | |
5927 | |
5928 /** | |
5929 * Initialize a newly created function type to be declared by the given elemen
t and to have the | |
5930 * given name. | |
5931 * | |
5932 * @param element the element representing the declaration of the function typ
e | |
5933 */ | |
5934 FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, eleme
nt == null ? null : element.name); | |
5935 bool operator ==(Object object) { | |
5936 if (object is! FunctionTypeImpl) { | |
5937 return false; | |
5938 } | |
5939 FunctionTypeImpl otherType = object as FunctionTypeImpl; | |
5940 return (element == otherType.element) && JavaArrays.equals(normalParameterTy
pes, otherType.normalParameterTypes) && JavaArrays.equals(optionalParameterTypes
, otherType.optionalParameterTypes) && equals2(namedParameterTypes, otherType.na
medParameterTypes) && (returnType == otherType.returnType); | |
5941 } | |
5942 String get displayName { | |
5943 String name = this.name; | |
5944 if (name == null || name.length == 0) { | |
5945 List<Type2> normalParameterTypes = this.normalParameterTypes; | |
5946 List<Type2> optionalParameterTypes = this.optionalParameterTypes; | |
5947 Map<String, Type2> namedParameterTypes = this.namedParameterTypes; | |
5948 Type2 returnType = this.returnType; | |
5949 JavaStringBuilder builder = new JavaStringBuilder(); | |
5950 builder.append("("); | |
5951 bool needsComma = false; | |
5952 if (normalParameterTypes.length > 0) { | |
5953 for (Type2 type in normalParameterTypes) { | |
5954 if (needsComma) { | |
5955 builder.append(", "); | |
5956 } else { | |
5957 needsComma = true; | |
5958 } | |
5959 builder.append(type.displayName); | |
5960 } | |
5961 } | |
5962 if (optionalParameterTypes.length > 0) { | |
5963 if (needsComma) { | |
5964 builder.append(", "); | |
5965 needsComma = false; | |
5966 } | |
5967 builder.append("["); | |
5968 for (Type2 type in optionalParameterTypes) { | |
5969 if (needsComma) { | |
5970 builder.append(", "); | |
5971 } else { | |
5972 needsComma = true; | |
5973 } | |
5974 builder.append(type.displayName); | |
5975 } | |
5976 builder.append("]"); | |
5977 needsComma = true; | |
5978 } | |
5979 if (namedParameterTypes.length > 0) { | |
5980 if (needsComma) { | |
5981 builder.append(", "); | |
5982 needsComma = false; | |
5983 } | |
5984 builder.append("{"); | |
5985 for (MapEntry<String, Type2> entry in getMapEntrySet(namedParameterTypes
)) { | |
5986 if (needsComma) { | |
5987 builder.append(", "); | |
5988 } else { | |
5989 needsComma = true; | |
5990 } | |
5991 builder.append(entry.getKey()); | |
5992 builder.append(": "); | |
5993 builder.append(entry.getValue().displayName); | |
5994 } | |
5995 builder.append("}"); | |
5996 needsComma = true; | |
5997 } | |
5998 builder.append(") -> "); | |
5999 if (returnType == null) { | |
6000 builder.append("null"); | |
6001 } else { | |
6002 builder.append(returnType.displayName); | |
6003 } | |
6004 name = builder.toString(); | |
6005 } | |
6006 return name; | |
6007 } | |
6008 Map<String, Type2> get namedParameterTypes { | |
6009 LinkedHashMap<String, Type2> namedParameterTypes = new LinkedHashMap<String,
Type2>(); | |
6010 List<ParameterElement> parameters = baseParameters; | |
6011 if (parameters.length == 0) { | |
6012 return namedParameterTypes; | |
6013 } | |
6014 List<Type2> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParamet
ers); | |
6015 for (ParameterElement parameter in parameters) { | |
6016 if (identical(parameter.parameterKind, ParameterKind.NAMED)) { | |
6017 namedParameterTypes[parameter.name] = parameter.type.substitute2(_typeAr
guments, typeParameters); | |
6018 } | |
6019 } | |
6020 return namedParameterTypes; | |
6021 } | |
6022 List<Type2> get normalParameterTypes { | |
6023 List<ParameterElement> parameters = baseParameters; | |
6024 if (parameters.length == 0) { | |
6025 return TypeImpl.EMPTY_ARRAY; | |
6026 } | |
6027 List<Type2> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParamet
ers); | |
6028 List<Type2> types = new List<Type2>(); | |
6029 for (ParameterElement parameter in parameters) { | |
6030 if (identical(parameter.parameterKind, ParameterKind.REQUIRED)) { | |
6031 types.add(parameter.type.substitute2(_typeArguments, typeParameters)); | |
6032 } | |
6033 } | |
6034 return new List.from(types); | |
6035 } | |
6036 List<Type2> get optionalParameterTypes { | |
6037 List<ParameterElement> parameters = baseParameters; | |
6038 if (parameters.length == 0) { | |
6039 return TypeImpl.EMPTY_ARRAY; | |
6040 } | |
6041 List<Type2> typeParameters = TypeParameterTypeImpl.getTypes(this.typeParamet
ers); | |
6042 List<Type2> types = new List<Type2>(); | |
6043 for (ParameterElement parameter in parameters) { | |
6044 if (identical(parameter.parameterKind, ParameterKind.POSITIONAL)) { | |
6045 types.add(parameter.type.substitute2(_typeArguments, typeParameters)); | |
6046 } | |
6047 } | |
6048 return new List.from(types); | |
6049 } | |
6050 List<ParameterElement> get parameters { | |
6051 List<ParameterElement> baseParameters = this.baseParameters; | |
6052 int parameterCount = baseParameters.length; | |
6053 if (parameterCount == 0) { | |
6054 return baseParameters; | |
6055 } | |
6056 List<ParameterElement> specializedParameters = new List<ParameterElement>(pa
rameterCount); | |
6057 for (int i = 0; i < parameterCount; i++) { | |
6058 specializedParameters[i] = ParameterMember.from(baseParameters[i], this); | |
6059 } | |
6060 return specializedParameters; | |
6061 } | |
6062 Type2 get returnType { | |
6063 Type2 baseReturnType = this.baseReturnType; | |
6064 if (baseReturnType == null) { | |
6065 return DynamicTypeImpl.instance; | |
6066 } | |
6067 return baseReturnType.substitute2(_typeArguments, TypeParameterTypeImpl.getT
ypes(typeParameters)); | |
6068 } | |
6069 List<Type2> get typeArguments => _typeArguments; | |
6070 List<TypeParameterElement> get typeParameters { | |
6071 Element element = this.element; | |
6072 if (element is FunctionTypeAliasElement) { | |
6073 return ((element as FunctionTypeAliasElement)).typeParameters; | |
6074 } | |
6075 ClassElement definingClass = element.getAncestor(ClassElement); | |
6076 if (definingClass != null) { | |
6077 return definingClass.typeParameters; | |
6078 } | |
6079 return TypeParameterElementImpl.EMPTY_ARRAY; | |
6080 } | |
6081 int get hashCode { | |
6082 Element element = this.element; | |
6083 if (element == null) { | |
6084 return 0; | |
6085 } | |
6086 return element.hashCode; | |
6087 } | |
6088 bool isAssignableTo(Type2 type) => this.isSubtypeOf(type); | |
6089 bool isMoreSpecificThan(Type2 type) { | |
6090 if (type == null) { | |
6091 return false; | |
6092 } else if (identical(this, type) || type.isDynamic || type.isDartCoreFunctio
n || type.isObject) { | |
6093 return true; | |
6094 } else if (type is! FunctionType) { | |
6095 return false; | |
6096 } else if (this == type) { | |
6097 return true; | |
6098 } | |
6099 FunctionType t = this; | |
6100 FunctionType s = type as FunctionType; | |
6101 List<Type2> tTypes = t.normalParameterTypes; | |
6102 List<Type2> tOpTypes = t.optionalParameterTypes; | |
6103 List<Type2> sTypes = s.normalParameterTypes; | |
6104 List<Type2> sOpTypes = s.optionalParameterTypes; | |
6105 if ((sOpTypes.length > 0 && t.namedParameterTypes.length > 0) || (tOpTypes.l
ength > 0 && s.namedParameterTypes.length > 0)) { | |
6106 return false; | |
6107 } | |
6108 if (t.namedParameterTypes.length > 0) { | |
6109 if (t.normalParameterTypes.length != s.normalParameterTypes.length) { | |
6110 return false; | |
6111 } else if (t.normalParameterTypes.length > 0) { | |
6112 for (int i = 0; i < tTypes.length; i++) { | |
6113 if (!tTypes[i].isMoreSpecificThan(sTypes[i])) { | |
6114 return false; | |
6115 } | |
6116 } | |
6117 } | |
6118 Map<String, Type2> namedTypesT = t.namedParameterTypes; | |
6119 Map<String, Type2> namedTypesS = s.namedParameterTypes; | |
6120 if (namedTypesT.length < namedTypesS.length) { | |
6121 return false; | |
6122 } | |
6123 JavaIterator<MapEntry<String, Type2>> iteratorS = new JavaIterator(getMapE
ntrySet(namedTypesS)); | |
6124 while (iteratorS.hasNext) { | |
6125 MapEntry<String, Type2> entryS = iteratorS.next(); | |
6126 Type2 typeT = namedTypesT[entryS.getKey()]; | |
6127 if (typeT == null) { | |
6128 return false; | |
6129 } | |
6130 if (!typeT.isMoreSpecificThan(entryS.getValue())) { | |
6131 return false; | |
6132 } | |
6133 } | |
6134 } else if (s.namedParameterTypes.length > 0) { | |
6135 return false; | |
6136 } else { | |
6137 int tArgLength = tTypes.length + tOpTypes.length; | |
6138 int sArgLength = sTypes.length + sOpTypes.length; | |
6139 if (tArgLength < sArgLength || sTypes.length < tTypes.length) { | |
6140 return false; | |
6141 } | |
6142 if (tOpTypes.length == 0 && sOpTypes.length == 0) { | |
6143 for (int i = 0; i < sTypes.length; i++) { | |
6144 if (!tTypes[i].isMoreSpecificThan(sTypes[i])) { | |
6145 return false; | |
6146 } | |
6147 } | |
6148 } else { | |
6149 List<Type2> tAllTypes = new List<Type2>(sArgLength); | |
6150 for (int i = 0; i < tTypes.length; i++) { | |
6151 tAllTypes[i] = tTypes[i]; | |
6152 } | |
6153 for (int i = tTypes.length, j = 0; i < sArgLength; i++, j++) { | |
6154 tAllTypes[i] = tOpTypes[j]; | |
6155 } | |
6156 List<Type2> sAllTypes = new List<Type2>(sArgLength); | |
6157 for (int i = 0; i < sTypes.length; i++) { | |
6158 sAllTypes[i] = sTypes[i]; | |
6159 } | |
6160 for (int i = sTypes.length, j = 0; i < sArgLength; i++, j++) { | |
6161 sAllTypes[i] = sOpTypes[j]; | |
6162 } | |
6163 for (int i = 0; i < sAllTypes.length; i++) { | |
6164 if (!tAllTypes[i].isMoreSpecificThan(sAllTypes[i])) { | |
6165 return false; | |
6166 } | |
6167 } | |
6168 } | |
6169 } | |
6170 Type2 tRetType = t.returnType; | |
6171 Type2 sRetType = s.returnType; | |
6172 return sRetType.isVoid || tRetType.isMoreSpecificThan(sRetType); | |
6173 } | |
6174 bool isSubtypeOf(Type2 type) { | |
6175 if (type == null) { | |
6176 return false; | |
6177 } else if (identical(this, type) || type.isDynamic || type.isDartCoreFunctio
n || type.isObject) { | |
6178 return true; | |
6179 } else if (type is! FunctionType) { | |
6180 return false; | |
6181 } else if (this == type) { | |
6182 return true; | |
6183 } | |
6184 FunctionType t = this; | |
6185 FunctionType s = type as FunctionType; | |
6186 List<Type2> tTypes = t.normalParameterTypes; | |
6187 List<Type2> tOpTypes = t.optionalParameterTypes; | |
6188 List<Type2> sTypes = s.normalParameterTypes; | |
6189 List<Type2> sOpTypes = s.optionalParameterTypes; | |
6190 if ((sOpTypes.length > 0 && t.namedParameterTypes.length > 0) || (tOpTypes.l
ength > 0 && s.namedParameterTypes.length > 0)) { | |
6191 return false; | |
6192 } | |
6193 if (t.namedParameterTypes.length > 0) { | |
6194 if (t.normalParameterTypes.length != s.normalParameterTypes.length) { | |
6195 return false; | |
6196 } else if (t.normalParameterTypes.length > 0) { | |
6197 for (int i = 0; i < tTypes.length; i++) { | |
6198 if (!tTypes[i].isAssignableTo(sTypes[i])) { | |
6199 return false; | |
6200 } | |
6201 } | |
6202 } | |
6203 Map<String, Type2> namedTypesT = t.namedParameterTypes; | |
6204 Map<String, Type2> namedTypesS = s.namedParameterTypes; | |
6205 if (namedTypesT.length < namedTypesS.length) { | |
6206 return false; | |
6207 } | |
6208 JavaIterator<MapEntry<String, Type2>> iteratorS = new JavaIterator(getMapE
ntrySet(namedTypesS)); | |
6209 while (iteratorS.hasNext) { | |
6210 MapEntry<String, Type2> entryS = iteratorS.next(); | |
6211 Type2 typeT = namedTypesT[entryS.getKey()]; | |
6212 if (typeT == null) { | |
6213 return false; | |
6214 } | |
6215 if (!typeT.isAssignableTo(entryS.getValue())) { | |
6216 return false; | |
6217 } | |
6218 } | |
6219 } else if (s.namedParameterTypes.length > 0) { | |
6220 return false; | |
6221 } else { | |
6222 int tArgLength = tTypes.length + tOpTypes.length; | |
6223 int sArgLength = sTypes.length + sOpTypes.length; | |
6224 if (tArgLength < sArgLength || sTypes.length < tTypes.length) { | |
6225 return false; | |
6226 } | |
6227 if (tOpTypes.length == 0 && sOpTypes.length == 0) { | |
6228 for (int i = 0; i < sTypes.length; i++) { | |
6229 if (!tTypes[i].isAssignableTo(sTypes[i])) { | |
6230 return false; | |
6231 } | |
6232 } | |
6233 } else { | |
6234 List<Type2> tAllTypes = new List<Type2>(sArgLength); | |
6235 for (int i = 0; i < tTypes.length; i++) { | |
6236 tAllTypes[i] = tTypes[i]; | |
6237 } | |
6238 for (int i = tTypes.length, j = 0; i < sArgLength; i++, j++) { | |
6239 tAllTypes[i] = tOpTypes[j]; | |
6240 } | |
6241 List<Type2> sAllTypes = new List<Type2>(sArgLength); | |
6242 for (int i = 0; i < sTypes.length; i++) { | |
6243 sAllTypes[i] = sTypes[i]; | |
6244 } | |
6245 for (int i = sTypes.length, j = 0; i < sArgLength; i++, j++) { | |
6246 sAllTypes[i] = sOpTypes[j]; | |
6247 } | |
6248 for (int i = 0; i < sAllTypes.length; i++) { | |
6249 if (!tAllTypes[i].isAssignableTo(sAllTypes[i])) { | |
6250 return false; | |
6251 } | |
6252 } | |
6253 } | |
6254 } | |
6255 Type2 tRetType = t.returnType; | |
6256 Type2 sRetType = s.returnType; | |
6257 return sRetType.isVoid || tRetType.isAssignableTo(sRetType); | |
6258 } | |
6259 | |
6260 /** | |
6261 * Set the actual types of the type arguments to the given types. | |
6262 * | |
6263 * @param typeArguments the actual types of the type arguments | |
6264 */ | |
6265 void set typeArguments(List<Type2> typeArguments) { | |
6266 this._typeArguments = typeArguments; | |
6267 } | |
6268 FunctionTypeImpl substitute3(List<Type2> argumentTypes) => substitute2(argumen
tTypes, typeArguments); | |
6269 FunctionTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterT
ypes) { | |
6270 if (argumentTypes.length != parameterTypes.length) { | |
6271 throw new IllegalArgumentException("argumentTypes.length (${argumentTypes.
length}) != parameterTypes.length (${parameterTypes.length})"); | |
6272 } | |
6273 if (argumentTypes.length == 0) { | |
6274 return this; | |
6275 } | |
6276 Element element = this.element; | |
6277 FunctionTypeImpl newType = (element is ExecutableElement) ? new FunctionType
Impl.con1(element as ExecutableElement) : new FunctionTypeImpl.con2(element as F
unctionTypeAliasElement); | |
6278 newType.typeArguments = TypeImpl.substitute(_typeArguments, argumentTypes, p
arameterTypes); | |
6279 return newType; | |
6280 } | |
6281 void appendTo(JavaStringBuilder builder) { | |
6282 List<Type2> normalParameterTypes = this.normalParameterTypes; | |
6283 List<Type2> optionalParameterTypes = this.optionalParameterTypes; | |
6284 Map<String, Type2> namedParameterTypes = this.namedParameterTypes; | |
6285 Type2 returnType = this.returnType; | |
6286 builder.append("("); | |
6287 bool needsComma = false; | |
6288 if (normalParameterTypes.length > 0) { | |
6289 for (Type2 type in normalParameterTypes) { | |
6290 if (needsComma) { | |
6291 builder.append(", "); | |
6292 } else { | |
6293 needsComma = true; | |
6294 } | |
6295 ((type as TypeImpl)).appendTo(builder); | |
6296 } | |
6297 } | |
6298 if (optionalParameterTypes.length > 0) { | |
6299 if (needsComma) { | |
6300 builder.append(", "); | |
6301 needsComma = false; | |
6302 } | |
6303 builder.append("["); | |
6304 for (Type2 type in optionalParameterTypes) { | |
6305 if (needsComma) { | |
6306 builder.append(", "); | |
6307 } else { | |
6308 needsComma = true; | |
6309 } | |
6310 ((type as TypeImpl)).appendTo(builder); | |
6311 } | |
6312 builder.append("]"); | |
6313 needsComma = true; | |
6314 } | |
6315 if (namedParameterTypes.length > 0) { | |
6316 if (needsComma) { | |
6317 builder.append(", "); | |
6318 needsComma = false; | |
6319 } | |
6320 builder.append("{"); | |
6321 for (MapEntry<String, Type2> entry in getMapEntrySet(namedParameterTypes))
{ | |
6322 if (needsComma) { | |
6323 builder.append(", "); | |
6324 } else { | |
6325 needsComma = true; | |
6326 } | |
6327 builder.append(entry.getKey()); | |
6328 builder.append(": "); | |
6329 ((entry.getValue() as TypeImpl)).appendTo(builder); | |
6330 } | |
6331 builder.append("}"); | |
6332 needsComma = true; | |
6333 } | |
6334 builder.append(") -> "); | |
6335 if (returnType == null) { | |
6336 builder.append("null"); | |
6337 } else { | |
6338 ((returnType as TypeImpl)).appendTo(builder); | |
6339 } | |
6340 } | |
6341 | |
6342 /** | |
6343 * @return the base parameter elements of this function element, not `null`. | |
6344 */ | |
6345 List<ParameterElement> get baseParameters { | |
6346 Element element = this.element; | |
6347 if (element is ExecutableElement) { | |
6348 return ((element as ExecutableElement)).parameters; | |
6349 } else { | |
6350 return ((element as FunctionTypeAliasElement)).parameters; | |
6351 } | |
6352 } | |
6353 | |
6354 /** | |
6355 * Return the return type defined by this function's element. | |
6356 * | |
6357 * @return the return type defined by this function's element | |
6358 */ | |
6359 Type2 get baseReturnType { | |
6360 Element element = this.element; | |
6361 if (element is ExecutableElement) { | |
6362 return ((element as ExecutableElement)).returnType; | |
6363 } else { | |
6364 return ((element as FunctionTypeAliasElement)).returnType; | |
6365 } | |
6366 } | |
6367 } | |
6368 /** | |
6369 * Instances of the class `InterfaceTypeImpl` defines the behavior common to obj
ects | |
6370 * representing the type introduced by either a class or an interface, or a refe
rence to such a | |
6371 * type. | |
6372 * | |
6373 * @coverage dart.engine.type | |
6374 */ | |
6375 class InterfaceTypeImpl extends TypeImpl implements InterfaceType { | |
6376 | |
6377 /** | |
6378 * An empty array of types. | |
6379 */ | |
6380 static List<InterfaceType> EMPTY_ARRAY = new List<InterfaceType>(0); | |
6381 | |
6382 /** | |
6383 * This method computes the longest inheritance path from some passed [Type] t
o Object. | |
6384 * | |
6385 * @param type the [Type] to compute the longest inheritance path of from the
passed | |
6386 * [Type] to Object | |
6387 * @return the computed longest inheritance path to Object | |
6388 * @see InterfaceType#getLeastUpperBound(Type) | |
6389 */ | |
6390 static int computeLongestInheritancePathToObject(InterfaceType type) => comput
eLongestInheritancePathToObject2(type, 0, new Set<ClassElement>()); | |
6391 | |
6392 /** | |
6393 * Returns the set of all superinterfaces of the passed [Type]. | |
6394 * | |
6395 * @param type the [Type] to compute the set of superinterfaces of | |
6396 * @return the [Set] of superinterfaces of the passed [Type] | |
6397 * @see #getLeastUpperBound(Type) | |
6398 */ | |
6399 static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => comp
uteSuperinterfaceSet2(type, new Set<InterfaceType>()); | |
6400 | |
6401 /** | |
6402 * This method computes the longest inheritance path from some passed [Type] t
o Object. This | |
6403 * method calls itself recursively, callers should use the public method | |
6404 * [computeLongestInheritancePathToObject]. | |
6405 * | |
6406 * @param type the [Type] to compute the longest inheritance path of from the
passed | |
6407 * [Type] to Object | |
6408 * @param depth a field used recursively | |
6409 * @param visitedClasses the classes that have already been visited | |
6410 * @return the computed longest inheritance path to Object | |
6411 * @see #computeLongestInheritancePathToObject(Type) | |
6412 * @see #getLeastUpperBound(Type) | |
6413 */ | |
6414 static int computeLongestInheritancePathToObject2(InterfaceType type, int dept
h, Set<ClassElement> visitedClasses) { | |
6415 ClassElement classElement = type.element; | |
6416 if (classElement.supertype == null || visitedClasses.contains(classElement))
{ | |
6417 return depth; | |
6418 } | |
6419 int longestPath = 1; | |
6420 try { | |
6421 javaSetAdd(visitedClasses, classElement); | |
6422 List<InterfaceType> superinterfaces = classElement.interfaces; | |
6423 int pathLength; | |
6424 if (superinterfaces.length > 0) { | |
6425 for (InterfaceType superinterface in superinterfaces) { | |
6426 pathLength = computeLongestInheritancePathToObject2(superinterface, de
pth + 1, visitedClasses); | |
6427 if (pathLength > longestPath) { | |
6428 longestPath = pathLength; | |
6429 } | |
6430 } | |
6431 } | |
6432 InterfaceType supertype = classElement.supertype; | |
6433 pathLength = computeLongestInheritancePathToObject2(supertype, depth + 1,
visitedClasses); | |
6434 if (pathLength > longestPath) { | |
6435 longestPath = pathLength; | |
6436 } | |
6437 } finally { | |
6438 visitedClasses.remove(classElement); | |
6439 } | |
6440 return longestPath; | |
6441 } | |
6442 | |
6443 /** | |
6444 * Returns the set of all superinterfaces of the passed [Type]. This is a recu
rsive method, | |
6445 * callers should call the public [computeSuperinterfaceSet]. | |
6446 * | |
6447 * @param type the [Type] to compute the set of superinterfaces of | |
6448 * @param set a [HashSet] used recursively by this method | |
6449 * @return the [Set] of superinterfaces of the passed [Type] | |
6450 * @see #computeSuperinterfaceSet(Type) | |
6451 * @see #getLeastUpperBound(Type) | |
6452 */ | |
6453 static Set<InterfaceType> computeSuperinterfaceSet2(InterfaceType type, Set<In
terfaceType> set) { | |
6454 Element element = type.element; | |
6455 if (element != null && element is ClassElement) { | |
6456 ClassElement classElement = element as ClassElement; | |
6457 List<InterfaceType> superinterfaces = classElement.interfaces; | |
6458 for (InterfaceType superinterface in superinterfaces) { | |
6459 if (javaSetAdd(set, superinterface)) { | |
6460 computeSuperinterfaceSet2(superinterface, set); | |
6461 } | |
6462 } | |
6463 InterfaceType supertype = classElement.supertype; | |
6464 if (supertype != null) { | |
6465 if (javaSetAdd(set, supertype)) { | |
6466 computeSuperinterfaceSet2(supertype, set); | |
6467 } | |
6468 } | |
6469 } | |
6470 return set; | |
6471 } | |
6472 | |
6473 /** | |
6474 * Return the intersection of the given sets of types, where intersection is b
ased on the equality | |
6475 * of the elements of the types rather than on the equality of the types thems
elves. In cases | |
6476 * where two non-equal types have equal elements, which only happens when the
class is | |
6477 * parameterized, the type that is added to the intersection is the base type
with type arguments | |
6478 * that are the least upper bound of the type arguments of the two types. | |
6479 * | |
6480 * @param first the first set of types to be intersected | |
6481 * @param second the second set of types to be intersected | |
6482 * @return the intersection of the given sets of types | |
6483 */ | |
6484 static List<InterfaceType> intersection(Set<InterfaceType> first, Set<Interfac
eType> second) { | |
6485 Map<ClassElement, InterfaceType> firstMap = new Map<ClassElement, InterfaceT
ype>(); | |
6486 for (InterfaceType firstType in first) { | |
6487 firstMap[firstType.element] = firstType; | |
6488 } | |
6489 Set<InterfaceType> result = new Set<InterfaceType>(); | |
6490 for (InterfaceType secondType in second) { | |
6491 InterfaceType firstType = firstMap[secondType.element]; | |
6492 if (firstType != null) { | |
6493 javaSetAdd(result, leastUpperBound(firstType, secondType)); | |
6494 } | |
6495 } | |
6496 return new List.from(result); | |
6497 } | |
6498 | |
6499 /** | |
6500 * Return the "least upper bound" of the given types under the assumption that
the types have the | |
6501 * same element and differ only in terms of the type arguments. The resulting
type is composed by | |
6502 * comparing the corresponding type arguments, keeping those that are the same
, and using | |
6503 * 'dynamic' for those that are different. | |
6504 * | |
6505 * @param firstType the first type | |
6506 * @param secondType the second type | |
6507 * @return the "least upper bound" of the given types | |
6508 */ | |
6509 static InterfaceType leastUpperBound(InterfaceType firstType, InterfaceType se
condType) { | |
6510 if (firstType == secondType) { | |
6511 return firstType; | |
6512 } | |
6513 List<Type2> firstArguments = firstType.typeArguments; | |
6514 List<Type2> secondArguments = secondType.typeArguments; | |
6515 int argumentCount = firstArguments.length; | |
6516 if (argumentCount == 0) { | |
6517 return firstType; | |
6518 } | |
6519 List<Type2> lubArguments = new List<Type2>(argumentCount); | |
6520 for (int i = 0; i < argumentCount; i++) { | |
6521 if (firstArguments[i] == secondArguments[i]) { | |
6522 lubArguments[i] = firstArguments[i]; | |
6523 } | |
6524 if (lubArguments[i] == null) { | |
6525 lubArguments[i] = DynamicTypeImpl.instance; | |
6526 } | |
6527 } | |
6528 InterfaceTypeImpl lub = new InterfaceTypeImpl.con1(firstType.element); | |
6529 lub.typeArguments = lubArguments; | |
6530 return lub; | |
6531 } | |
6532 | |
6533 /** | |
6534 * An array containing the actual types of the type arguments. | |
6535 */ | |
6536 List<Type2> _typeArguments = TypeImpl.EMPTY_ARRAY; | |
6537 | |
6538 /** | |
6539 * Initialize a newly created type to be declared by the given element. | |
6540 * | |
6541 * @param element the element representing the declaration of the type | |
6542 */ | |
6543 InterfaceTypeImpl.con1(ClassElement element) : super(element, element.displayN
ame); | |
6544 | |
6545 /** | |
6546 * Initialize a newly created type to have the given name. This constructor sh
ould only be used in | |
6547 * cases where there is no declaration of the type. | |
6548 * | |
6549 * @param name the name of the type | |
6550 */ | |
6551 InterfaceTypeImpl.con2(String name) : super(null, name); | |
6552 bool operator ==(Object object) { | |
6553 if (object is! InterfaceTypeImpl) { | |
6554 return false; | |
6555 } | |
6556 InterfaceTypeImpl otherType = object as InterfaceTypeImpl; | |
6557 return (element == otherType.element) && JavaArrays.equals(_typeArguments, o
therType._typeArguments); | |
6558 } | |
6559 List<PropertyAccessorElement> get accessors { | |
6560 List<PropertyAccessorElement> accessors = element.accessors; | |
6561 List<PropertyAccessorElement> members = new List<PropertyAccessorElement>(ac
cessors.length); | |
6562 for (int i = 0; i < accessors.length; i++) { | |
6563 members[i] = PropertyAccessorMember.from(accessors[i], this); | |
6564 } | |
6565 return members; | |
6566 } | |
6567 String get displayName { | |
6568 String name = this.name; | |
6569 List<Type2> typeArguments = this.typeArguments; | |
6570 bool allDynamic = true; | |
6571 for (Type2 type in typeArguments) { | |
6572 if (type != null && !type.isDynamic) { | |
6573 allDynamic = false; | |
6574 break; | |
6575 } | |
6576 } | |
6577 if (!allDynamic) { | |
6578 JavaStringBuilder builder = new JavaStringBuilder(); | |
6579 builder.append(name); | |
6580 builder.append("<"); | |
6581 for (int i = 0; i < typeArguments.length; i++) { | |
6582 if (i != 0) { | |
6583 builder.append(", "); | |
6584 } | |
6585 Type2 typeArg = typeArguments[i]; | |
6586 builder.append(typeArg.displayName); | |
6587 } | |
6588 builder.append(">"); | |
6589 name = builder.toString(); | |
6590 } | |
6591 return name; | |
6592 } | |
6593 ClassElement get element => super.element as ClassElement; | |
6594 PropertyAccessorElement getGetter(String getterName) => PropertyAccessorMember
.from(((element as ClassElementImpl)).getGetter(getterName), this); | |
6595 List<InterfaceType> get interfaces { | |
6596 ClassElement classElement = element; | |
6597 List<InterfaceType> interfaces = classElement.interfaces; | |
6598 List<TypeParameterElement> typeParameters = classElement.typeParameters; | |
6599 List<Type2> parameterTypes = classElement.type.typeArguments; | |
6600 if (typeParameters.length == 0) { | |
6601 return interfaces; | |
6602 } | |
6603 int count = interfaces.length; | |
6604 List<InterfaceType> typedInterfaces = new List<InterfaceType>(count); | |
6605 for (int i = 0; i < count; i++) { | |
6606 typedInterfaces[i] = interfaces[i].substitute2(_typeArguments, parameterTy
pes); | |
6607 } | |
6608 return typedInterfaces; | |
6609 } | |
6610 Type2 getLeastUpperBound(Type2 type) { | |
6611 if (identical(type, this)) { | |
6612 return this; | |
6613 } | |
6614 Type2 dynamicType = DynamicTypeImpl.instance; | |
6615 if (identical(this, dynamicType) || identical(type, dynamicType)) { | |
6616 return dynamicType; | |
6617 } | |
6618 if (type is! InterfaceType) { | |
6619 return null; | |
6620 } | |
6621 InterfaceType i = this; | |
6622 InterfaceType j = type as InterfaceType; | |
6623 Set<InterfaceType> si = computeSuperinterfaceSet(i); | |
6624 Set<InterfaceType> sj = computeSuperinterfaceSet(j); | |
6625 javaSetAdd(si, i); | |
6626 javaSetAdd(sj, j); | |
6627 List<InterfaceType> s = intersection(si, sj); | |
6628 List<int> depths = new List<int>.filled(s.length, 0); | |
6629 int maxDepth = 0; | |
6630 for (int n = 0; n < s.length; n++) { | |
6631 depths[n] = computeLongestInheritancePathToObject(s[n]); | |
6632 if (depths[n] > maxDepth) { | |
6633 maxDepth = depths[n]; | |
6634 } | |
6635 } | |
6636 for (; maxDepth >= 0; maxDepth--) { | |
6637 int indexOfLeastUpperBound = -1; | |
6638 int numberOfTypesAtMaxDepth = 0; | |
6639 for (int m = 0; m < depths.length; m++) { | |
6640 if (depths[m] == maxDepth) { | |
6641 numberOfTypesAtMaxDepth++; | |
6642 indexOfLeastUpperBound = m; | |
6643 } | |
6644 } | |
6645 if (numberOfTypesAtMaxDepth == 1) { | |
6646 return s[indexOfLeastUpperBound]; | |
6647 } | |
6648 } | |
6649 return null; | |
6650 } | |
6651 MethodElement getMethod(String methodName) => MethodMember.from(((element as C
lassElementImpl)).getMethod(methodName), this); | |
6652 List<MethodElement> get methods { | |
6653 List<MethodElement> methods = element.methods; | |
6654 List<MethodElement> members = new List<MethodElement>(methods.length); | |
6655 for (int i = 0; i < methods.length; i++) { | |
6656 members[i] = MethodMember.from(methods[i], this); | |
6657 } | |
6658 return members; | |
6659 } | |
6660 List<InterfaceType> get mixins { | |
6661 ClassElement classElement = element; | |
6662 List<InterfaceType> mixins = classElement.mixins; | |
6663 List<TypeParameterElement> typeParameters = classElement.typeParameters; | |
6664 List<Type2> parameterTypes = classElement.type.typeArguments; | |
6665 if (typeParameters.length == 0) { | |
6666 return mixins; | |
6667 } | |
6668 int count = mixins.length; | |
6669 List<InterfaceType> typedMixins = new List<InterfaceType>(count); | |
6670 for (int i = 0; i < count; i++) { | |
6671 typedMixins[i] = mixins[i].substitute2(_typeArguments, parameterTypes); | |
6672 } | |
6673 return typedMixins; | |
6674 } | |
6675 PropertyAccessorElement getSetter(String setterName) => PropertyAccessorMember
.from(((element as ClassElementImpl)).getSetter(setterName), this); | |
6676 InterfaceType get superclass { | |
6677 ClassElement classElement = element; | |
6678 InterfaceType supertype = classElement.supertype; | |
6679 if (supertype == null) { | |
6680 return null; | |
6681 } | |
6682 return supertype.substitute2(_typeArguments, classElement.type.typeArguments
); | |
6683 } | |
6684 List<Type2> get typeArguments => _typeArguments; | |
6685 List<TypeParameterElement> get typeParameters => element.typeParameters; | |
6686 int get hashCode { | |
6687 ClassElement element = this.element; | |
6688 if (element == null) { | |
6689 return 0; | |
6690 } | |
6691 return element.hashCode; | |
6692 } | |
6693 bool get isDartCoreFunction { | |
6694 ClassElement element = this.element; | |
6695 if (element == null) { | |
6696 return false; | |
6697 } | |
6698 return element.name == "Function" && element.library.isDartCore; | |
6699 } | |
6700 bool isDirectSupertypeOf(InterfaceType type) { | |
6701 ClassElement i = element; | |
6702 ClassElement j = type.element; | |
6703 InterfaceType supertype = j.supertype; | |
6704 if (supertype == null) { | |
6705 return false; | |
6706 } | |
6707 ClassElement supertypeElement = supertype.element; | |
6708 if (supertypeElement == i) { | |
6709 return true; | |
6710 } | |
6711 for (InterfaceType interfaceType in j.interfaces) { | |
6712 if (interfaceType.element == i) { | |
6713 return true; | |
6714 } | |
6715 } | |
6716 for (InterfaceType mixinType in j.mixins) { | |
6717 if (mixinType.element == i) { | |
6718 return true; | |
6719 } | |
6720 } | |
6721 return false; | |
6722 } | |
6723 bool isMoreSpecificThan(Type2 type) { | |
6724 if (identical(type, DynamicTypeImpl.instance)) { | |
6725 return true; | |
6726 } else if (type is! InterfaceType) { | |
6727 return false; | |
6728 } | |
6729 return isMoreSpecificThan2(type as InterfaceType, new Set<ClassElement>()); | |
6730 } | |
6731 bool get isObject => element.supertype == null; | |
6732 bool isSubtypeOf(Type2 type) { | |
6733 if (identical(type, DynamicTypeImpl.instance)) { | |
6734 return true; | |
6735 } else if (type is TypeParameterType) { | |
6736 return true; | |
6737 } else if (type is FunctionType) { | |
6738 ClassElement element = this.element; | |
6739 MethodElement callMethod = element.lookUpMethod("call", element.library); | |
6740 if (callMethod != null) { | |
6741 return callMethod.type.isSubtypeOf(type); | |
6742 } | |
6743 return false; | |
6744 } else if (type is! InterfaceType) { | |
6745 return false; | |
6746 } else if (this == type) { | |
6747 return true; | |
6748 } | |
6749 return isSubtypeOf2(type as InterfaceType, new Set<ClassElement>()); | |
6750 } | |
6751 ConstructorElement lookUpConstructor(String constructorName, LibraryElement li
brary) { | |
6752 ConstructorElement constructorElement; | |
6753 if (constructorName == null) { | |
6754 constructorElement = element.unnamedConstructor; | |
6755 } else { | |
6756 constructorElement = element.getNamedConstructor(constructorName); | |
6757 } | |
6758 if (constructorElement == null || !constructorElement.isAccessibleIn(library
)) { | |
6759 return null; | |
6760 } | |
6761 return ConstructorMember.from(constructorElement, this); | |
6762 } | |
6763 PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library
) { | |
6764 PropertyAccessorElement element = getGetter(getterName); | |
6765 if (element != null && element.isAccessibleIn(library)) { | |
6766 return element; | |
6767 } | |
6768 return lookUpGetterInSuperclass(getterName, library); | |
6769 } | |
6770 PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryEle
ment library) { | |
6771 for (InterfaceType mixin in mixins) { | |
6772 PropertyAccessorElement element = mixin.getGetter(getterName); | |
6773 if (element != null && element.isAccessibleIn(library)) { | |
6774 return element; | |
6775 } | |
6776 } | |
6777 Set<ClassElement> visitedClasses = new Set<ClassElement>(); | |
6778 InterfaceType supertype = superclass; | |
6779 ClassElement supertypeElement = supertype == null ? null : supertype.element
; | |
6780 while (supertype != null && !visitedClasses.contains(supertypeElement)) { | |
6781 javaSetAdd(visitedClasses, supertypeElement); | |
6782 PropertyAccessorElement element = supertype.getGetter(getterName); | |
6783 if (element != null && element.isAccessibleIn(library)) { | |
6784 return element; | |
6785 } | |
6786 for (InterfaceType mixin in supertype.mixins) { | |
6787 element = mixin.getGetter(getterName); | |
6788 if (element != null && element.isAccessibleIn(library)) { | |
6789 return element; | |
6790 } | |
6791 } | |
6792 supertype = supertype.superclass; | |
6793 supertypeElement = supertype == null ? null : supertype.element; | |
6794 } | |
6795 return null; | |
6796 } | |
6797 MethodElement lookUpMethod(String methodName, LibraryElement library) { | |
6798 MethodElement element = getMethod(methodName); | |
6799 if (element != null && element.isAccessibleIn(library)) { | |
6800 return element; | |
6801 } | |
6802 return lookUpMethodInSuperclass(methodName, library); | |
6803 } | |
6804 MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement libra
ry) { | |
6805 for (InterfaceType mixin in mixins) { | |
6806 MethodElement element = mixin.getMethod(methodName); | |
6807 if (element != null && element.isAccessibleIn(library)) { | |
6808 return element; | |
6809 } | |
6810 } | |
6811 Set<ClassElement> visitedClasses = new Set<ClassElement>(); | |
6812 InterfaceType supertype = superclass; | |
6813 ClassElement supertypeElement = supertype == null ? null : supertype.element
; | |
6814 while (supertype != null && !visitedClasses.contains(supertypeElement)) { | |
6815 javaSetAdd(visitedClasses, supertypeElement); | |
6816 MethodElement element = supertype.getMethod(methodName); | |
6817 if (element != null && element.isAccessibleIn(library)) { | |
6818 return element; | |
6819 } | |
6820 for (InterfaceType mixin in supertype.mixins) { | |
6821 element = mixin.getMethod(methodName); | |
6822 if (element != null && element.isAccessibleIn(library)) { | |
6823 return element; | |
6824 } | |
6825 } | |
6826 supertype = supertype.superclass; | |
6827 supertypeElement = supertype == null ? null : supertype.element; | |
6828 } | |
6829 return null; | |
6830 } | |
6831 PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library
) { | |
6832 PropertyAccessorElement element = getSetter(setterName); | |
6833 if (element != null && element.isAccessibleIn(library)) { | |
6834 return element; | |
6835 } | |
6836 return lookUpSetterInSuperclass(setterName, library); | |
6837 } | |
6838 PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryEle
ment library) { | |
6839 for (InterfaceType mixin in mixins) { | |
6840 PropertyAccessorElement element = mixin.getSetter(setterName); | |
6841 if (element != null && element.isAccessibleIn(library)) { | |
6842 return element; | |
6843 } | |
6844 } | |
6845 Set<ClassElement> visitedClasses = new Set<ClassElement>(); | |
6846 InterfaceType supertype = superclass; | |
6847 ClassElement supertypeElement = supertype == null ? null : supertype.element
; | |
6848 while (supertype != null && !visitedClasses.contains(supertypeElement)) { | |
6849 javaSetAdd(visitedClasses, supertypeElement); | |
6850 PropertyAccessorElement element = supertype.getSetter(setterName); | |
6851 if (element != null && element.isAccessibleIn(library)) { | |
6852 return element; | |
6853 } | |
6854 for (InterfaceType mixin in supertype.mixins) { | |
6855 element = mixin.getSetter(setterName); | |
6856 if (element != null && element.isAccessibleIn(library)) { | |
6857 return element; | |
6858 } | |
6859 } | |
6860 supertype = supertype.superclass; | |
6861 supertypeElement = supertype == null ? null : supertype.element; | |
6862 } | |
6863 return null; | |
6864 } | |
6865 | |
6866 /** | |
6867 * Set the actual types of the type arguments to those in the given array. | |
6868 * | |
6869 * @param typeArguments the actual types of the type arguments | |
6870 */ | |
6871 void set typeArguments(List<Type2> typeArguments) { | |
6872 this._typeArguments = typeArguments; | |
6873 } | |
6874 InterfaceTypeImpl substitute4(List<Type2> argumentTypes) => substitute2(argume
ntTypes, typeArguments); | |
6875 InterfaceTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameter
Types) { | |
6876 if (argumentTypes.length != parameterTypes.length) { | |
6877 throw new IllegalArgumentException("argumentTypes.length (${argumentTypes.
length}) != parameterTypes.length (${parameterTypes.length})"); | |
6878 } | |
6879 if (argumentTypes.length == 0 || _typeArguments.length == 0) { | |
6880 return this; | |
6881 } | |
6882 List<Type2> newTypeArguments = TypeImpl.substitute(_typeArguments, argumentT
ypes, parameterTypes); | |
6883 if (JavaArrays.equals(newTypeArguments, _typeArguments)) { | |
6884 return this; | |
6885 } | |
6886 InterfaceTypeImpl newType = new InterfaceTypeImpl.con1(element); | |
6887 newType.typeArguments = newTypeArguments; | |
6888 return newType; | |
6889 } | |
6890 void appendTo(JavaStringBuilder builder) { | |
6891 builder.append(name); | |
6892 int argumentCount = _typeArguments.length; | |
6893 if (argumentCount > 0) { | |
6894 builder.append("<"); | |
6895 for (int i = 0; i < argumentCount; i++) { | |
6896 if (i > 0) { | |
6897 builder.append(", "); | |
6898 } | |
6899 ((_typeArguments[i] as TypeImpl)).appendTo(builder); | |
6900 } | |
6901 builder.append(">"); | |
6902 } | |
6903 } | |
6904 bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses) { | |
6905 if (this == s) { | |
6906 return true; | |
6907 } | |
6908 if (s.isDirectSupertypeOf(this)) { | |
6909 return true; | |
6910 } | |
6911 ClassElement tElement = this.element; | |
6912 ClassElement sElement = s.element; | |
6913 if (tElement == sElement) { | |
6914 List<Type2> tArguments = typeArguments; | |
6915 List<Type2> sArguments = s.typeArguments; | |
6916 if (tArguments.length != sArguments.length) { | |
6917 return false; | |
6918 } | |
6919 for (int i = 0; i < tArguments.length; i++) { | |
6920 if (!tArguments[i].isMoreSpecificThan(sArguments[i])) { | |
6921 return false; | |
6922 } | |
6923 } | |
6924 return true; | |
6925 } | |
6926 ClassElement element = this.element; | |
6927 if (element == null || visitedClasses.contains(element)) { | |
6928 return false; | |
6929 } | |
6930 javaSetAdd(visitedClasses, element); | |
6931 InterfaceType supertype = superclass; | |
6932 if (supertype != null && ((supertype as InterfaceTypeImpl)).isMoreSpecificTh
an2(s, visitedClasses)) { | |
6933 return true; | |
6934 } | |
6935 for (InterfaceType interfaceType in interfaces) { | |
6936 if (((interfaceType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedC
lasses)) { | |
6937 return true; | |
6938 } | |
6939 } | |
6940 for (InterfaceType mixinType in mixins) { | |
6941 if (((mixinType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClass
es)) { | |
6942 return true; | |
6943 } | |
6944 } | |
6945 return false; | |
6946 } | |
6947 bool isSubtypeOf2(InterfaceType type, Set<ClassElement> visitedClasses) { | |
6948 InterfaceType typeT = this; | |
6949 InterfaceType typeS = type; | |
6950 ClassElement elementT = element; | |
6951 if (elementT == null || visitedClasses.contains(elementT)) { | |
6952 return false; | |
6953 } | |
6954 javaSetAdd(visitedClasses, elementT); | |
6955 typeT = substitute2(_typeArguments, elementT.type.typeArguments); | |
6956 if (typeT == typeS) { | |
6957 return true; | |
6958 } else if (elementT == typeS.element) { | |
6959 List<Type2> typeTArgs = typeT.typeArguments; | |
6960 List<Type2> typeSArgs = typeS.typeArguments; | |
6961 if (typeTArgs.length != typeSArgs.length) { | |
6962 return false; | |
6963 } | |
6964 for (int i = 0; i < typeTArgs.length; i++) { | |
6965 if (!typeTArgs[i].isSubtypeOf(typeSArgs[i])) { | |
6966 return false; | |
6967 } | |
6968 } | |
6969 return true; | |
6970 } else if (typeS.isDartCoreFunction && elementT.getMethod("call") != null) { | |
6971 return true; | |
6972 } | |
6973 InterfaceType supertype = superclass; | |
6974 if (supertype != null && ((supertype as InterfaceTypeImpl)).isSubtypeOf2(typ
eS, visitedClasses)) { | |
6975 return true; | |
6976 } | |
6977 List<InterfaceType> interfaceTypes = interfaces; | |
6978 for (InterfaceType interfaceType in interfaceTypes) { | |
6979 if (((interfaceType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClas
ses)) { | |
6980 return true; | |
6981 } | |
6982 } | |
6983 List<InterfaceType> mixinTypes = mixins; | |
6984 for (InterfaceType mixinType in mixinTypes) { | |
6985 if (((mixinType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)
) { | |
6986 return true; | |
6987 } | |
6988 } | |
6989 return false; | |
6990 } | |
6991 } | |
6992 /** | |
6993 * The abstract class `TypeImpl` implements the behavior common to objects repre
senting the | |
6994 * declared type of elements in the element model. | |
6995 * | |
6996 * @coverage dart.engine.type | |
6997 */ | |
6998 abstract class TypeImpl implements Type2 { | |
6999 | |
7000 /** | |
7001 * Return an array containing the results of using the given argument types an
d parameter types to | |
7002 * perform a substitution on all of the given types. | |
7003 * | |
7004 * @param types the types on which a substitution is to be performed | |
7005 * @param argumentTypes the argument types for the substitution | |
7006 * @param parameterTypes the parameter types for the substitution | |
7007 * @return the result of performing the substitution on each of the types | |
7008 */ | |
7009 static List<Type2> substitute(List<Type2> types, List<Type2> argumentTypes, Li
st<Type2> parameterTypes) { | |
7010 int length = types.length; | |
7011 if (length == 0) { | |
7012 return types; | |
7013 } | |
7014 List<Type2> newTypes = new List<Type2>(length); | |
7015 for (int i = 0; i < length; i++) { | |
7016 newTypes[i] = types[i].substitute2(argumentTypes, parameterTypes); | |
7017 } | |
7018 return newTypes; | |
7019 } | |
7020 | |
7021 /** | |
7022 * The element representing the declaration of this type, or `null` if the typ
e has not, or | |
7023 * cannot, be associated with an element. | |
7024 */ | |
7025 Element _element; | |
7026 | |
7027 /** | |
7028 * The name of this type, or `null` if the type does not have a name. | |
7029 */ | |
7030 String _name; | |
7031 | |
7032 /** | |
7033 * An empty array of types. | |
7034 */ | |
7035 static List<Type2> EMPTY_ARRAY = new List<Type2>(0); | |
7036 | |
7037 /** | |
7038 * Initialize a newly created type to be declared by the given element and to
have the given name. | |
7039 * | |
7040 * @param element the element representing the declaration of the type | |
7041 * @param name the name of the type | |
7042 */ | |
7043 TypeImpl(Element element, String name) { | |
7044 this._element = element; | |
7045 this._name = name; | |
7046 } | |
7047 String get displayName => name; | |
7048 Element get element => _element; | |
7049 Type2 getLeastUpperBound(Type2 type) => null; | |
7050 String get name => _name; | |
7051 bool isAssignableTo(Type2 type) => this.isSubtypeOf(type) || type.isSubtypeOf(
this); | |
7052 bool get isBottom => false; | |
7053 bool get isDartCoreFunction => false; | |
7054 bool get isDynamic => false; | |
7055 bool isMoreSpecificThan(Type2 type) => false; | |
7056 bool get isObject => false; | |
7057 bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this); | |
7058 bool get isVoid => false; | |
7059 String toString() { | |
7060 JavaStringBuilder builder = new JavaStringBuilder(); | |
7061 appendTo(builder); | |
7062 return builder.toString(); | |
7063 } | |
7064 | |
7065 /** | |
7066 * Append a textual representation of this type to the given builder. | |
7067 * | |
7068 * @param builder the builder to which the text is to be appended | |
7069 */ | |
7070 void appendTo(JavaStringBuilder builder) { | |
7071 if (_name == null) { | |
7072 builder.append("<unnamed type>"); | |
7073 } else { | |
7074 builder.append(_name); | |
7075 } | |
7076 } | |
7077 } | |
7078 /** | |
7079 * Instances of the class `TypeParameterTypeImpl` defines the behavior of object
s representing | |
7080 * the type introduced by a type parameter. | |
7081 * | |
7082 * @coverage dart.engine.type | |
7083 */ | |
7084 class TypeParameterTypeImpl extends TypeImpl implements TypeParameterType { | |
7085 | |
7086 /** | |
7087 * An empty array of type parameter types. | |
7088 */ | |
7089 static List<TypeParameterType> EMPTY_ARRAY = new List<TypeParameterType>(0); | |
7090 | |
7091 /** | |
7092 * Return an array containing the type parameter types defined by the given ar
ray of type | |
7093 * parameter elements. | |
7094 * | |
7095 * @param typeParameters the type parameter elements defining the type paramet
er types to be | |
7096 * returned | |
7097 * @return the type parameter types defined by the type parameter elements | |
7098 */ | |
7099 static List<TypeParameterType> getTypes(List<TypeParameterElement> typeParamet
ers) { | |
7100 int count = typeParameters.length; | |
7101 if (count == 0) { | |
7102 return EMPTY_ARRAY; | |
7103 } | |
7104 List<TypeParameterType> types = new List<TypeParameterType>(count); | |
7105 for (int i = 0; i < count; i++) { | |
7106 types[i] = typeParameters[i].type; | |
7107 } | |
7108 return types; | |
7109 } | |
7110 | |
7111 /** | |
7112 * Initialize a newly created type parameter type to be declared by the given
element and to have | |
7113 * the given name. | |
7114 * | |
7115 * @param element the element representing the declaration of the type paramet
er | |
7116 */ | |
7117 TypeParameterTypeImpl(TypeParameterElement element) : super(element, element.n
ame); | |
7118 bool operator ==(Object object) => object is TypeParameterTypeImpl && (element
== ((object as TypeParameterTypeImpl)).element); | |
7119 TypeParameterElement get element => super.element as TypeParameterElement; | |
7120 int get hashCode => element.hashCode; | |
7121 bool isMoreSpecificThan(Type2 s) { | |
7122 if (this == s) { | |
7123 return true; | |
7124 } | |
7125 if (s.isBottom) { | |
7126 return true; | |
7127 } | |
7128 if (s.isDynamic) { | |
7129 return true; | |
7130 } | |
7131 return isMoreSpecificThan3(s, new Set<Type2>()); | |
7132 } | |
7133 bool isSubtypeOf(Type2 s) => isMoreSpecificThan(s); | |
7134 Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) { | |
7135 int length = parameterTypes.length; | |
7136 for (int i = 0; i < length; i++) { | |
7137 if (parameterTypes[i] == this) { | |
7138 return argumentTypes[i]; | |
7139 } | |
7140 } | |
7141 return this; | |
7142 } | |
7143 bool isMoreSpecificThan3(Type2 s, Set<Type2> visitedTypes) { | |
7144 Type2 bound = element.bound; | |
7145 if (s == bound) { | |
7146 return true; | |
7147 } | |
7148 if (s.isObject) { | |
7149 return true; | |
7150 } | |
7151 if (bound == null) { | |
7152 return false; | |
7153 } | |
7154 if (bound is TypeParameterTypeImpl) { | |
7155 TypeParameterTypeImpl boundTypeParameter = bound as TypeParameterTypeImpl; | |
7156 if (visitedTypes.contains(bound)) { | |
7157 return false; | |
7158 } | |
7159 javaSetAdd(visitedTypes, bound); | |
7160 return boundTypeParameter.isMoreSpecificThan3(s, visitedTypes); | |
7161 } | |
7162 return bound.isMoreSpecificThan(s); | |
7163 } | |
7164 } | |
7165 /** | |
7166 * The unique instance of the class `VoidTypeImpl` implements the type `void`. | |
7167 * | |
7168 * @coverage dart.engine.type | |
7169 */ | |
7170 class VoidTypeImpl extends TypeImpl implements VoidType { | |
7171 | |
7172 /** | |
7173 * The unique instance of this class. | |
7174 */ | |
7175 static final VoidTypeImpl instance = new VoidTypeImpl(); | |
7176 | |
7177 /** | |
7178 * Prevent the creation of instances of this class. | |
7179 */ | |
7180 VoidTypeImpl() : super(null, Keyword.VOID.syntax); | |
7181 bool operator ==(Object object) => identical(object, this); | |
7182 bool isSubtypeOf(Type2 type) => identical(type, this) || identical(type, Dynam
icTypeImpl.instance); | |
7183 bool get isVoid => true; | |
7184 VoidTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes
) => this; | |
7185 } | |
7186 /** | |
7187 * The interface `FunctionType` defines the behavior common to objects represent
ing the type | |
7188 * of a function, method, constructor, getter, or setter. Function types come in
three variations: | |
7189 * <ol> | |
7190 * * The types of functions that only have required parameters. These have the g
eneral form | |
7191 * <i>(T<sub>1</sub>, …, T<sub>n</sub>) → T</i>. | |
7192 * * The types of functions with optional positional parameters. These have the
general form | |
7193 * <i>(T<sub>1</sub>, …, T<sub>n</sub>, [T<sub>n+1</sub>, …, T<sub
>n+k</sub>]) → | |
7194 * T</i>. | |
7195 * * The types of functions with named parameters. These have the general form <
i>(T<sub>1</sub>, | |
7196 * …, T<sub>n</sub>, {T<sub>x1</sub> x1, …, T<sub>xk</sub> xk}) &r
arr; T</i>. | |
7197 * </ol> | |
7198 * | |
7199 * @coverage dart.engine.type | |
7200 */ | |
7201 abstract class FunctionType implements ParameterizedType { | |
7202 | |
7203 /** | |
7204 * Return a map from the names of named parameters to the types of the named p
arameters of this | |
7205 * type of function. The entries in the map will be iterated in the same order
as the order in | |
7206 * which the named parameters were defined. If there were no named parameters
declared then the | |
7207 * map will be empty. | |
7208 * | |
7209 * @return a map from the name to the types of the named parameters of this ty
pe of function | |
7210 */ | |
7211 Map<String, Type2> get namedParameterTypes; | |
7212 | |
7213 /** | |
7214 * Return an array containing the types of the normal parameters of this type
of function. The | |
7215 * parameter types are in the same order as they appear in the declaration of
the function. | |
7216 * | |
7217 * @return the types of the normal parameters of this type of function | |
7218 */ | |
7219 List<Type2> get normalParameterTypes; | |
7220 | |
7221 /** | |
7222 * Return a map from the names of optional (positional) parameters to the type
s of the optional | |
7223 * parameters of this type of function. The entries in the map will be iterate
d in the same order | |
7224 * as the order in which the optional parameters were defined. If there were n
o optional | |
7225 * parameters declared then the map will be empty. | |
7226 * | |
7227 * @return a map from the name to the types of the optional parameters of this
type of function | |
7228 */ | |
7229 List<Type2> get optionalParameterTypes; | |
7230 | |
7231 /** | |
7232 * Return an array containing the parameters elements of this type of function
. The parameter | |
7233 * types are in the same order as they appear in the declaration of the functi
on. | |
7234 * | |
7235 * @return the parameters elements of this type of function | |
7236 */ | |
7237 List<ParameterElement> get parameters; | |
7238 | |
7239 /** | |
7240 * Return the type of object returned by this type of function. | |
7241 * | |
7242 * @return the type of object returned by this type of function | |
7243 */ | |
7244 Type2 get returnType; | |
7245 | |
7246 /** | |
7247 * Return `true` if this type is a subtype of the given type. | |
7248 * | |
7249 * A function type <i>(T<sub>1</sub>, …, T<sub>n</sub>) → T</i> is
a subtype of the | |
7250 * function type <i>(S<sub>1</sub>, …, S<sub>n</sub>) → S</i>, if
all of the following | |
7251 * conditions are met: | |
7252 * | |
7253 * * Either | |
7254 * | |
7255 * * <i>S</i> is void, or | |
7256 * * <i>T ⇔ S</i>. | |
7257 * | |
7258 * | |
7259 * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> ⇔ S<su
b>i</sub></i>. | |
7260 * | |
7261 * A function type <i>(T<sub>1</sub>, …, T<sub>n</sub>, [T<sub>n+1</sub
>, …, | |
7262 * T<sub>n+k</sub>]) → T</i> is a subtype of the function type <i>(S<sub>
1</sub>, …, | |
7263 * S<sub>n</sub>, [S<sub>n+1</sub>, …, S<sub>n+m</sub>]) → S</i>,
if all of the | |
7264 * following conditions are met: | |
7265 * | |
7266 * * Either | |
7267 * | |
7268 * * <i>S</i> is void, or | |
7269 * * <i>T ⇔ S</i>. | |
7270 * | |
7271 * | |
7272 * * <i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>, <
i>T<sub>i</sub> | |
7273 * ⇔ S<sub>i</sub></i>. | |
7274 * | |
7275 * A function type <i>(T<sub>1</sub>, …, T<sub>n</sub>, {T<sub>x1</sub>
x1, …, | |
7276 * T<sub>xk</sub> xk}) → T</i> is a subtype of the function type <i>(S<su
b>1</sub>, …, | |
7277 * S<sub>n</sub>, {S<sub>y1</sub> y1, …, S<sub>ym</sub> ym}) → S</
i>, if all of the | |
7278 * following conditions are met: | |
7279 * | |
7280 * * Either | |
7281 * | |
7282 * * <i>S</i> is void, | |
7283 * * or <i>T ⇔ S</i>. | |
7284 * | |
7285 * | |
7286 * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> ⇔ S<su
b>i</sub></i>. | |
7287 * * <i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>, &hell
ip;, | |
7288 * x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>. | |
7289 * * For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, …, y<sub>m</sub
>}</i>, | |
7290 * <i>y<sub>i</sub> = x<sub>j</sub> => Tj ⇔ Si</i>. | |
7291 * | |
7292 * In addition, the following subtype rules apply: | |
7293 * | |
7294 * <i>(T<sub>1</sub>, …, T<sub>n</sub>, []) → T <: (T<sub>1</sub>,
…, | |
7295 * T<sub>n</sub>) → T.</i><br> | |
7296 * <i>(T<sub>1</sub>, …, T<sub>n</sub>) → T <: (T<sub>1</sub>, &he
llip;, | |
7297 * T<sub>n</sub>, {}) → T.</i><br> | |
7298 * <i>(T<sub>1</sub>, …, T<sub>n</sub>, {}) → T <: (T<sub>1</sub>,
…, | |
7299 * T<sub>n</sub>) → T.</i><br> | |
7300 * <i>(T<sub>1</sub>, …, T<sub>n</sub>) → T <: (T<sub>1</sub>, &he
llip;, | |
7301 * T<sub>n</sub>, []) → T.</i> | |
7302 * | |
7303 * All functions implement the class `Function`. However not all function type
s are a | |
7304 * subtype of `Function`. If an interface type <i>I</i> includes a method name
d | |
7305 * `call()`, and the type of `call()` is the function type <i>F</i>, then <i>I
</i> is | |
7306 * considered to be a subtype of <i>F</i>. | |
7307 * | |
7308 * @param type the type being compared with this type | |
7309 * @return `true` if this type is a subtype of the given type | |
7310 */ | |
7311 bool isSubtypeOf(Type2 type); | |
7312 | |
7313 /** | |
7314 * Return the type resulting from substituting the given arguments for this ty
pe's parameters. | |
7315 * This is fully equivalent to `substitute(argumentTypes, getTypeArguments())`
. | |
7316 * | |
7317 * @param argumentTypes the actual type arguments being substituted for the ty
pe parameters | |
7318 * @return the result of performing the substitution | |
7319 */ | |
7320 FunctionType substitute3(List<Type2> argumentTypes); | |
7321 FunctionType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes
); | |
7322 } | |
7323 /** | |
7324 * The interface `InterfaceType` defines the behavior common to objects represen
ting the type | |
7325 * introduced by either a class or an interface, or a reference to such a type. | |
7326 * | |
7327 * @coverage dart.engine.type | |
7328 */ | |
7329 abstract class InterfaceType implements ParameterizedType { | |
7330 | |
7331 /** | |
7332 * Return an array containing all of the accessors (getters and setters) decla
red in this type. | |
7333 * | |
7334 * @return the accessors declared in this type | |
7335 */ | |
7336 List<PropertyAccessorElement> get accessors; | |
7337 ClassElement get element; | |
7338 | |
7339 /** | |
7340 * Return the element representing the getter with the given name that is decl
ared in this class, | |
7341 * or `null` if this class does not declare a getter with the given name. | |
7342 * | |
7343 * @param getterName the name of the getter to be returned | |
7344 * @return the getter declared in this class with the given name | |
7345 */ | |
7346 PropertyAccessorElement getGetter(String getterName); | |
7347 | |
7348 /** | |
7349 * Return an array containing all of the interfaces that are implemented by th
is interface. Note | |
7350 * that this is <b>not</b>, in general, equivalent to getting the interfaces f
rom this type's | |
7351 * element because the types returned by this method will have had their type
parameters replaced. | |
7352 * | |
7353 * @return the interfaces that are implemented by this type | |
7354 */ | |
7355 List<InterfaceType> get interfaces; | |
7356 | |
7357 /** | |
7358 * Return the least upper bound of this type and the given type, or `null` if
there is no | |
7359 * least upper bound. | |
7360 * | |
7361 * Given two interfaces <i>I</i> and <i>J</i>, let <i>S<sub>I</sub></i> be the
set of | |
7362 * superinterfaces of <i>I<i>, let <i>S<sub>J</sub></i> be the set of superint
erfaces of <i>J</i> | |
7363 * and let <i>S = (I ∪ S<sub>I</sub>) ∩ (J ∪ S<sub>J</sub>)</i>. F
urthermore, we | |
7364 * define <i>S<sub>n</sub> = {T | T ∈ S ∧ depth(T) = n}</i> for any f
inite <i>n</i>, | |
7365 * where <i>depth(T)</i> is the number of steps in the longest inheritance pat
h from <i>T</i> to | |
7366 * <i>Object</i>. Let <i>q</i> be the largest number such that <i>S<sub>q</sub
></i> has | |
7367 * cardinality one. The least upper bound of <i>I</i> and <i>J</i> is the sole
element of | |
7368 * <i>S<sub>q</sub></i>. | |
7369 * | |
7370 * @param type the other type used to compute the least upper bound | |
7371 * @return the least upper bound of this type and the given type | |
7372 */ | |
7373 Type2 getLeastUpperBound(Type2 type); | |
7374 | |
7375 /** | |
7376 * Return the element representing the method with the given name that is decl
ared in this class, | |
7377 * or `null` if this class does not declare a method with the given name. | |
7378 * | |
7379 * @param methodName the name of the method to be returned | |
7380 * @return the method declared in this class with the given name | |
7381 */ | |
7382 MethodElement getMethod(String methodName); | |
7383 | |
7384 /** | |
7385 * Return an array containing all of the methods declared in this type. | |
7386 * | |
7387 * @return the methods declared in this type | |
7388 */ | |
7389 List<MethodElement> get methods; | |
7390 | |
7391 /** | |
7392 * Return an array containing all of the mixins that are applied to the class
being extended in | |
7393 * order to derive the superclass of this class. Note that this is <b>not</b>,
in general, | |
7394 * equivalent to getting the mixins from this type's element because the types
returned by this | |
7395 * method will have had their type parameters replaced. | |
7396 * | |
7397 * @return the mixins that are applied to derive the superclass of this class | |
7398 */ | |
7399 List<InterfaceType> get mixins; | |
7400 | |
7401 /** | |
7402 * Return the element representing the setter with the given name that is decl
ared in this class, | |
7403 * or `null` if this class does not declare a setter with the given name. | |
7404 * | |
7405 * @param setterName the name of the setter to be returned | |
7406 * @return the setter declared in this class with the given name | |
7407 */ | |
7408 PropertyAccessorElement getSetter(String setterName); | |
7409 | |
7410 /** | |
7411 * Return the type representing the superclass of this type, or null if this t
ype represents the | |
7412 * class 'Object'. Note that this is <b>not</b>, in general, equivalent to get
ting the superclass | |
7413 * from this type's element because the type returned by this method will have
had it's type | |
7414 * parameters replaced. | |
7415 * | |
7416 * @return the superclass of this type | |
7417 */ | |
7418 InterfaceType get superclass; | |
7419 | |
7420 /** | |
7421 * Return `true` if this type is a direct supertype of the given type. The imp
licit | |
7422 * interface of class <i>I</i> is a direct supertype of the implicit interface
of class <i>J</i> | |
7423 * iff: | |
7424 * | |
7425 * * <i>I</i> is Object, and <i>J</i> has no extends clause. | |
7426 * * <i>I</i> is listed in the extends clause of <i>J</i>. | |
7427 * * <i>I</i> is listed in the implements clause of <i>J</i>. | |
7428 * * <i>I</i> is listed in the with clause of <i>J</i>. | |
7429 * * <i>J</i> is a mixin application of the mixin of <i>I</i>. | |
7430 * | |
7431 * | |
7432 * @param type the type being compared with this type | |
7433 * @return `true` if this type is a direct supertype of the given type | |
7434 */ | |
7435 bool isDirectSupertypeOf(InterfaceType type); | |
7436 | |
7437 /** | |
7438 * Return `true` if this type is more specific than the given type. An interfa
ce type | |
7439 * <i>T</i> is more specific than an interface type <i>S</i>, written <i>T &la
quo; S</i>, if one | |
7440 * of the following conditions is met: | |
7441 * | |
7442 * * Reflexivity: <i>T</i> is <i>S</i>. | |
7443 * * <i>T</i> is bottom. | |
7444 * * <i>S</i> is dynamic. | |
7445 * * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>. | |
7446 * * <i>T</i> is a type parameter and <i>S</i> is the upper bound of <i>T</i>. | |
7447 * * Covariance: <i>T</i> is of the form <i>I<T<sub>1</sub>, …, T<su
b>n</sub>></i> | |
7448 * and S</i> is of the form <i>I<S<sub>1</sub>, …, S<sub>n</sub>>
</i> and | |
7449 * <i>T<sub>i</sub> « S<sub>i</sub></i>, <i>1 <= i <= n</i>. | |
7450 * * Transitivity: <i>T « U</i> and <i>U « S</i>. | |
7451 * | |
7452 * | |
7453 * @param type the type being compared with this type | |
7454 * @return `true` if this type is more specific than the given type | |
7455 */ | |
7456 bool isMoreSpecificThan(Type2 type); | |
7457 | |
7458 /** | |
7459 * Return `true` if this type is a subtype of the given type. An interface typ
e <i>T</i> is | |
7460 * a subtype of an interface type <i>S</i>, written <i>T</i> <: <i>S</i>, iff | |
7461 * <i>[bottom/dynamic]T</i> « <i>S</i> (<i>T</i> is more specific than <
i>S</i>). If an | |
7462 * interface type <i>I</i> includes a method named <i>call()</i>, and the type
of <i>call()</i> is | |
7463 * the function type <i>F</i>, then <i>I</i> is considered to be a subtype of
<i>F</i>. | |
7464 * | |
7465 * @param type the type being compared with this type | |
7466 * @return `true` if this type is a subtype of the given type | |
7467 */ | |
7468 bool isSubtypeOf(Type2 type); | |
7469 | |
7470 /** | |
7471 * Return the element representing the constructor that results from looking u
p the given | |
7472 * constructor in this class with respect to the given library, or `null` if t
he look up | |
7473 * fails. The behavior of this method is defined by the Dart Language Specific
ation in section | |
7474 * 12.11.1: <blockquote>If <i>e</i> is of the form <b>new</b> <i>T.id()</i> th
en let <i>q<i> be | |
7475 * the constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<
i>. Otherwise, if | |
7476 * <i>q</i> is not defined or not accessible, a NoSuchMethodException is throw
n. </blockquote> | |
7477 * | |
7478 * @param constructorName the name of the constructor being looked up | |
7479 * @param library the library with respect to which the lookup is being perfor
med | |
7480 * @return the result of looking up the given constructor in this class with r
espect to the given | |
7481 * library | |
7482 */ | |
7483 ConstructorElement lookUpConstructor(String constructorName, LibraryElement li
brary); | |
7484 | |
7485 /** | |
7486 * Return the element representing the getter that results from looking up the
given getter in | |
7487 * this class with respect to the given library, or `null` if the look up fail
s. The | |
7488 * behavior of this method is defined by the Dart Language Specification in se
ction 12.15.1: | |
7489 * <blockquote>The result of looking up getter (respectively setter) <i>m</i>
in class <i>C</i> | |
7490 * with respect to library <i>L</i> is: | |
7491 * | |
7492 * * If <i>C</i> declares an instance getter (respectively setter) named <i>m<
/i> that is | |
7493 * accessible to <i>L</i>, then that getter (respectively setter) is the resul
t of the lookup. | |
7494 * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lo
okup is the result | |
7495 * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respec
t to <i>L</i>. | |
7496 * Otherwise, we say that the lookup has failed. | |
7497 * | |
7498 * </blockquote> | |
7499 * | |
7500 * @param getterName the name of the getter being looked up | |
7501 * @param library the library with respect to which the lookup is being perfor
med | |
7502 * @return the result of looking up the given getter in this class with respec
t to the given | |
7503 * library | |
7504 */ | |
7505 PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library
); | |
7506 | |
7507 /** | |
7508 * Return the element representing the getter that results from looking up the
given getter in the | |
7509 * superclass of this class with respect to the given library, or `null` if th
e look up | |
7510 * fails. The behavior of this method is defined by the Dart Language Specific
ation in section | |
7511 * 12.15.1: <blockquote>The result of looking up getter (respectively setter)
<i>m</i> in class | |
7512 * <i>C</i> with respect to library <i>L</i> is: | |
7513 * | |
7514 * * If <i>C</i> declares an instance getter (respectively setter) named <i>m<
/i> that is | |
7515 * accessible to <i>L</i>, then that getter (respectively setter) is the resul
t of the lookup. | |
7516 * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lo
okup is the result | |
7517 * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respec
t to <i>L</i>. | |
7518 * Otherwise, we say that the lookup has failed. | |
7519 * | |
7520 * </blockquote> | |
7521 * | |
7522 * @param getterName the name of the getter being looked up | |
7523 * @param library the library with respect to which the lookup is being perfor
med | |
7524 * @return the result of looking up the given getter in this class with respec
t to the given | |
7525 * library | |
7526 */ | |
7527 PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryEle
ment library); | |
7528 | |
7529 /** | |
7530 * Return the element representing the method that results from looking up the
given method in | |
7531 * this class with respect to the given library, or `null` if the look up fail
s. The | |
7532 * behavior of this method is defined by the Dart Language Specification in se
ction 12.15.1: | |
7533 * <blockquote> The result of looking up method <i>m</i> in class <i>C</i> wit
h respect to library | |
7534 * <i>L</i> is: | |
7535 * | |
7536 * * If <i>C</i> declares an instance method named <i>m</i> that is accessible
to <i>L</i>, then | |
7537 * that method is the result of the lookup. Otherwise, if <i>C</i> has a super
class <i>S</i>, then | |
7538 * the result of the lookup is the result of looking up method <i>m</i> in <i>
S</i> with respect | |
7539 * to <i>L</i>. Otherwise, we say that the lookup has failed. | |
7540 * | |
7541 * </blockquote> | |
7542 * | |
7543 * @param methodName the name of the method being looked up | |
7544 * @param library the library with respect to which the lookup is being perfor
med | |
7545 * @return the result of looking up the given method in this class with respec
t to the given | |
7546 * library | |
7547 */ | |
7548 MethodElement lookUpMethod(String methodName, LibraryElement library); | |
7549 | |
7550 /** | |
7551 * Return the element representing the method that results from looking up the
given method in the | |
7552 * superclass of this class with respect to the given library, or `null` if th
e look up | |
7553 * fails. The behavior of this method is defined by the Dart Language Specific
ation in section | |
7554 * 12.15.1: <blockquote> The result of looking up method <i>m</i> in class <i>
C</i> with respect | |
7555 * to library <i>L</i> is: | |
7556 * | |
7557 * * If <i>C</i> declares an instance method named <i>m</i> that is accessible
to <i>L</i>, then | |
7558 * that method is the result of the lookup. Otherwise, if <i>C</i> has a super
class <i>S</i>, then | |
7559 * the result of the lookup is the result of looking up method <i>m</i> in <i>
S</i> with respect | |
7560 * to <i>L</i>. Otherwise, we say that the lookup has failed. | |
7561 * | |
7562 * </blockquote> | |
7563 * | |
7564 * @param methodName the name of the method being looked up | |
7565 * @param library the library with respect to which the lookup is being perfor
med | |
7566 * @return the result of looking up the given method in this class with respec
t to the given | |
7567 * library | |
7568 */ | |
7569 MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement libra
ry); | |
7570 | |
7571 /** | |
7572 * Return the element representing the setter that results from looking up the
given setter in | |
7573 * this class with respect to the given library, or `null` if the look up fail
s. The | |
7574 * behavior of this method is defined by the Dart Language Specification in se
ction 12.16: | |
7575 * <blockquote> The result of looking up getter (respectively setter) <i>m</i>
in class <i>C</i> | |
7576 * with respect to library <i>L</i> is: | |
7577 * | |
7578 * * If <i>C</i> declares an instance getter (respectively setter) named <i>m<
/i> that is | |
7579 * accessible to <i>L</i>, then that getter (respectively setter) is the resul
t of the lookup. | |
7580 * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lo
okup is the result | |
7581 * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respec
t to <i>L</i>. | |
7582 * Otherwise, we say that the lookup has failed. | |
7583 * | |
7584 * </blockquote> | |
7585 * | |
7586 * @param setterName the name of the setter being looked up | |
7587 * @param library the library with respect to which the lookup is being perfor
med | |
7588 * @return the result of looking up the given setter in this class with respec
t to the given | |
7589 * library | |
7590 */ | |
7591 PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library
); | |
7592 | |
7593 /** | |
7594 * Return the element representing the setter that results from looking up the
given setter in the | |
7595 * superclass of this class with respect to the given library, or `null` if th
e look up | |
7596 * fails. The behavior of this method is defined by the Dart Language Specific
ation in section | |
7597 * 12.16: <blockquote> The result of looking up getter (respectively setter) <
i>m</i> in class | |
7598 * <i>C</i> with respect to library <i>L</i> is: | |
7599 * | |
7600 * * If <i>C</i> declares an instance getter (respectively setter) named <i>m<
/i> that is | |
7601 * accessible to <i>L</i>, then that getter (respectively setter) is the resul
t of the lookup. | |
7602 * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lo
okup is the result | |
7603 * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respec
t to <i>L</i>. | |
7604 * Otherwise, we say that the lookup has failed. | |
7605 * | |
7606 * </blockquote> | |
7607 * | |
7608 * @param setterName the name of the setter being looked up | |
7609 * @param library the library with respect to which the lookup is being perfor
med | |
7610 * @return the result of looking up the given setter in this class with respec
t to the given | |
7611 * library | |
7612 */ | |
7613 PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryEle
ment library); | |
7614 | |
7615 /** | |
7616 * Return the type resulting from substituting the given arguments for this ty
pe's parameters. | |
7617 * This is fully equivalent to `substitute(argumentTypes, getTypeArguments())`
. | |
7618 * | |
7619 * @param argumentTypes the actual type arguments being substituted for the ty
pe parameters | |
7620 * @return the result of performing the substitution | |
7621 */ | |
7622 InterfaceType substitute4(List<Type2> argumentTypes); | |
7623 InterfaceType substitute2(List<Type2> argumentTypes, List<Type2> parameterType
s); | |
7624 } | |
7625 /** | |
7626 * The interface `ParameterizedType` defines the behavior common to objects repr
esenting a | |
7627 * type with type parameters, such as a class or function type alias. | |
7628 * | |
7629 * @coverage dart.engine.type | |
7630 */ | |
7631 abstract class ParameterizedType implements Type2 { | |
7632 | |
7633 /** | |
7634 * Return an array containing the actual types of the type arguments. If this
type's element does | |
7635 * not have type parameters, then the array should be empty (although it is po
ssible for type | |
7636 * arguments to be erroneously declared). If the element has type parameters a
nd the actual type | |
7637 * does not explicitly include argument values, then the type "dynamic" will b
e automatically | |
7638 * provided. | |
7639 * | |
7640 * @return the actual types of the type arguments | |
7641 */ | |
7642 List<Type2> get typeArguments; | |
7643 | |
7644 /** | |
7645 * Return an array containing all of the type parameters declared for this typ
e. | |
7646 * | |
7647 * @return the type parameters declared for this type | |
7648 */ | |
7649 List<TypeParameterElement> get typeParameters; | |
7650 } | |
7651 /** | |
7652 * The interface `Type` defines the behavior of objects representing the declare
d type of | |
7653 * elements in the element model. | |
7654 * | |
7655 * @coverage dart.engine.type | |
7656 */ | |
7657 abstract class Type2 { | |
7658 | |
7659 /** | |
7660 * Return the name of this type as it should appear when presented to users in
contexts such as | |
7661 * error messages. | |
7662 * | |
7663 * @return the name of this type | |
7664 */ | |
7665 String get displayName; | |
7666 | |
7667 /** | |
7668 * Return the element representing the declaration of this type, or `null` if
the type has | |
7669 * not, or cannot, be associated with an element. The former case will occur i
f the element model | |
7670 * is not yet complete; the latter case will occur if this object represents a
n undefined type. | |
7671 * | |
7672 * @return the element representing the declaration of this type | |
7673 */ | |
7674 Element get element; | |
7675 | |
7676 /** | |
7677 * Return the least upper bound of this type and the given type, or `null` if
there is no | |
7678 * least upper bound. | |
7679 * | |
7680 * @param type the other type used to compute the least upper bound | |
7681 * @return the least upper bound of this type and the given type | |
7682 */ | |
7683 Type2 getLeastUpperBound(Type2 type); | |
7684 | |
7685 /** | |
7686 * Return the name of this type, or `null` if the type does not have a name, s
uch as when | |
7687 * the type represents the type of an unnamed function. | |
7688 * | |
7689 * @return the name of this type | |
7690 */ | |
7691 String get name; | |
7692 | |
7693 /** | |
7694 * Return `true` if this type is assignable to the given type. A type <i>T</i>
may be | |
7695 * assigned to a type <i>S</i>, written <i>T</i> ⇔ <i>S</i>, iff either <
i>T</i> <: <i>S</i> | |
7696 * or <i>S</i> <: <i>T</i>. | |
7697 * | |
7698 * @param type the type being compared with this type | |
7699 * @return `true` if this type is assignable to the given type | |
7700 */ | |
7701 bool isAssignableTo(Type2 type); | |
7702 | |
7703 /** | |
7704 * Return `true` if this type represents the bottom type. | |
7705 * | |
7706 * @return `true` if this type represents the bottom type | |
7707 */ | |
7708 bool get isBottom; | |
7709 | |
7710 /** | |
7711 * Return `true` if this type represents the type 'Function' defined in the da
rt:core | |
7712 * library. | |
7713 * | |
7714 * @return `true` if this type represents the type 'Function' defined in the d
art:core | |
7715 * library | |
7716 */ | |
7717 bool get isDartCoreFunction; | |
7718 | |
7719 /** | |
7720 * Return `true` if this type represents the type 'dynamic'. | |
7721 * | |
7722 * @return `true` if this type represents the type 'dynamic' | |
7723 */ | |
7724 bool get isDynamic; | |
7725 | |
7726 /** | |
7727 * Return `true` if this type is more specific than the given type. | |
7728 * | |
7729 * @param type the type being compared with this type | |
7730 * @return `true` if this type is more specific than the given type | |
7731 */ | |
7732 bool isMoreSpecificThan(Type2 type); | |
7733 | |
7734 /** | |
7735 * Return `true` if this type represents the type 'Object'. | |
7736 * | |
7737 * @return `true` if this type represents the type 'Object' | |
7738 */ | |
7739 bool get isObject; | |
7740 | |
7741 /** | |
7742 * Return `true` if this type is a subtype of the given type. | |
7743 * | |
7744 * @param type the type being compared with this type | |
7745 * @return `true` if this type is a subtype of the given type | |
7746 */ | |
7747 bool isSubtypeOf(Type2 type); | |
7748 | |
7749 /** | |
7750 * Return `true` if this type is a supertype of the given type. A type <i>S</i
> is a | |
7751 * supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff <i>T</i> is a subt
ype of <i>S</i>. | |
7752 * | |
7753 * @param type the type being compared with this type | |
7754 * @return `true` if this type is a supertype of the given type | |
7755 */ | |
7756 bool isSupertypeOf(Type2 type); | |
7757 | |
7758 /** | |
7759 * Return `true` if this type represents the type 'void'. | |
7760 * | |
7761 * @return `true` if this type represents the type 'void' | |
7762 */ | |
7763 bool get isVoid; | |
7764 | |
7765 /** | |
7766 * Return the type resulting from substituting the given arguments for the giv
en parameters in | |
7767 * this type. The specification defines this operation in section 2: <blockquo
te> The notation | |
7768 * <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ..., y<sub>n</sub>]E</
i> denotes a copy of | |
7769 * <i>E</i> in which all occurrences of <i>y<sub>i</sub>, 1 <= i <= n</i> have
been replaced with | |
7770 * <i>x<sub>i</sub></i>.</blockquote> Note that, contrary to the specification
, this method will | |
7771 * not create a copy of this type if no substitutions were required, but will
return this type | |
7772 * directly. | |
7773 * | |
7774 * @param argumentTypes the actual type arguments being substituted for the pa
rameters | |
7775 * @param parameterTypes the parameters to be replaced | |
7776 * @return the result of performing the substitution | |
7777 */ | |
7778 Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes); | |
7779 } | |
7780 /** | |
7781 * The interface `TypeParameterType` defines the behavior of objects representin
g the type | |
7782 * introduced by a type parameter. | |
7783 * | |
7784 * @coverage dart.engine.type | |
7785 */ | |
7786 abstract class TypeParameterType implements Type2 { | |
7787 TypeParameterElement get element; | |
7788 } | |
7789 /** | |
7790 * The interface `VoidType` defines the behavior of the unique object representi
ng the type | |
7791 * `void`. | |
7792 * | |
7793 * @coverage dart.engine.type | |
7794 */ | |
7795 abstract class VoidType implements Type2 { | |
7796 VoidType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes); | |
7797 } | |
OLD | NEW |