Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Side by Side Diff: pkg/analyzer-experimental/lib/src/generated/element.dart

Issue 12838003: Rename analyzer-experimental to analyzer_experimental. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
4 library engine.element;
5
6 import 'dart:collection';
7 import 'java_core.dart';
8 import 'java_engine.dart';
9 import 'source.dart';
10 import 'scanner.dart' show Keyword;
11 import 'ast.dart' show Identifier, LibraryIdentifier;
12 import 'html.dart' show XmlTagNode;
13 import 'engine.dart' show AnalysisContext;
14 import 'utilities_dart.dart';
15
16 /**
17 * The interface {@code Annotation} defines the behavior of objects representing a single annotation
18 * associated with an element.
19 * @coverage dart.engine.element
20 */
21 abstract class Annotation {
22 /**
23 * Return the element representing the field, variable, or const constructor b eing used as an
24 * annotation.
25 * @return the field, variable, or constructor being used as an annotation
26 */
27 Element get element;
28 }
29 /**
30 * The interface {@code ClassElement} defines the behavior of elements that repr esent a class.
31 * @coverage dart.engine.element
32 */
33 abstract class ClassElement implements Element {
34 /**
35 * Return an array containing all of the accessors (getters and setters) decla red in this class.
36 * @return the accessors declared in this class
37 */
38 List<PropertyAccessorElement> get accessors;
39 /**
40 * Return an array containing all the supertypes defined for this class and it s supertypes.
41 * @return all the supertypes of this class, including mixins
42 */
43 List<InterfaceType> get allSupertypes;
44 /**
45 * Return an array containing all of the constructors declared in this class.
46 * @return the constructors declared in this class
47 */
48 List<ConstructorElement> get constructors;
49 /**
50 * Return an array containing all of the fields declared in this class.
51 * @return the fields declared in this class
52 */
53 List<FieldElement> get fields;
54 /**
55 * Return an array containing all of the interfaces that are implemented by th is class.
56 * @return the interfaces that are implemented by this class
57 */
58 List<InterfaceType> get interfaces;
59 /**
60 * Return an array containing all of the methods declared in this class.
61 * @return the methods declared in this class
62 */
63 List<MethodElement> get methods;
64 /**
65 * Return an array containing all of the mixins that are applied to the class being extended in
66 * order to derive the superclass of this class.
67 * @return the mixins that are applied to derive the superclass of this class
68 */
69 List<InterfaceType> get mixins;
70 /**
71 * Return the named constructor declared in this class with the given name, or {@code null} if
72 * this class does not declare a named constructor with the given name.
73 * @param name the name of the constructor to be returned
74 * @return the element representing the specified constructor
75 */
76 ConstructorElement getNamedConstructor(String name);
77 /**
78 * Return the superclass of this class, or {@code null} if the class represent s the class
79 * 'Object'. All other classes will have a non-{@code null} superclass. If the superclass was not
80 * explicitly declared then the implicit superclass 'Object' will be returned.
81 * @return the superclass of this class
82 */
83 InterfaceType get supertype;
84 /**
85 * Return the type defined by the class.
86 * @return the type defined by the class
87 */
88 InterfaceType get type;
89 /**
90 * Return an array containing all of the type variables declared for this clas s.
91 * @return the type variables declared for this class
92 */
93 List<TypeVariableElement> get typeVariables;
94 /**
95 * Return the unnamed constructor declared in this class, or {@code null} if t his class does not
96 * declare an unnamed constructor but does declare named constructors. The ret urned constructor
97 * will be synthetic if this class does not declare any constructors, in which case it will
98 * represent the default constructor for the class.
99 * @return the unnamed constructor defined in this class
100 */
101 ConstructorElement get unnamedConstructor;
102 /**
103 * Return {@code true} if this class is abstract. A class is abstract if it ha s an explicit{@code abstract} modifier. Note, that this definition of <i>abstrac t</i> is different from
104 * <i>has unimplemented members</i>.
105 * @return {@code true} if this class is abstract
106 */
107 bool isAbstract();
108 /**
109 * Return {@code true} if this class is defined by a typedef construct.
110 * @return {@code true} if this class is defined by a typedef construct
111 */
112 bool isTypedef();
113 /**
114 * Return {@code true} if this class can validly be used as a mixin when defin ing another class.
115 * The behavior of this method is defined by the Dart Language Specification i n section 9:
116 * <blockquote>It is a compile-time error if a declared or derived mixin refer s to super. It is a
117 * compile-time error if a declared or derived mixin explicitly declares a con structor. It is a
118 * compile-time error if a mixin is derived from a class whose superclass is n ot
119 * Object.</blockquote>
120 * @return {@code true} if this class can validly be used as a mixin
121 */
122 bool isValidMixin();
123 /**
124 * Return the element representing the getter that results from looking up the given getter in
125 * this class with respect to the given library, or {@code null} if the look u p fails. The
126 * behavior of this method is defined by the Dart Language Specification in se ction 12.15.1:
127 * <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
128 * with respect to library <i>L</i> is:
129 * <ul>
130 * <li>If <i>C</i> declares an instance getter (respectively setter) named <i> m</i> that is
131 * accessible to <i>L</i>, then that getter (respectively setter) is the resul t of the lookup.
132 * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lo okup is the result
133 * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respec t to <i>L</i>.
134 * Otherwise, we say that the lookup has failed.</li>
135 * </ul>
136 * </blockquote>
137 * @param getterName the name of the getter being looked up
138 * @param library the library with respect to which the lookup is being perfor med
139 * @return the result of looking up the given getter in this class with respec t to the given
140 * library
141 */
142 PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library );
143 /**
144 * Return the element representing the method that results from looking up the given method in
145 * this class with respect to the given library, or {@code null} if the look u p fails. The
146 * behavior of this method is defined by the Dart Language Specification in se ction 12.15.1:
147 * <blockquote> The result of looking up method <i>m</i> in class <i>C</i> wit h respect to library
148 * <i>L</i> is:
149 * <ul>
150 * <li>If <i>C</i> declares an instance method named <i>m</i> that is accessib le to <i>L</i>, then
151 * that method is the result of the lookup. Otherwise, if <i>C</i> has a super class <i>S</i>, then
152 * the result of the lookup is the result of looking up method <i>m</i> in <i> S</i> with respect
153 * to <i>L</i>. Otherwise, we say that the lookup has failed.</li>
154 * </ul>
155 * </blockquote>
156 * @param methodName the name of the method being looked up
157 * @param library the library with respect to which the lookup is being perfor med
158 * @return the result of looking up the given method in this class with respec t to the given
159 * library
160 */
161 MethodElement lookUpMethod(String methodName, LibraryElement library);
162 /**
163 * Return the element representing the setter that results from looking up the given setter in
164 * this class with respect to the given library, or {@code null} if the look u p fails. The
165 * behavior of this method is defined by the Dart Language Specification in se ction 12.16:
166 * <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class <i>C</i>
167 * with respect to library <i>L</i> is:
168 * <ul>
169 * <li>If <i>C</i> declares an instance getter (respectively setter) named <i> m</i> that is
170 * accessible to <i>L</i>, then that getter (respectively setter) is the resul t of the lookup.
171 * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lo okup is the result
172 * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respec t to <i>L</i>.
173 * Otherwise, we say that the lookup has failed.</li>
174 * </ul>
175 * </blockquote>
176 * @param setterName the name of the setter being looked up
177 * @param library the library with respect to which the lookup is being perfor med
178 * @return the result of looking up the given setter in this class with respec t to the given
179 * library
180 */
181 PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library );
182 }
183 /**
184 * The interface {@code CompilationUnitElement} defines the behavior of elements representing a
185 * compilation unit.
186 * @coverage dart.engine.element
187 */
188 abstract class CompilationUnitElement implements Element {
189 /**
190 * Return an array containing all of the top-level accessors (getters and sett ers) contained in
191 * this compilation unit.
192 * @return the top-level accessors contained in this compilation unit
193 */
194 List<PropertyAccessorElement> get accessors;
195 /**
196 * Return the library in which this compilation unit is defined.
197 * @return the library in which this compilation unit is defined
198 */
199 LibraryElement get enclosingElement;
200 /**
201 * Return an array containing all of the top-level functions contained in this compilation unit.
202 * @return the top-level functions contained in this compilation unit
203 */
204 List<FunctionElement> get functions;
205 /**
206 * Return an array containing all of the top-level variables contained in this compilation unit.
207 * @return the top-level variables contained in this compilation unit
208 */
209 List<TopLevelVariableElement> get topLevelVariables;
210 /**
211 * Return an array containing all of the type aliases contained in this compil ation unit.
212 * @return the type aliases contained in this compilation unit
213 */
214 List<TypeAliasElement> get typeAliases;
215 /**
216 * Return an array containing all of the classes contained in this compilation unit.
217 * @return the classes contained in this compilation unit
218 */
219 List<ClassElement> get types;
220 }
221 /**
222 * The interface {@code ConstructorElement} defines the behavior of elements rep resenting a
223 * constructor or a factory method defined within a type.
224 * @coverage dart.engine.element
225 */
226 abstract class ConstructorElement implements ExecutableElement {
227 /**
228 * Return the type in which this constructor is defined.
229 * @return the type in which this constructor is defined
230 */
231 ClassElement get enclosingElement;
232 /**
233 * Return {@code true} if this constructor is a const constructor.
234 * @return {@code true} if this constructor is a const constructor
235 */
236 bool isConst();
237 /**
238 * Return {@code true} if this constructor represents a factory constructor.
239 * @return {@code true} if this constructor represents a factory constructor
240 */
241 bool isFactory();
242 }
243 /**
244 * The interface {@code Element} defines the behavior common to all of the eleme nts in the element
245 * model. Generally speaking, the element model is a semantic model of the progr am that represents
246 * things that are declared with a name and hence can be referenced elsewhere in the code.
247 * <p>
248 * There are two exceptions to the general case. First, there are elements in th e element model that
249 * are created for the convenience of various kinds of analysis but that do not have any
250 * corresponding declaration within the source code. Such elements are marked as being
251 * <i>synthetic</i>. Examples of synthetic elements include
252 * <ul>
253 * <li>default constructors in classes that do not define any explicit construct ors,
254 * <li>getters and setters that are induced by explicit field declarations,
255 * <li>fields that are induced by explicit declarations of getters and setters, and
256 * <li>functions representing the initialization expression for a variable.
257 * </ul>
258 * <p>
259 * Second, there are elements in the element model that do not have a name. Thes e correspond to
260 * unnamed functions and exist in order to more accurately represent the semanti c structure of the
261 * program.
262 * @coverage dart.engine.element
263 */
264 abstract class Element {
265 /**
266 * A comparator that can be used to sort elements by their name offset. Elemen ts with a smaller
267 * offset will be sorted to be before elements with a larger name offset.
268 */
269 static Comparator<Element> SORT_BY_OFFSET = (Element firstElement, Element sec ondElement) => firstElement.nameOffset - secondElement.nameOffset;
270 /**
271 * Use the given visitor to visit this element.
272 * @param visitor the visitor that will visit this element
273 * @return the value returned by the visitor as a result of visiting this elem ent
274 */
275 accept(ElementVisitor visitor);
276 /**
277 * Return the element of the given class that most immediately encloses this e lement, or{@code null} if there is no enclosing element of the given class.
278 * @param elementClass the class of the element to be returned
279 * @return the element that encloses this element
280 */
281 Element getAncestor(Type elementClass);
282 /**
283 * Return the analysis context in which this element is defined.
284 * @return the analysis context in which this element is defined
285 */
286 AnalysisContext get context;
287 /**
288 * Return the element that either physically or logically encloses this elemen t. This will be{@code null} if this element is a library because libraries are t he top-level elements in the
289 * model.
290 * @return the element that encloses this element
291 */
292 Element get enclosingElement;
293 /**
294 * Return the kind of element that this is.
295 * @return the kind of this element
296 */
297 ElementKind get kind;
298 /**
299 * Return the library that contains this element. This will be {@code null} if this element is a
300 * library or HTML file because libraries and HTML files are not contained in other libraries.
301 * @return the library that contains this element
302 */
303 LibraryElement get library;
304 /**
305 * Return an object representing the location of this element in the element m odel. The object can
306 * be used to locate this element at a later time.
307 * @return the location of this element in the element model
308 */
309 ElementLocation get location;
310 /**
311 * Return an array containing all of the metadata associated with this element .
312 * @return the metadata associated with this element
313 */
314 List<Annotation> get metadata;
315 /**
316 * Return the name of this element, or {@code null} if this element does not h ave a name.
317 * @return the name of this element
318 */
319 String get name;
320 /**
321 * Return the offset of the name of this element in the file that contains the declaration of this
322 * element, or {@code -1} if this element is synthetic, does not have a name, or otherwise does
323 * not have an offset.
324 * @return the offset of the name of this element
325 */
326 int get nameOffset;
327 /**
328 * Return the source that contains this element, or {@code null} if this eleme nt is not contained
329 * in a source.
330 * @return the source that contains this element
331 */
332 Source get source;
333 /**
334 * Return {@code true} if this element, assuming that it is within scope, is a ccessible to code in
335 * the given library. This is defined by the Dart Language Specification in se ction 3.2:
336 * <blockquote> A declaration <i>m</i> is accessible to library <i>L</i> if <i >m</i> is declared
337 * in <i>L</i> or if <i>m</i> is public. </blockquote>
338 * @param library the library in which a possible reference to this element wo uld occur
339 * @return {@code true} if this element is accessible to code in the given lib rary
340 */
341 bool isAccessibleIn(LibraryElement library);
342 /**
343 * Return {@code true} if this element is synthetic. A synthetic element is an element that is not
344 * represented in the source code explicitly, but is implied by the source cod e, such as the
345 * default constructor for a class that does not explicitly define any constru ctors.
346 * @return {@code true} if this element is synthetic
347 */
348 bool isSynthetic();
349 /**
350 * Use the given visitor to visit all of the children of this element. There i s no guarantee of
351 * the order in which the children will be visited.
352 * @param visitor the visitor that will be used to visit the children of this element
353 */
354 void visitChildren(ElementVisitor<Object> visitor);
355 }
356 /**
357 * The enumeration {@code ElementKind} defines the various kinds of elements in the element model.
358 * @coverage dart.engine.element
359 */
360 class ElementKind {
361 static final ElementKind CLASS = new ElementKind('CLASS', 0, "class");
362 static final ElementKind COMPILATION_UNIT = new ElementKind('COMPILATION_UNIT' , 1, "compilation unit");
363 static final ElementKind CONSTRUCTOR = new ElementKind('CONSTRUCTOR', 2, "cons tructor");
364 static final ElementKind DYNAMIC = new ElementKind('DYNAMIC', 3, "<dynamic>");
365 static final ElementKind EMBEDDED_HTML_SCRIPT = new ElementKind('EMBEDDED_HTML _SCRIPT', 4, "embedded html script");
366 static final ElementKind ERROR = new ElementKind('ERROR', 5, "<error>");
367 static final ElementKind EXPORT = new ElementKind('EXPORT', 6, "export directi ve");
368 static final ElementKind EXTERNAL_HTML_SCRIPT = new ElementKind('EXTERNAL_HTML _SCRIPT', 7, "external html script");
369 static final ElementKind FIELD = new ElementKind('FIELD', 8, "field");
370 static final ElementKind FUNCTION = new ElementKind('FUNCTION', 9, "function") ;
371 static final ElementKind GETTER = new ElementKind('GETTER', 10, "getter");
372 static final ElementKind HTML = new ElementKind('HTML', 11, "html");
373 static final ElementKind IMPORT = new ElementKind('IMPORT', 12, "import direct ive");
374 static final ElementKind LABEL = new ElementKind('LABEL', 13, "label");
375 static final ElementKind LIBRARY = new ElementKind('LIBRARY', 14, "library");
376 static final ElementKind LOCAL_VARIABLE = new ElementKind('LOCAL_VARIABLE', 15 , "local variable");
377 static final ElementKind METHOD = new ElementKind('METHOD', 16, "method");
378 static final ElementKind NAME = new ElementKind('NAME', 17, "<name>");
379 static final ElementKind PARAMETER = new ElementKind('PARAMETER', 18, "paramet er");
380 static final ElementKind PREFIX = new ElementKind('PREFIX', 19, "import prefix ");
381 static final ElementKind SETTER = new ElementKind('SETTER', 20, "setter");
382 static final ElementKind TOP_LEVEL_VARIABLE = new ElementKind('TOP_LEVEL_VARIA BLE', 21, "top level variable");
383 static final ElementKind TYPE_ALIAS = new ElementKind('TYPE_ALIAS', 22, "funct ion type alias");
384 static final ElementKind TYPE_VARIABLE = new ElementKind('TYPE_VARIABLE', 23, "type variable");
385 static final ElementKind UNIVERSE = new ElementKind('UNIVERSE', 24, "<universe >");
386 static final List<ElementKind> values = [CLASS, COMPILATION_UNIT, CONSTRUCTOR, DYNAMIC, EMBEDDED_HTML_SCRIPT, ERROR, EXPORT, EXTERNAL_HTML_SCRIPT, FIELD, FUNC TION, GETTER, HTML, IMPORT, LABEL, LIBRARY, LOCAL_VARIABLE, METHOD, NAME, PARAME TER, PREFIX, SETTER, TOP_LEVEL_VARIABLE, TYPE_ALIAS, TYPE_VARIABLE, UNIVERSE];
387 final String __name;
388 final int __ordinal;
389 int get ordinal => __ordinal;
390 String _displayName;
391 ElementKind(this.__name, this.__ordinal, String displayName) {
392 this._displayName = displayName;
393 }
394 /**
395 * @return the name of this {@link ElementKind} to display in UI.
396 */
397 String get displayName => _displayName;
398 String toString() => __name;
399 }
400 /**
401 * The interface {@code ElementLocation} defines the behavior of objects that re present the location
402 * of an element within the element model.
403 * @coverage dart.engine.element
404 */
405 abstract class ElementLocation {
406 /**
407 * Return an encoded representation of this location that can be used to creat e a location that is
408 * equal to this location.
409 * @return an encoded representation of this location
410 */
411 String get encoding;
412 }
413 /**
414 * The interface {@code ElementVisitor} defines the behavior of objects that can be used to visit an
415 * element structure.
416 * @coverage dart.engine.element
417 */
418 abstract class ElementVisitor<R> {
419 R visitClassElement(ClassElement element);
420 R visitCompilationUnitElement(CompilationUnitElement element);
421 R visitConstructorElement(ConstructorElement element);
422 R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element);
423 R visitExportElement(ExportElement element);
424 R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element);
425 R visitFieldElement(FieldElement element);
426 R visitFunctionElement(FunctionElement element);
427 R visitHtmlElement(HtmlElement element);
428 R visitImportElement(ImportElement element);
429 R visitLabelElement(LabelElement element);
430 R visitLibraryElement(LibraryElement element);
431 R visitLocalVariableElement(LocalVariableElement element);
432 R visitMethodElement(MethodElement element);
433 R visitMultiplyDefinedElement(MultiplyDefinedElement element);
434 R visitParameterElement(ParameterElement element);
435 R visitPrefixElement(PrefixElement element);
436 R visitPropertyAccessorElement(PropertyAccessorElement element);
437 R visitTopLevelVariableElement(TopLevelVariableElement element);
438 R visitTypeAliasElement(TypeAliasElement element);
439 R visitTypeVariableElement(TypeVariableElement element);
440 }
441 /**
442 * The interface {@code EmbeddedHtmlScriptElement} defines the behavior of eleme nts representing a
443 * script tag in an HTML file having content that defines a Dart library.
444 * @coverage dart.engine.element
445 */
446 abstract class EmbeddedHtmlScriptElement implements HtmlScriptElement {
447 /**
448 * Return the library element defined by the content of the script tag.
449 * @return the library element (not {@code null})
450 */
451 LibraryElement get scriptLibrary;
452 }
453 /**
454 * The interface {@code ExecutableElement} defines the behavior of elements repr esenting an
455 * executable object, including functions, methods, constructors, getters, and s etters.
456 * @coverage dart.engine.element
457 */
458 abstract class ExecutableElement implements Element {
459 /**
460 * Return an array containing all of the functions defined within this executa ble element.
461 * @return the functions defined within this executable element
462 */
463 List<FunctionElement> get functions;
464 /**
465 * Return an array containing all of the labels defined within this executable element.
466 * @return the labels defined within this executable element
467 */
468 List<LabelElement> get labels;
469 /**
470 * Return an array containing all of the local variables defined within this e xecutable element.
471 * @return the local variables defined within this executable element
472 */
473 List<LocalVariableElement> get localVariables;
474 /**
475 * Return an array containing all of the parameters defined by this executable element.
476 * @return the parameters defined by this executable element
477 */
478 List<ParameterElement> get parameters;
479 /**
480 * Return the type of function defined by this executable element.
481 * @return the type of function defined by this executable element
482 */
483 FunctionType get type;
484 /**
485 * Return {@code true} if this element is a static element. A static element i s an element that is
486 * not associated with a particular instance, but rather with an entire librar y or class.
487 * @return {@code true} if this executable element is a static element
488 */
489 bool isStatic();
490 }
491 /**
492 * The interface {@code ExportElement} defines the behavior of objects represent ing information
493 * about a single export directive within a library.
494 * @coverage dart.engine.element
495 */
496 abstract class ExportElement implements Element {
497 /**
498 * An empty array of export elements.
499 */
500 static List<ExportElement> EMPTY_ARRAY = new List<ExportElement>(0);
501 /**
502 * Return an array containing the combinators that were specified as part of t he export directive
503 * in the order in which they were specified.
504 * @return the combinators specified in the export directive
505 */
506 List<NamespaceCombinator> get combinators;
507 /**
508 * Return the library that is exported from this library by this export direct ive.
509 * @return the library that is exported from this library
510 */
511 LibraryElement get exportedLibrary;
512 }
513 /**
514 * The interface {@code ExternalHtmlScriptElement} defines the behavior of eleme nts representing a
515 * script tag in an HTML file having a {@code source} attribute that references a Dart library
516 * source file.
517 * @coverage dart.engine.element
518 */
519 abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
520 /**
521 * Return the source referenced by this element, or {@code null} if this eleme nt does not
522 * reference a Dart library source file.
523 * @return the source for the external Dart library
524 */
525 Source get scriptSource;
526 }
527 /**
528 * The interface {@code FieldElement} defines the behavior of elements represent ing a field defined
529 * within a type.
530 * @coverage dart.engine.element
531 */
532 abstract class FieldElement implements PropertyInducingElement {
533 /**
534 * Return the type in which this field is defined.
535 * @return the type in which this field is defined
536 */
537 ClassElement get enclosingElement;
538 }
539 /**
540 * The interface {@code FunctionElement} defines the behavior of elements repres enting a function.
541 * @coverage dart.engine.element
542 */
543 abstract class FunctionElement implements ExecutableElement, LocalElement {
544 }
545 /**
546 * The interface {@code HideCombinator} defines the behavior of combinators that cause some of the
547 * names in a namespace to be hidden when being imported.
548 * @coverage dart.engine.element
549 */
550 abstract class HideCombinator implements NamespaceCombinator {
551 /**
552 * Return an array containing the names that are not to be made visible in the importing library
553 * even if they are defined in the imported library.
554 * @return the names from the imported library that are hidden from the import ing library
555 */
556 List<String> get hiddenNames;
557 }
558 /**
559 * The interface {@code HtmlElement} defines the behavior of elements representi ng an HTML file.
560 * @coverage dart.engine.element
561 */
562 abstract class HtmlElement implements Element {
563 /**
564 * Return an array containing all of the script elements contained in the HTML file. This includes
565 * scripts with libraries that are defined by the content of a script tag as w ell as libraries
566 * that are referenced in the {@core source} attribute of a script tag.
567 * @return the script elements in the HTML file (not {@code null}, contains no {@code null}s)
568 */
569 List<HtmlScriptElement> get scripts;
570 }
571 /**
572 * The interface {@code HtmlScriptElement} defines the behavior of elements repr esenting a script
573 * tag in an HTML file.
574 * @see EmbeddedHtmlScriptElement
575 * @see ExternalHtmlScriptElement
576 * @coverage dart.engine.element
577 */
578 abstract class HtmlScriptElement implements Element {
579 }
580 /**
581 * The interface {@code ImportElement} defines the behavior of objects represent ing information
582 * about a single import directive within a library.
583 * @coverage dart.engine.element
584 */
585 abstract class ImportElement implements Element {
586 /**
587 * An empty array of import elements.
588 */
589 static List<ImportElement> EMPTY_ARRAY = new List<ImportElement>(0);
590 /**
591 * Return an array containing the combinators that were specified as part of t he import directive
592 * in the order in which they were specified.
593 * @return the combinators specified in the import directive
594 */
595 List<NamespaceCombinator> get combinators;
596 /**
597 * Return the library that is imported into this library by this import direct ive.
598 * @return the library that is imported into this library
599 */
600 LibraryElement get importedLibrary;
601 /**
602 * Return the prefix that was specified as part of the import directive, or {@ code null} if there
603 * was no prefix specified.
604 * @return the prefix that was specified as part of the import directive
605 */
606 PrefixElement get prefix;
607 }
608 /**
609 * The interface {@code LabelElement} defines the behavior of elements represent ing a label
610 * associated with a statement.
611 * @coverage dart.engine.element
612 */
613 abstract class LabelElement implements Element {
614 /**
615 * Return the executable element in which this label is defined.
616 * @return the executable element in which this label is defined
617 */
618 ExecutableElement get enclosingElement;
619 }
620 /**
621 * The interface {@code LibraryElement} defines the behavior of elements represe nting a library.
622 * @coverage dart.engine.element
623 */
624 abstract class LibraryElement implements Element {
625 /**
626 * Return the compilation unit that defines this library.
627 * @return the compilation unit that defines this library
628 */
629 CompilationUnitElement get definingCompilationUnit;
630 /**
631 * Return the entry point for this library, or {@code null} if this library do es not have an entry
632 * point. The entry point is defined to be a zero argument top-level function whose name is{@code main}.
633 * @return the entry point for this library
634 */
635 FunctionElement get entryPoint;
636 /**
637 * Return an array containing all of the libraries that are exported from this library.
638 * @return an array containing all of the libraries that are exported from thi s library
639 */
640 List<LibraryElement> get exportedLibraries;
641 /**
642 * Return an array containing all of the exports defined in this library.
643 * @return the exports defined in this library
644 */
645 List<ExportElement> get exports;
646 /**
647 * Return an array containing all of the libraries that are imported into this library. This
648 * includes all of the libraries that are imported using a prefix (also availa ble through the
649 * prefixes returned by {@link #getPrefixes()}) and those that are imported wi thout a prefix.
650 * @return an array containing all of the libraries that are imported into thi s library
651 */
652 List<LibraryElement> get importedLibraries;
653 /**
654 * Return an array containing all of the imports defined in this library.
655 * @return the imports defined in this library
656 */
657 List<ImportElement> get imports;
658 /**
659 * Return an array containing all of the compilation units that are included i n this library using
660 * a {@code part} directive. This does not include the defining compilation un it that contains the{@code part} directives.
661 * @return the compilation units that are included in this library
662 */
663 List<CompilationUnitElement> get parts;
664 /**
665 * Return an array containing elements for each of the prefixes used to {@code import} libraries
666 * into this library. Each prefix can be used in more than one {@code import} directive.
667 * @return the prefixes used to {@code import} libraries into this library
668 */
669 List<PrefixElement> get prefixes;
670 /**
671 * Answer {@code true} if this library is an application that can be run in th e browser.
672 * @return {@code true} if this library is an application that can be run in t he browser
673 */
674 bool isBrowserApplication();
675 /**
676 * Return {@code true} if this library is the dart:core library.
677 * @return {@code true} if this library is the dart:core library
678 */
679 bool isDartCore();
680 /**
681 * Return {@code true} if this library is up to date with respect to the given time stamp. If any
682 * transitively referenced Source is newer than the time stamp, this method re turns false.
683 * @param timeStamp the time stamp to compare against
684 * @return {@code true} if this library is up to date with respect to the give n time stamp
685 */
686 bool isUpToDate2(int timeStamp);
687 }
688 /**
689 * The interface {@code LocalElement} defines the behavior of elements that can be (but are not
690 * required to be) defined within a method or function (an {@link ExecutableElem ent}).
691 * @coverage dart.engine.element
692 */
693 abstract class LocalElement implements Element {
694 /**
695 * Return a source range that covers the approximate portion of the source in which the name of
696 * this element is visible, or {@code null} if there is no single range of cha racters within which
697 * the element name is visible.
698 * <ul>
699 * <li>For a local variable, this includes everything from the end of the vari able's initializer
700 * to the end of the block that encloses the variable declaration.</li>
701 * <li>For a parameter, this includes the body of the method or function that declares the
702 * parameter.</li>
703 * <li>For a local function, this includes everything from the beginning of th e function's body to
704 * the end of the block that encloses the function declaration.</li>
705 * <li>For top-level functions, {@code null} will be returned because they are potentially visible
706 * in multiple sources.</li>
707 * </ul>
708 * @return the range of characters in which the name of this element is visibl e
709 */
710 SourceRange get visibleRange;
711 }
712 /**
713 * The interface {@code LocalVariableElement} defines the behavior common to ele ments that represent
714 * a local variable.
715 * @coverage dart.engine.element
716 */
717 abstract class LocalVariableElement implements LocalElement, VariableElement {
718 }
719 /**
720 * The interface {@code MethodElement} defines the behavior of elements that rep resent a method
721 * defined within a type.
722 * @coverage dart.engine.element
723 */
724 abstract class MethodElement implements ExecutableElement {
725 /**
726 * Return the type in which this method is defined.
727 * @return the type in which this method is defined
728 */
729 ClassElement get enclosingElement;
730 /**
731 * Return {@code true} if this method is abstract. Methods are abstract if the y are not external
732 * and have no body.
733 * @return {@code true} if this method is abstract
734 */
735 bool isAbstract();
736 }
737 /**
738 * The interface {@code MultiplyDefinedElement} defines the behavior of pseudo-e lements that
739 * represent multiple elements defined within a single scope that have the same name. This situation
740 * is not allowed by the language, so objects implementing this interface always represent an error.
741 * As a result, most of the normal operations on elements do not make sense and will return useless
742 * results.
743 * @coverage dart.engine.element
744 */
745 abstract class MultiplyDefinedElement implements Element {
746 /**
747 * Return an array containing all of the elements that were defined within the scope to have the
748 * same name.
749 * @return the elements that were defined with the same name
750 */
751 List<Element> get conflictingElements;
752 }
753 /**
754 * The interface {@code NamespaceCombinator} defines the behavior common to obje cts that control how
755 * namespaces are combined.
756 * @coverage dart.engine.element
757 */
758 abstract class NamespaceCombinator {
759 /**
760 * An empty array of namespace combinators.
761 */
762 static List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombinator>(0 );
763 }
764 /**
765 * The interface {@code ParameterElement} defines the behavior of elements repre senting a parameter
766 * defined within an executable element.
767 * @coverage dart.engine.element
768 */
769 abstract class ParameterElement implements LocalElement, VariableElement {
770 /**
771 * Return the kind of this parameter.
772 * @return the kind of this parameter
773 */
774 ParameterKind get parameterKind;
775 /**
776 * Return {@code true} if this parameter is an initializing formal parameter.
777 * @return {@code true} if this parameter is an initializing formal parameter
778 */
779 bool isInitializingFormal();
780 }
781 /**
782 * The interface {@code PrefixElement} defines the behavior common to elements t hat represent a
783 * prefix used to import one or more libraries into another library.
784 * @coverage dart.engine.element
785 */
786 abstract class PrefixElement implements Element {
787 /**
788 * Return the library into which other libraries are imported using this prefi x.
789 * @return the library into which other libraries are imported using this pref ix
790 */
791 LibraryElement get enclosingElement;
792 /**
793 * Return an array containing all of the libraries that are imported using thi s prefix.
794 * @return the libraries that are imported using this prefix
795 */
796 List<LibraryElement> get importedLibraries;
797 }
798 /**
799 * The interface {@code PropertyAccessorElement} defines the behavior of element s representing a
800 * getter or a setter. Note that explicitly defined property accessors implicitl y define a synthetic
801 * field. Symmetrically, synthetic accessors are implicitly created for explicit ly defined fields.
802 * The following rules apply:
803 * <ul>
804 * <li>Every explicit field is represented by a non-synthetic {@link FieldElemen t}.
805 * <li>Every explicit field induces a getter and possibly a setter, both of whic h are represented by
806 * synthetic {@link PropertyAccessorElement}s.
807 * <li>Every explicit getter or setter is represented by a non-synthetic{@link P ropertyAccessorElement}.
808 * <li>Every explicit getter or setter (or pair thereof if they have the same na me) induces a field
809 * that is represented by a synthetic {@link FieldElement}.
810 * </ul>
811 * @coverage dart.engine.element
812 */
813 abstract class PropertyAccessorElement implements ExecutableElement {
814 /**
815 * Return the field or top-level variable associated with this accessor. If th is accessor was
816 * explicitly defined (is not synthetic) then the variable associated with it will be synthetic.
817 * @return the variable associated with this accessor
818 */
819 PropertyInducingElement get variable;
820 /**
821 * Return {@code true} if this accessor represents a getter.
822 * @return {@code true} if this accessor represents a getter
823 */
824 bool isGetter();
825 /**
826 * Return {@code true} if this accessor represents a setter.
827 * @return {@code true} if this accessor represents a setter
828 */
829 bool isSetter();
830 }
831 /**
832 * The interface {@code PropertyInducingElement} defines the behavior of element s representing a
833 * variable that has an associated getter and possibly a setter. Note that expli citly defined
834 * variables implicitly define a synthetic getter and that non-{@code final} exp licitly defined
835 * variables implicitly define a synthetic setter. Symmetrically, synthetic fiel ds are implicitly
836 * created for explicitly defined getters and setters. The following rules apply :
837 * <ul>
838 * <li>Every explicit variable is represented by a non-synthetic {@link Property InducingElement}.
839 * <li>Every explicit variable induces a getter and possibly a setter, both of w hich are represented
840 * by synthetic {@link PropertyAccessorElement}s.
841 * <li>Every explicit getter or setter is represented by a non-synthetic{@link P ropertyAccessorElement}.
842 * <li>Every explicit getter or setter (or pair thereof if they have the same na me) induces a
843 * variable that is represented by a synthetic {@link PropertyInducingElement}.
844 * </ul>
845 * @coverage dart.engine.element
846 */
847 abstract class PropertyInducingElement implements VariableElement {
848 /**
849 * Return the getter associated with this variable. If this variable was expli citly defined (is
850 * not synthetic) then the getter associated with it will be synthetic.
851 * @return the getter associated with this variable
852 */
853 PropertyAccessorElement get getter;
854 /**
855 * Return the setter associated with this variable, or {@code null} if the var iable is effectively{@code final} and therefore does not have a setter associate d with it. (This can happen either
856 * because the variable is explicitly defined as being {@code final} or becaus e the variable is
857 * induced by an explicit getter that does not have a corresponding setter.) I f this variable was
858 * explicitly defined (is not synthetic) then the setter associated with it wi ll be synthetic.
859 * @return the setter associated with this variable
860 */
861 PropertyAccessorElement get setter;
862 /**
863 * Return {@code true} if this element is a static element. A static element i s an element that is
864 * not associated with a particular instance, but rather with an entire librar y or class.
865 * @return {@code true} if this executable element is a static element
866 */
867 bool isStatic();
868 }
869 /**
870 * The interface {@code ShowCombinator} defines the behavior of combinators that cause some of the
871 * names in a namespace to be visible (and the rest hidden) when being imported.
872 * @coverage dart.engine.element
873 */
874 abstract class ShowCombinator implements NamespaceCombinator {
875 /**
876 * Return an array containing the names that are to be made visible in the imp orting library if
877 * they are defined in the imported library.
878 * @return the names from the imported library that are visible in the importi ng library
879 */
880 List<String> get shownNames;
881 }
882 /**
883 * The interface {@code TopLevelVariableElement} defines the behavior of element s representing a
884 * top-level variable.
885 * @coverage dart.engine.element
886 */
887 abstract class TopLevelVariableElement implements PropertyInducingElement {
888 }
889 /**
890 * The interface {@code TypeAliasElement} defines the behavior of elements repre senting a type alias
891 * ({@code typedef}).
892 * @coverage dart.engine.element
893 */
894 abstract class TypeAliasElement implements Element {
895 /**
896 * Return the compilation unit in which this type alias is defined.
897 * @return the compilation unit in which this type alias is defined
898 */
899 CompilationUnitElement get enclosingElement;
900 /**
901 * Return an array containing all of the parameters defined by this type alias .
902 * @return the parameters defined by this type alias
903 */
904 List<ParameterElement> get parameters;
905 /**
906 * Return the type of function defined by this type alias.
907 * @return the type of function defined by this type alias
908 */
909 FunctionType get type;
910 /**
911 * Return an array containing all of the type variables defined for this type.
912 * @return the type variables defined for this type
913 */
914 List<TypeVariableElement> get typeVariables;
915 }
916 /**
917 * The interface {@code TypeVariableElement} defines the behavior of elements re presenting a type
918 * variable.
919 * @coverage dart.engine.element
920 */
921 abstract class TypeVariableElement implements Element {
922 /**
923 * Return the type representing the bound associated with this variable, or {@ code null} if this
924 * variable does not have an explicit bound.
925 * @return the type representing the bound associated with this variable
926 */
927 Type2 get bound;
928 /**
929 * Return the type defined by this type variable.
930 * @return the type defined by this type variable
931 */
932 TypeVariableType get type;
933 }
934 /**
935 * The interface {@code UndefinedElement} defines the behavior of pseudo-element s that represent
936 * names that are undefined. This situation is not allowed by the language, so o bjects implementing
937 * this interface always represent an error. As a result, most of the normal ope rations on elements
938 * do not make sense and will return useless results.
939 * @coverage dart.engine.element
940 */
941 abstract class UndefinedElement implements Element {
942 }
943 /**
944 * The interface {@code VariableElement} defines the behavior common to elements that represent a
945 * variable.
946 * @coverage dart.engine.element
947 */
948 abstract class VariableElement implements Element {
949 /**
950 * Return a synthetic function representing this variable's initializer, or {@ code null} if this
951 * variable does not have an initializer. The function will have no parameters . The return type of
952 * the function will be the compile-time type of the initialization expression .
953 * @return a synthetic function representing this variable's initializer
954 */
955 FunctionElement get initializer;
956 /**
957 * Return the declared type of this variable, or {@code null} if the variable did not have a
958 * declared type (such as if it was declared using the keyword 'var').
959 * @return the declared type of this variable
960 */
961 Type2 get type;
962 /**
963 * Return {@code true} if this variable was declared with the 'const' modifier .
964 * @return {@code true} if this variable was declared with the 'const' modifie r
965 */
966 bool isConst();
967 /**
968 * Return {@code true} if this variable was declared with the 'final' modifier . Variables that are
969 * declared with the 'const' modifier will return {@code false} even though th ey are implicitly
970 * final.
971 * @return {@code true} if this variable was declared with the 'final' modifie r
972 */
973 bool isFinal();
974 }
975 /**
976 * Instances of the class {@code GeneralizingElementVisitor} implement an elemen t visitor that will
977 * recursively visit all of the elements in an element model (like instances of the class{@link RecursiveElementVisitor}). In addition, when an element of a spe cific type is visited not
978 * only will the visit method for that specific type of element be invoked, but additional methods
979 * for the supertypes of that element will also be invoked. For example, using a n instance of this
980 * class to visit a {@link MethodElement} will cause the method{@link #visitMeth odElement(MethodElement)} to be invoked but will also cause the methods{@link #v isitExecutableElement(ExecutableElement)} and {@link #visitElement(Element)} to be
981 * subsequently invoked. This allows visitors to be written that visit all execu table elements
982 * without needing to override the visit method for each of the specific subclas ses of{@link ExecutableElement}.
983 * <p>
984 * Note, however, that unlike many visitors, element visitors visit objects base d on the interfaces
985 * implemented by those elements. Because interfaces form a graph structure rath er than a tree
986 * structure the way classes do, and because it is generally undesirable for an object to be visited
987 * more than once, this class flattens the interface graph into a pseudo-tree. I n particular, this
988 * class treats elements as if the element types were structured in the followin g way:
989 * <p>
990 * <pre>
991 * Element
992 * ClassElement
993 * CompilationUnitElement
994 * ExecutableElement
995 * ConstructorElement
996 * LocalElement
997 * FunctionElement
998 * MethodElement
999 * PropertyAccessorElement
1000 * ExportElement
1001 * HtmlElement
1002 * ImportElement
1003 * LabelElement
1004 * LibraryElement
1005 * MultiplyDefinedElement
1006 * PrefixElement
1007 * TypeAliasElement
1008 * TypeVariableElement
1009 * UndefinedElement
1010 * VariableElement
1011 * PropertyInducingElement
1012 * FieldElement
1013 * TopLevelVariableElement
1014 * LocalElement
1015 * LocalVariableElement
1016 * ParameterElement
1017 * </pre>
1018 * <p>
1019 * Subclasses that override a visit method must either invoke the overridden vis it method or
1020 * explicitly invoke the more general visit method. Failure to do so will cause the visit methods
1021 * for superclasses of the element to not be invoked and will cause the children of the visited node
1022 * to not be visited.
1023 * @coverage dart.engine.element
1024 */
1025 class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
1026 R visitClassElement(ClassElement element) => visitElement(element);
1027 R visitCompilationUnitElement(CompilationUnitElement element) => visitElement( element);
1028 R visitConstructorElement(ConstructorElement element) => visitExecutableElemen t(element);
1029 R visitElement(Element element) {
1030 element.visitChildren(this);
1031 return null;
1032 }
1033 R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => visitHt mlScriptElement(element);
1034 R visitExecutableElement(ExecutableElement element) => visitElement(element);
1035 R visitExportElement(ExportElement element) => visitElement(element);
1036 R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => visitHt mlScriptElement(element);
1037 R visitFieldElement(FieldElement element) => visitPropertyInducingElement(elem ent);
1038 R visitFunctionElement(FunctionElement element) => visitLocalElement(element);
1039 R visitHtmlElement(HtmlElement element) => visitElement(element);
1040 R visitHtmlScriptElement(HtmlScriptElement element) => visitElement(element);
1041 R visitImportElement(ImportElement element) => visitElement(element);
1042 R visitLabelElement(LabelElement element) => visitElement(element);
1043 R visitLibraryElement(LibraryElement element) => visitElement(element);
1044 R visitLocalElement(LocalElement element) {
1045 if (element is LocalVariableElement) {
1046 return visitVariableElement((element as LocalVariableElement));
1047 } else if (element is ParameterElement) {
1048 return visitVariableElement((element as ParameterElement));
1049 } else if (element is FunctionElement) {
1050 return visitExecutableElement((element as FunctionElement));
1051 }
1052 return null;
1053 }
1054 R visitLocalVariableElement(LocalVariableElement element) => visitLocalElement (element);
1055 R visitMethodElement(MethodElement element) => visitExecutableElement(element) ;
1056 R visitMultiplyDefinedElement(MultiplyDefinedElement element) => visitElement( element);
1057 R visitParameterElement(ParameterElement element) => visitLocalElement(element );
1058 R visitPrefixElement(PrefixElement element) => visitElement(element);
1059 R visitPropertyAccessorElement(PropertyAccessorElement element) => visitExecut ableElement(element);
1060 R visitPropertyInducingElement(PropertyInducingElement element) => visitVariab leElement(element);
1061 R visitTopLevelVariableElement(TopLevelVariableElement element) => visitProper tyInducingElement(element);
1062 R visitTypeAliasElement(TypeAliasElement element) => visitElement(element);
1063 R visitTypeVariableElement(TypeVariableElement element) => visitElement(elemen t);
1064 R visitVariableElement(VariableElement element) => visitElement(element);
1065 }
1066 /**
1067 * Instances of the class {@code RecursiveElementVisitor} implement an element v isitor that will
1068 * recursively visit all of the element in an element model. For example, using an instance of this
1069 * class to visit a {@link CompilationUnitElement} will also cause all of the ty pes in the
1070 * compilation unit to be visited.
1071 * <p>
1072 * Subclasses that override a visit method must either invoke the overridden vis it method or must
1073 * explicitly ask the visited element to visit its children. Failure to do so wi ll cause the
1074 * children of the visited element to not be visited.
1075 * @coverage dart.engine.element
1076 */
1077 class RecursiveElementVisitor<R> implements ElementVisitor<R> {
1078 R visitClassElement(ClassElement element) {
1079 element.visitChildren(this);
1080 return null;
1081 }
1082 R visitCompilationUnitElement(CompilationUnitElement element) {
1083 element.visitChildren(this);
1084 return null;
1085 }
1086 R visitConstructorElement(ConstructorElement element) {
1087 element.visitChildren(this);
1088 return null;
1089 }
1090 R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) {
1091 element.visitChildren(this);
1092 return null;
1093 }
1094 R visitExportElement(ExportElement element) {
1095 element.visitChildren(this);
1096 return null;
1097 }
1098 R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) {
1099 element.visitChildren(this);
1100 return null;
1101 }
1102 R visitFieldElement(FieldElement element) {
1103 element.visitChildren(this);
1104 return null;
1105 }
1106 R visitFunctionElement(FunctionElement element) {
1107 element.visitChildren(this);
1108 return null;
1109 }
1110 R visitHtmlElement(HtmlElement element) {
1111 element.visitChildren(this);
1112 return null;
1113 }
1114 R visitImportElement(ImportElement element) {
1115 element.visitChildren(this);
1116 return null;
1117 }
1118 R visitLabelElement(LabelElement element) {
1119 element.visitChildren(this);
1120 return null;
1121 }
1122 R visitLibraryElement(LibraryElement element) {
1123 element.visitChildren(this);
1124 return null;
1125 }
1126 R visitLocalVariableElement(LocalVariableElement element) {
1127 element.visitChildren(this);
1128 return null;
1129 }
1130 R visitMethodElement(MethodElement element) {
1131 element.visitChildren(this);
1132 return null;
1133 }
1134 R visitMultiplyDefinedElement(MultiplyDefinedElement element) {
1135 element.visitChildren(this);
1136 return null;
1137 }
1138 R visitParameterElement(ParameterElement element) {
1139 element.visitChildren(this);
1140 return null;
1141 }
1142 R visitPrefixElement(PrefixElement element) {
1143 element.visitChildren(this);
1144 return null;
1145 }
1146 R visitPropertyAccessorElement(PropertyAccessorElement element) {
1147 element.visitChildren(this);
1148 return null;
1149 }
1150 R visitTopLevelVariableElement(TopLevelVariableElement element) {
1151 element.visitChildren(this);
1152 return null;
1153 }
1154 R visitTypeAliasElement(TypeAliasElement element) {
1155 element.visitChildren(this);
1156 return null;
1157 }
1158 R visitTypeVariableElement(TypeVariableElement element) {
1159 element.visitChildren(this);
1160 return null;
1161 }
1162 }
1163 /**
1164 * Instances of the class {@code SimpleElementVisitor} implement an element visi tor that will do
1165 * nothing when visiting an element. It is intended to be a superclass for class es that use the
1166 * visitor pattern primarily as a dispatch mechanism (and hence don't need to re cursively visit a
1167 * whole structure) and that only need to visit a small number of element types.
1168 * @coverage dart.engine.element
1169 */
1170 class SimpleElementVisitor<R> implements ElementVisitor<R> {
1171 R visitClassElement(ClassElement element) => null;
1172 R visitCompilationUnitElement(CompilationUnitElement element) => null;
1173 R visitConstructorElement(ConstructorElement element) => null;
1174 R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) => null;
1175 R visitExportElement(ExportElement element) => null;
1176 R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) => null;
1177 R visitFieldElement(FieldElement element) => null;
1178 R visitFunctionElement(FunctionElement element) => null;
1179 R visitHtmlElement(HtmlElement element) => null;
1180 R visitImportElement(ImportElement element) => null;
1181 R visitLabelElement(LabelElement element) => null;
1182 R visitLibraryElement(LibraryElement element) => null;
1183 R visitLocalVariableElement(LocalVariableElement element) => null;
1184 R visitMethodElement(MethodElement element) => null;
1185 R visitMultiplyDefinedElement(MultiplyDefinedElement element) => null;
1186 R visitParameterElement(ParameterElement element) => null;
1187 R visitPrefixElement(PrefixElement element) => null;
1188 R visitPropertyAccessorElement(PropertyAccessorElement element) => null;
1189 R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
1190 R visitTypeAliasElement(TypeAliasElement element) => null;
1191 R visitTypeVariableElement(TypeVariableElement element) => null;
1192 }
1193 /**
1194 * Instances of the class {@code AnnotationImpl} implement an {@link Annotation} .
1195 * @coverage dart.engine.element
1196 */
1197 class AnnotationImpl implements Annotation {
1198 /**
1199 * The element representing the field, variable, or constructor being used as an annotation.
1200 */
1201 Element _element;
1202 /**
1203 * An empty array of annotations.
1204 */
1205 static List<AnnotationImpl> EMPTY_ARRAY = new List<AnnotationImpl>(0);
1206 /**
1207 * Initialize a newly created annotation.
1208 * @param element the element representing the field, variable, or constructor being used as an
1209 * annotation
1210 */
1211 AnnotationImpl(Element element) {
1212 this._element = element;
1213 }
1214 Element get element => _element;
1215 String toString() => "@${_element.toString()}";
1216 }
1217 /**
1218 * Instances of the class {@code ClassElementImpl} implement a {@code ClassEleme nt}.
1219 * @coverage dart.engine.element
1220 */
1221 class ClassElementImpl extends ElementImpl implements ClassElement {
1222 /**
1223 * An array containing all of the accessors (getters and setters) contained in this class.
1224 */
1225 List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_A RRAY;
1226 /**
1227 * An array containing all of the constructors contained in this class.
1228 */
1229 List<ConstructorElement> _constructors = ConstructorElementImpl.EMPTY_ARRAY;
1230 /**
1231 * An array containing all of the fields contained in this class.
1232 */
1233 List<FieldElement> _fields = FieldElementImpl.EMPTY_ARRAY;
1234 /**
1235 * An array containing all of the mixins that are applied to the class being e xtended in order to
1236 * derive the superclass of this class.
1237 */
1238 List<InterfaceType> _mixins = InterfaceTypeImpl.EMPTY_ARRAY;
1239 /**
1240 * An array containing all of the interfaces that are implemented by this clas s.
1241 */
1242 List<InterfaceType> _interfaces = InterfaceTypeImpl.EMPTY_ARRAY;
1243 /**
1244 * An array containing all of the methods contained in this class.
1245 */
1246 List<MethodElement> _methods = MethodElementImpl.EMPTY_ARRAY;
1247 /**
1248 * The superclass of the class, or {@code null} if the class does not have an explicit superclass.
1249 */
1250 InterfaceType _supertype;
1251 /**
1252 * The type defined by the class.
1253 */
1254 InterfaceType _type;
1255 /**
1256 * An array containing all of the type variables defined for this class.
1257 */
1258 List<TypeVariableElement> _typeVariables = TypeVariableElementImpl.EMPTY_ARRAY ;
1259 /**
1260 * An empty array of type elements.
1261 */
1262 static List<ClassElement> EMPTY_ARRAY = new List<ClassElement>(0);
1263 /**
1264 * Initialize a newly created class element to have the given name.
1265 * @param name the name of this element
1266 */
1267 ClassElementImpl(Identifier name) : super.con1(name) {
1268 }
1269 accept(ElementVisitor visitor) => visitor.visitClassElement(this);
1270 List<PropertyAccessorElement> get accessors => _accessors;
1271 List<InterfaceType> get allSupertypes {
1272 Collection<InterfaceType> list = new Set<InterfaceType>();
1273 collectAllSupertypes(list);
1274 return new List.from(list);
1275 }
1276 ElementImpl getChild(String identifier25) {
1277 for (PropertyAccessorElement accessor in _accessors) {
1278 if (((accessor as PropertyAccessorElementImpl)).identifier == identifier25 ) {
1279 return accessor as PropertyAccessorElementImpl;
1280 }
1281 }
1282 for (ConstructorElement constructor in _constructors) {
1283 if (((constructor as ConstructorElementImpl)).identifier == identifier25) {
1284 return constructor as ConstructorElementImpl;
1285 }
1286 }
1287 for (FieldElement field in _fields) {
1288 if (((field as FieldElementImpl)).identifier == identifier25) {
1289 return field as FieldElementImpl;
1290 }
1291 }
1292 for (MethodElement method in _methods) {
1293 if (((method as MethodElementImpl)).identifier == identifier25) {
1294 return method as MethodElementImpl;
1295 }
1296 }
1297 for (TypeVariableElement typeVariable in _typeVariables) {
1298 if (((typeVariable as TypeVariableElementImpl)).identifier == identifier25 ) {
1299 return typeVariable as TypeVariableElementImpl;
1300 }
1301 }
1302 return null;
1303 }
1304 List<ConstructorElement> get constructors => _constructors;
1305 List<FieldElement> get fields => _fields;
1306 List<InterfaceType> get interfaces => _interfaces;
1307 ElementKind get kind => ElementKind.CLASS;
1308 List<MethodElement> get methods => _methods;
1309 List<InterfaceType> get mixins => _mixins;
1310 ConstructorElement getNamedConstructor(String name23) {
1311 for (ConstructorElement element in constructors) {
1312 String elementName = element.name;
1313 if (elementName != null && elementName == name23) {
1314 return element;
1315 }
1316 }
1317 return null;
1318 }
1319 InterfaceType get supertype => _supertype;
1320 InterfaceType get type => _type;
1321 List<TypeVariableElement> get typeVariables => _typeVariables;
1322 ConstructorElement get unnamedConstructor {
1323 for (ConstructorElement element in constructors) {
1324 String name10 = element.name;
1325 if (name10 == null || name10.isEmpty) {
1326 return element;
1327 }
1328 }
1329 return null;
1330 }
1331 bool isAbstract() => hasModifier(Modifier.ABSTRACT);
1332 bool isTypedef() => hasModifier(Modifier.TYPEDEF);
1333 bool isValidMixin() => hasModifier(Modifier.MIXIN);
1334 PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library ) {
1335 PropertyAccessorElement element = getGetter(getterName);
1336 if (element != null && element.isAccessibleIn(library)) {
1337 return element;
1338 }
1339 for (InterfaceType mixin in _mixins) {
1340 ClassElement mixinElement = mixin.element;
1341 if (mixinElement != null) {
1342 element = ((mixinElement as ClassElementImpl)).getGetter(getterName);
1343 if (element != null && element.isAccessibleIn(library)) {
1344 return element;
1345 }
1346 }
1347 }
1348 if (_supertype != null) {
1349 ClassElement supertypeElement = _supertype.element;
1350 if (supertypeElement != null) {
1351 element = supertypeElement.lookUpGetter(getterName, library);
1352 if (element != null && element.isAccessibleIn(library)) {
1353 return element;
1354 }
1355 }
1356 }
1357 return null;
1358 }
1359 MethodElement lookUpMethod(String methodName, LibraryElement library) {
1360 MethodElement element = getMethod(methodName);
1361 if (element != null && element.isAccessibleIn(library)) {
1362 return element;
1363 }
1364 for (InterfaceType mixin in _mixins) {
1365 ClassElement mixinElement = mixin.element;
1366 if (mixinElement != null) {
1367 element = ((mixinElement as ClassElementImpl)).getMethod(methodName);
1368 if (element != null && element.isAccessibleIn(library)) {
1369 return element;
1370 }
1371 }
1372 }
1373 if (_supertype != null) {
1374 ClassElement supertypeElement = _supertype.element;
1375 if (supertypeElement != null) {
1376 element = supertypeElement.lookUpMethod(methodName, library);
1377 if (element != null && element.isAccessibleIn(library)) {
1378 return element;
1379 }
1380 }
1381 }
1382 return null;
1383 }
1384 PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library ) {
1385 PropertyAccessorElement element = getSetter(setterName);
1386 if (element != null && element.isAccessibleIn(library)) {
1387 return element;
1388 }
1389 for (InterfaceType mixin in _mixins) {
1390 ClassElement mixinElement = mixin.element;
1391 if (mixinElement != null) {
1392 element = ((mixinElement as ClassElementImpl)).getSetter(setterName);
1393 if (element != null && element.isAccessibleIn(library)) {
1394 return element;
1395 }
1396 }
1397 }
1398 if (_supertype != null) {
1399 ClassElement supertypeElement = _supertype.element;
1400 if (supertypeElement != null) {
1401 element = supertypeElement.lookUpSetter(setterName, library);
1402 if (element != null && element.isAccessibleIn(library)) {
1403 return element;
1404 }
1405 }
1406 }
1407 return null;
1408 }
1409 /**
1410 * Set whether this class is abstract to correspond to the given value.
1411 * @param isAbstract {@code true} if the class is abstract
1412 */
1413 void set abstract(bool isAbstract) {
1414 setModifier(Modifier.ABSTRACT, isAbstract);
1415 }
1416 /**
1417 * Set the accessors contained in this class to the given accessors.
1418 * @param accessors the accessors contained in this class
1419 */
1420 void set accessors(List<PropertyAccessorElement> accessors2) {
1421 for (PropertyAccessorElement accessor in accessors2) {
1422 ((accessor as PropertyAccessorElementImpl)).enclosingElement = this;
1423 }
1424 this._accessors = accessors2;
1425 }
1426 /**
1427 * Set the constructors contained in this class to the given constructors.
1428 * @param constructors the constructors contained in this class
1429 */
1430 void set constructors(List<ConstructorElement> constructors2) {
1431 for (ConstructorElement constructor in constructors2) {
1432 ((constructor as ConstructorElementImpl)).enclosingElement = this;
1433 }
1434 this._constructors = constructors2;
1435 }
1436 /**
1437 * Set the fields contained in this class to the given fields.
1438 * @param fields the fields contained in this class
1439 */
1440 void set fields(List<FieldElement> fields2) {
1441 for (FieldElement field in fields2) {
1442 ((field as FieldElementImpl)).enclosingElement = this;
1443 }
1444 this._fields = fields2;
1445 }
1446 /**
1447 * Set the interfaces that are implemented by this class to the given types.
1448 * @param the interfaces that are implemented by this class
1449 */
1450 void set interfaces(List<InterfaceType> interfaces2) {
1451 this._interfaces = interfaces2;
1452 }
1453 /**
1454 * Set the methods contained in this class to the given methods.
1455 * @param methods the methods contained in this class
1456 */
1457 void set methods(List<MethodElement> methods2) {
1458 for (MethodElement method in methods2) {
1459 ((method as MethodElementImpl)).enclosingElement = this;
1460 }
1461 this._methods = methods2;
1462 }
1463 /**
1464 * Set the mixins that are applied to the class being extended in order to der ive the superclass
1465 * of this class to the given types.
1466 * @param mixins the mixins that are applied to derive the superclass of this class
1467 */
1468 void set mixins(List<InterfaceType> mixins2) {
1469 this._mixins = mixins2;
1470 }
1471 /**
1472 * Set the superclass of the class to the given type.
1473 * @param supertype the superclass of the class
1474 */
1475 void set supertype(InterfaceType supertype2) {
1476 this._supertype = supertype2;
1477 }
1478 /**
1479 * Set the type defined by the class to the given type.
1480 * @param type the type defined by the class
1481 */
1482 void set type(InterfaceType type5) {
1483 this._type = type5;
1484 }
1485 /**
1486 * Set whether this class is defined by a typedef construct to correspond to t he given value.
1487 * @param isTypedef {@code true} if the class is defined by a typedef construc t
1488 */
1489 void set typedef(bool isTypedef) {
1490 setModifier(Modifier.TYPEDEF, isTypedef);
1491 }
1492 /**
1493 * Set the type variables defined for this class to the given type variables.
1494 * @param typeVariables the type variables defined for this class
1495 */
1496 void set typeVariables(List<TypeVariableElement> typeVariables2) {
1497 for (TypeVariableElement typeVariable in typeVariables2) {
1498 ((typeVariable as TypeVariableElementImpl)).enclosingElement = this;
1499 }
1500 this._typeVariables = typeVariables2;
1501 }
1502 /**
1503 * Set whether this class is a valid mixin to correspond to the given value.
1504 * @param isValidMixin {@code true} if this class can be used as a mixin
1505 */
1506 void set validMixin(bool isValidMixin) {
1507 setModifier(Modifier.MIXIN, isValidMixin);
1508 }
1509 void visitChildren(ElementVisitor<Object> visitor) {
1510 super.visitChildren(visitor);
1511 safelyVisitChildren(_accessors, visitor);
1512 safelyVisitChildren(_constructors, visitor);
1513 safelyVisitChildren(_fields, visitor);
1514 safelyVisitChildren(_methods, visitor);
1515 safelyVisitChildren(_typeVariables, visitor);
1516 }
1517 void appendTo(JavaStringBuilder builder) {
1518 String name11 = name;
1519 if (name11 == null) {
1520 builder.append("{unnamed class}");
1521 } else {
1522 builder.append(name11);
1523 }
1524 int variableCount = _typeVariables.length;
1525 if (variableCount > 0) {
1526 builder.append("<");
1527 for (int i = 0; i < variableCount; i++) {
1528 if (i > 0) {
1529 builder.append(", ");
1530 }
1531 ((_typeVariables[i] as TypeVariableElementImpl)).appendTo(builder);
1532 }
1533 builder.append(">");
1534 }
1535 }
1536 void collectAllSupertypes(Collection<InterfaceType> list) {
1537 if (_supertype == null || list.contains(_supertype)) {
1538 return;
1539 }
1540 list.add(_supertype);
1541 ((_supertype.element as ClassElementImpl)).collectAllSupertypes(list);
1542 for (InterfaceType type in interfaces) {
1543 if (!list.contains(type)) {
1544 list.add(type);
1545 ((type.element as ClassElementImpl)).collectAllSupertypes(list);
1546 }
1547 }
1548 for (InterfaceType type in mixins) {
1549 if (!list.contains(type)) {
1550 list.add(type);
1551 }
1552 }
1553 }
1554 /**
1555 * Return the element representing the getter with the given name that is decl ared in this class,
1556 * or {@code null} if this class does not declare a getter with the given name .
1557 * @param getterName the name of the getter to be returned
1558 * @return the getter declared in this class with the given name
1559 */
1560 PropertyAccessorElement getGetter(String getterName) {
1561 for (PropertyAccessorElement accessor in _accessors) {
1562 if (accessor.isGetter() && accessor.name == getterName) {
1563 return accessor;
1564 }
1565 }
1566 return null;
1567 }
1568 /**
1569 * Return the element representing the method with the given name that is decl ared in this class,
1570 * or {@code null} if this class does not declare a method with the given name .
1571 * @param methodName the name of the method to be returned
1572 * @return the method declared in this class with the given name
1573 */
1574 MethodElement getMethod(String methodName) {
1575 for (MethodElement method in _methods) {
1576 if (method.name == methodName) {
1577 return method;
1578 }
1579 }
1580 return null;
1581 }
1582 /**
1583 * Return the element representing the setter with the given name that is decl ared in this class,
1584 * or {@code null} if this class does not declare a setter with the given name .
1585 * @param setterName the name of the getter to be returned
1586 * @return the getter declared in this class with the given name
1587 */
1588 PropertyAccessorElement getSetter(String setterName) {
1589 for (PropertyAccessorElement accessor in _accessors) {
1590 if (accessor.isSetter() && accessor.name == setterName) {
1591 return accessor;
1592 }
1593 }
1594 return null;
1595 }
1596 }
1597 /**
1598 * Instances of the class {@code CompilationUnitElementImpl} implement a{@link C ompilationUnitElement}.
1599 * @coverage dart.engine.element
1600 */
1601 class CompilationUnitElementImpl extends ElementImpl implements CompilationUnitE lement {
1602 /**
1603 * An array containing all of the top-level accessors (getters and setters) co ntained in this
1604 * compilation unit.
1605 */
1606 List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_A RRAY;
1607 /**
1608 * An array containing all of the top-level functions contained in this compil ation unit.
1609 */
1610 List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
1611 /**
1612 * An array containing all of the variables contained in this compilation unit .
1613 */
1614 List<TopLevelVariableElement> _variables = TopLevelVariableElementImpl.EMPTY_A RRAY;
1615 /**
1616 * The source that corresponds to this compilation unit.
1617 */
1618 Source _source;
1619 /**
1620 * An array containing all of the type aliases contained in this compilation u nit.
1621 */
1622 List<TypeAliasElement> _typeAliases = TypeAliasElementImpl.EMPTY_ARRAY;
1623 /**
1624 * An array containing all of the types contained in this compilation unit.
1625 */
1626 List<ClassElement> _types = ClassElementImpl.EMPTY_ARRAY;
1627 /**
1628 * An empty array of compilation unit elements.
1629 */
1630 static List<CompilationUnitElement> EMPTY_ARRAY = new List<CompilationUnitElem ent>(0);
1631 /**
1632 * Initialize a newly created compilation unit element to have the given name.
1633 * @param name the name of this element
1634 */
1635 CompilationUnitElementImpl(String name) : super.con2(name, -1) {
1636 }
1637 accept(ElementVisitor visitor) => visitor.visitCompilationUnitElement(this);
1638 bool operator ==(Object object) => identical(runtimeType, object.runtimeType) && _source == ((object as CompilationUnitElementImpl)).source;
1639 List<PropertyAccessorElement> get accessors => _accessors;
1640 ElementImpl getChild(String identifier26) {
1641 for (PropertyAccessorElement accessor in _accessors) {
1642 if (((accessor as PropertyAccessorElementImpl)).identifier == identifier26 ) {
1643 return accessor as PropertyAccessorElementImpl;
1644 }
1645 }
1646 for (VariableElement variable in _variables) {
1647 if (((variable as VariableElementImpl)).identifier == identifier26) {
1648 return variable as VariableElementImpl;
1649 }
1650 }
1651 for (ExecutableElement function in _functions) {
1652 if (((function as ExecutableElementImpl)).identifier == identifier26) {
1653 return function as ExecutableElementImpl;
1654 }
1655 }
1656 for (TypeAliasElement typeAlias in _typeAliases) {
1657 if (((typeAlias as TypeAliasElementImpl)).identifier == identifier26) {
1658 return typeAlias as TypeAliasElementImpl;
1659 }
1660 }
1661 for (ClassElement type in _types) {
1662 if (((type as ClassElementImpl)).identifier == identifier26) {
1663 return type as ClassElementImpl;
1664 }
1665 }
1666 return null;
1667 }
1668 LibraryElement get enclosingElement => super.enclosingElement as LibraryElemen t;
1669 List<FunctionElement> get functions => _functions;
1670 String get identifier => source.fullName;
1671 ElementKind get kind => ElementKind.COMPILATION_UNIT;
1672 Source get source => _source;
1673 List<TopLevelVariableElement> get topLevelVariables => _variables;
1674 List<TypeAliasElement> get typeAliases => _typeAliases;
1675 List<ClassElement> get types => _types;
1676 int get hashCode => _source.hashCode;
1677 /**
1678 * Set the top-level accessors (getters and setters) contained in this compila tion unit to the
1679 * given accessors.
1680 * @param the top-level accessors (getters and setters) contained in this comp ilation unit
1681 */
1682 void set accessors(List<PropertyAccessorElement> accessors3) {
1683 for (PropertyAccessorElement accessor in accessors3) {
1684 ((accessor as PropertyAccessorElementImpl)).enclosingElement = this;
1685 }
1686 this._accessors = accessors3;
1687 }
1688 /**
1689 * Set the top-level functions contained in this compilation unit to the given functions.
1690 * @param functions the top-level functions contained in this compilation unit
1691 */
1692 void set functions(List<FunctionElement> functions2) {
1693 for (FunctionElement function in functions2) {
1694 ((function as FunctionElementImpl)).enclosingElement = this;
1695 }
1696 this._functions = functions2;
1697 }
1698 /**
1699 * Set the source that corresponds to this compilation unit to the given sourc e.
1700 * @param source the source that corresponds to this compilation unit
1701 */
1702 void set source(Source source5) {
1703 this._source = source5;
1704 }
1705 /**
1706 * Set the top-level variables contained in this compilation unit to the given variables.
1707 * @param variables the top-level variables contained in this compilation unit
1708 */
1709 void set topLevelVariables(List<TopLevelVariableElement> variables2) {
1710 for (TopLevelVariableElement field in variables2) {
1711 ((field as TopLevelVariableElementImpl)).enclosingElement = this;
1712 }
1713 this._variables = variables2;
1714 }
1715 /**
1716 * Set the type aliases contained in this compilation unit to the given type a liases.
1717 * @param typeAliases the type aliases contained in this compilation unit
1718 */
1719 void set typeAliases(List<TypeAliasElement> typeAliases2) {
1720 for (TypeAliasElement typeAlias in typeAliases2) {
1721 ((typeAlias as TypeAliasElementImpl)).enclosingElement = this;
1722 }
1723 this._typeAliases = typeAliases2;
1724 }
1725 /**
1726 * Set the types contained in this compilation unit to the given types.
1727 * @param types types contained in this compilation unit
1728 */
1729 void set types(List<ClassElement> types2) {
1730 for (ClassElement type in types2) {
1731 ((type as ClassElementImpl)).enclosingElement = this;
1732 }
1733 this._types = types2;
1734 }
1735 void visitChildren(ElementVisitor<Object> visitor) {
1736 super.visitChildren(visitor);
1737 safelyVisitChildren(_accessors, visitor);
1738 safelyVisitChildren(_functions, visitor);
1739 safelyVisitChildren(_typeAliases, visitor);
1740 safelyVisitChildren(_types, visitor);
1741 safelyVisitChildren(_variables, visitor);
1742 }
1743 void appendTo(JavaStringBuilder builder) {
1744 if (_source == null) {
1745 builder.append("{compilation unit}");
1746 } else {
1747 builder.append(_source.fullName);
1748 }
1749 }
1750 }
1751 /**
1752 * Instances of the class {@code ConstructorElementImpl} implement a {@code Cons tructorElement}.
1753 * @coverage dart.engine.element
1754 */
1755 class ConstructorElementImpl extends ExecutableElementImpl implements Constructo rElement {
1756 /**
1757 * An empty array of constructor elements.
1758 */
1759 static List<ConstructorElement> EMPTY_ARRAY = new List<ConstructorElement>(0);
1760 /**
1761 * Initialize a newly created constructor element to have the given name.
1762 * @param name the name of this element
1763 */
1764 ConstructorElementImpl(Identifier name) : super.con1(name) {
1765 }
1766 accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
1767 ClassElement get enclosingElement => super.enclosingElement as ClassElement;
1768 ElementKind get kind => ElementKind.CONSTRUCTOR;
1769 bool isConst() => hasModifier(Modifier.CONST);
1770 bool isFactory() => hasModifier(Modifier.FACTORY);
1771 bool isStatic() => false;
1772 /**
1773 * Set whether this constructor represents a factory method to the given value .
1774 * @param isFactory {@code true} if this constructor represents a factory meth od
1775 */
1776 void set factory(bool isFactory) {
1777 setModifier(Modifier.FACTORY, isFactory);
1778 }
1779 void appendTo(JavaStringBuilder builder) {
1780 builder.append(enclosingElement.name);
1781 String name12 = name;
1782 if (name12 != null && !name12.isEmpty) {
1783 builder.append(".");
1784 builder.append(name12);
1785 }
1786 super.appendTo(builder);
1787 }
1788 }
1789 /**
1790 * Instances of the class {@code DynamicElementImpl} represent the synthetic ele ment representing
1791 * the declaration of the type {@code dynamic}.
1792 * @coverage dart.engine.element
1793 */
1794 class DynamicElementImpl extends ElementImpl {
1795 /**
1796 * Return the unique instance of this class.
1797 * @return the unique instance of this class
1798 */
1799 static DynamicElementImpl get instance => DynamicTypeImpl.instance.element as DynamicElementImpl;
1800 /**
1801 * The type defined by this element.
1802 */
1803 DynamicTypeImpl _type;
1804 /**
1805 * Initialize a newly created instance of this class. Instances of this class should <b>not</b> be
1806 * created except as part of creating the type associated with this element. T he single instance
1807 * of this class should be accessed through the method {@link #getInstance()}.
1808 */
1809 DynamicElementImpl() : super.con2(Keyword.DYNAMIC.syntax, -1) {
1810 setModifier(Modifier.SYNTHETIC, true);
1811 }
1812 accept(ElementVisitor visitor) => null;
1813 ElementKind get kind => ElementKind.DYNAMIC;
1814 /**
1815 * Return the type defined by this element.
1816 * @return the type defined by this element
1817 */
1818 DynamicTypeImpl get type => _type;
1819 /**
1820 * Set the type defined by this element to the given type.
1821 * @param type the type defined by this element
1822 */
1823 void set type(DynamicTypeImpl type6) {
1824 this._type = type6;
1825 }
1826 }
1827 /**
1828 * The abstract class {@code ElementImpl} implements the behavior common to obje cts that implement
1829 * an {@link Element}.
1830 * @coverage dart.engine.element
1831 */
1832 abstract class ElementImpl implements Element {
1833 /**
1834 * The enclosing element of this element, or {@code null} if this element is a t the root of the
1835 * element structure.
1836 */
1837 ElementImpl _enclosingElement;
1838 /**
1839 * The name of this element.
1840 */
1841 String _name;
1842 /**
1843 * The offset of the name of this element in the file that contains the declar ation of this
1844 * element.
1845 */
1846 int _nameOffset = 0;
1847 /**
1848 * A bit-encoded form of the modifiers associated with this element.
1849 */
1850 Set<Modifier> _modifiers;
1851 /**
1852 * An array containing all of the metadata associated with this element.
1853 */
1854 List<Annotation> _metadata = AnnotationImpl.EMPTY_ARRAY;
1855 /**
1856 * Initialize a newly created element to have the given name.
1857 * @param name the name of this element
1858 */
1859 ElementImpl.con1(Identifier name24) {
1860 _jtd_constructor_161_impl(name24);
1861 }
1862 _jtd_constructor_161_impl(Identifier name24) {
1863 _jtd_constructor_162_impl(name24 == null ? "" : name24.name, name24 == null ? -1 : name24.offset);
1864 }
1865 /**
1866 * Initialize a newly created element to have the given name.
1867 * @param name the name of this element
1868 * @param nameOffset the offset of the name of this element in the file that c ontains the
1869 * declaration of this element
1870 */
1871 ElementImpl.con2(String name8, int nameOffset2) {
1872 _jtd_constructor_162_impl(name8, nameOffset2);
1873 }
1874 _jtd_constructor_162_impl(String name8, int nameOffset2) {
1875 this._name = name8;
1876 this._nameOffset = nameOffset2;
1877 this._modifiers = new Set();
1878 }
1879 bool operator ==(Object object) => object != null && identical(object.runtimeT ype, runtimeType) && ((object as Element)).location == location;
1880 Element getAncestor(Type elementClass) {
1881 Element ancestor = _enclosingElement;
1882 while (ancestor != null && !isInstanceOf(ancestor, elementClass)) {
1883 ancestor = ancestor.enclosingElement;
1884 }
1885 return ancestor as Element;
1886 }
1887 /**
1888 * Return the child of this element that is uniquely identified by the given i dentifier, or{@code null} if there is no such child.
1889 * @param identifier the identifier used to select a child
1890 * @return the child of this element with the given identifier
1891 */
1892 ElementImpl getChild(String identifier) => null;
1893 AnalysisContext get context {
1894 if (_enclosingElement == null) {
1895 return null;
1896 }
1897 return _enclosingElement.context;
1898 }
1899 Element get enclosingElement => _enclosingElement;
1900 LibraryElement get library => getAncestor(LibraryElement);
1901 ElementLocation get location => new ElementLocationImpl.con1(this);
1902 List<Annotation> get metadata => _metadata;
1903 String get name => _name;
1904 int get nameOffset => _nameOffset;
1905 Source get source {
1906 if (_enclosingElement == null) {
1907 return null;
1908 }
1909 return _enclosingElement.source;
1910 }
1911 int get hashCode => location.hashCode;
1912 bool isAccessibleIn(LibraryElement library20) {
1913 if (Identifier.isPrivateName(_name)) {
1914 return library20 == library;
1915 }
1916 return true;
1917 }
1918 bool isSynthetic() => hasModifier(Modifier.SYNTHETIC);
1919 /**
1920 * Set the metadata associate with this element to the given array of annotati ons.
1921 * @param metadata the metadata to be associated with this element
1922 */
1923 void set metadata(List<Annotation> metadata2) {
1924 this._metadata = metadata2;
1925 }
1926 /**
1927 * Set whether this element is synthetic to correspond to the given value.
1928 * @param isSynthetic {@code true} if the element is synthetic
1929 */
1930 void set synthetic(bool isSynthetic) {
1931 setModifier(Modifier.SYNTHETIC, isSynthetic);
1932 }
1933 String toString() {
1934 JavaStringBuilder builder = new JavaStringBuilder();
1935 appendTo(builder);
1936 return builder.toString();
1937 }
1938 void visitChildren(ElementVisitor<Object> visitor) {
1939 }
1940 /**
1941 * Append a textual representation of this type to the given builder.
1942 * @param builder the builder to which the text is to be appended
1943 */
1944 void appendTo(JavaStringBuilder builder) {
1945 if (_name == null) {
1946 builder.append("<unnamed ");
1947 builder.append(runtimeType.toString());
1948 builder.append(">");
1949 } else {
1950 builder.append(_name);
1951 }
1952 }
1953 /**
1954 * Return an identifier that uniquely identifies this element among the childr en of this element's
1955 * parent.
1956 * @return an identifier that uniquely identifies this element relative to its parent
1957 */
1958 String get identifier => name;
1959 /**
1960 * Return {@code true} if this element has the given modifier associated with it.
1961 * @param modifier the modifier being tested for
1962 * @return {@code true} if this element has the given modifier associated with it
1963 */
1964 bool hasModifier(Modifier modifier) => _modifiers.contains(modifier);
1965 /**
1966 * If the given child is not {@code null}, use the given visitor to visit it.
1967 * @param child the child to be visited
1968 * @param visitor the visitor to be used to visit the child
1969 */
1970 void safelyVisitChild(Element child, ElementVisitor<Object> visitor) {
1971 if (child != null) {
1972 child.accept(visitor);
1973 }
1974 }
1975 /**
1976 * Use the given visitor to visit all of the children in the given array.
1977 * @param children the children to be visited
1978 * @param visitor the visitor being used to visit the children
1979 */
1980 void safelyVisitChildren(List<Element> children, ElementVisitor<Object> visito r) {
1981 if (children != null) {
1982 for (Element child in children) {
1983 child.accept(visitor);
1984 }
1985 }
1986 }
1987 /**
1988 * Set the enclosing element of this element to the given element.
1989 * @param element the enclosing element of this element
1990 */
1991 void set enclosingElement(ElementImpl element) {
1992 _enclosingElement = element;
1993 }
1994 /**
1995 * Set whether the given modifier is associated with this element to correspon d to the given
1996 * value.
1997 * @param modifier the modifier to be set
1998 * @param value {@code true} if the modifier is to be associated with this ele ment
1999 */
2000 void setModifier(Modifier modifier, bool value) {
2001 if (value) {
2002 _modifiers.add(modifier);
2003 } else {
2004 _modifiers.remove(modifier);
2005 }
2006 }
2007 }
2008 /**
2009 * Instances of the class {@code ElementLocationImpl} implement an {@link Elemen tLocation}.
2010 * @coverage dart.engine.element
2011 */
2012 class ElementLocationImpl implements ElementLocation {
2013 /**
2014 * The path to the element whose location is represented by this object.
2015 */
2016 List<String> _components;
2017 /**
2018 * The character used to separate components in the encoded form.
2019 */
2020 static int _SEPARATOR_CHAR = 0x3B;
2021 /**
2022 * Initialize a newly created location to represent the given element.
2023 * @param element the element whose location is being represented
2024 */
2025 ElementLocationImpl.con1(Element element) {
2026 _jtd_constructor_163_impl(element);
2027 }
2028 _jtd_constructor_163_impl(Element element) {
2029 List<String> components = new List<String>();
2030 Element ancestor = element;
2031 while (ancestor != null) {
2032 components.insertRange(0, 1, ((ancestor as ElementImpl)).identifier);
2033 ancestor = ancestor.enclosingElement;
2034 }
2035 this._components = new List.from(components);
2036 }
2037 /**
2038 * Initialize a newly created location from the given encoded form.
2039 * @param encoding the encoded form of a location
2040 */
2041 ElementLocationImpl.con2(String encoding) {
2042 _jtd_constructor_164_impl(encoding);
2043 }
2044 _jtd_constructor_164_impl(String encoding) {
2045 this._components = decode(encoding);
2046 }
2047 bool operator ==(Object object) {
2048 if (object is! ElementLocationImpl) {
2049 return false;
2050 }
2051 ElementLocationImpl location = object as ElementLocationImpl;
2052 return JavaArrays.equals(_components, location._components);
2053 }
2054 /**
2055 * Return the path to the element whose location is represented by this object .
2056 * @return the path to the element whose location is represented by this objec t
2057 */
2058 List<String> get components => _components;
2059 String get encoding {
2060 JavaStringBuilder builder = new JavaStringBuilder();
2061 int length2 = _components.length;
2062 for (int i = 0; i < length2; i++) {
2063 if (i > 0) {
2064 builder.appendChar(_SEPARATOR_CHAR);
2065 }
2066 encode(builder, _components[i]);
2067 }
2068 return builder.toString();
2069 }
2070 int get hashCode => JavaArrays.makeHashCode(_components);
2071 String toString() => encoding;
2072 /**
2073 * Decode the encoded form of a location into an array of components.
2074 * @param encoding the encoded form of a location
2075 * @return the components that were encoded
2076 */
2077 List<String> decode(String encoding) {
2078 List<String> components = new List<String>();
2079 JavaStringBuilder builder = new JavaStringBuilder();
2080 int index = 0;
2081 int length3 = encoding.length;
2082 while (index < length3) {
2083 int currentChar = encoding.codeUnitAt(index);
2084 if (currentChar == _SEPARATOR_CHAR) {
2085 if (index + 1 < length3 && encoding.codeUnitAt(index + 1) == _SEPARATOR_ CHAR) {
2086 builder.appendChar(_SEPARATOR_CHAR);
2087 index += 2;
2088 } else {
2089 components.add(builder.toString());
2090 builder.length = 0;
2091 index++;
2092 }
2093 } else {
2094 builder.appendChar(currentChar);
2095 index++;
2096 }
2097 }
2098 if (builder.length > 0) {
2099 components.add(builder.toString());
2100 }
2101 return new List.from(components);
2102 }
2103 /**
2104 * Append an encoded form of the given component to the given builder.
2105 * @param builder the builder to which the encoded component is to be appended
2106 * @param component the component to be appended to the builder
2107 */
2108 void encode(JavaStringBuilder builder, String component) {
2109 int length4 = component.length;
2110 for (int i = 0; i < length4; i++) {
2111 int currentChar = component.codeUnitAt(i);
2112 if (currentChar == _SEPARATOR_CHAR) {
2113 builder.appendChar(_SEPARATOR_CHAR);
2114 }
2115 builder.appendChar(currentChar);
2116 }
2117 }
2118 }
2119 /**
2120 * Instances of the class {@code EmbeddedHtmlScriptElementImpl} implement an{@li nk EmbeddedHtmlScriptElement}.
2121 * @coverage dart.engine.element
2122 */
2123 class EmbeddedHtmlScriptElementImpl extends HtmlScriptElementImpl implements Emb eddedHtmlScriptElement {
2124 /**
2125 * The library defined by the script tag's content.
2126 */
2127 LibraryElement _scriptLibrary;
2128 /**
2129 * Initialize a newly created script element to have the specified tag name an d offset.
2130 * @param node the XML node from which this element is derived (not {@code nul l})
2131 */
2132 EmbeddedHtmlScriptElementImpl(XmlTagNode node) : super(node) {
2133 }
2134 accept(ElementVisitor visitor) => visitor.visitEmbeddedHtmlScriptElement(this) ;
2135 ElementKind get kind => ElementKind.EMBEDDED_HTML_SCRIPT;
2136 LibraryElement get scriptLibrary => _scriptLibrary;
2137 /**
2138 * Set the script library defined by the script tag's content.
2139 * @param scriptLibrary the library or {@code null} if none
2140 */
2141 void set scriptLibrary(LibraryElementImpl scriptLibrary2) {
2142 scriptLibrary2.enclosingElement = this;
2143 this._scriptLibrary = scriptLibrary2;
2144 }
2145 void visitChildren(ElementVisitor<Object> visitor) {
2146 safelyVisitChild(_scriptLibrary, visitor);
2147 }
2148 }
2149 /**
2150 * The abstract class {@code ExecutableElementImpl} implements the behavior comm on to{@code ExecutableElement}s.
2151 * @coverage dart.engine.element
2152 */
2153 abstract class ExecutableElementImpl extends ElementImpl implements ExecutableEl ement {
2154 /**
2155 * An array containing all of the functions defined within this executable ele ment.
2156 */
2157 List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
2158 /**
2159 * An array containing all of the labels defined within this executable elemen t.
2160 */
2161 List<LabelElement> _labels = LabelElementImpl.EMPTY_ARRAY;
2162 /**
2163 * An array containing all of the local variables defined within this executab le element.
2164 */
2165 List<LocalVariableElement> _localVariables = LocalVariableElementImpl.EMPTY_AR RAY;
2166 /**
2167 * An array containing all of the parameters defined by this executable elemen t.
2168 */
2169 List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
2170 /**
2171 * The type of function defined by this executable element.
2172 */
2173 FunctionType _type;
2174 /**
2175 * An empty array of executable elements.
2176 */
2177 static List<ExecutableElement> EMPTY_ARRAY = new List<ExecutableElement>(0);
2178 /**
2179 * Initialize a newly created executable element to have the given name.
2180 * @param name the name of this element
2181 */
2182 ExecutableElementImpl.con1(Identifier name) : super.con1(name) {
2183 _jtd_constructor_166_impl(name);
2184 }
2185 _jtd_constructor_166_impl(Identifier name) {
2186 }
2187 /**
2188 * Initialize a newly created executable element to have the given name.
2189 * @param name the name of this element
2190 * @param nameOffset the offset of the name of this element in the file that c ontains the
2191 * declaration of this element
2192 */
2193 ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nam eOffset) {
2194 _jtd_constructor_167_impl(name, nameOffset);
2195 }
2196 _jtd_constructor_167_impl(String name, int nameOffset) {
2197 }
2198 ElementImpl getChild(String identifier27) {
2199 for (ExecutableElement function in _functions) {
2200 if (((function as ExecutableElementImpl)).identifier == identifier27) {
2201 return function as ExecutableElementImpl;
2202 }
2203 }
2204 for (LabelElement label in _labels) {
2205 if (((label as LabelElementImpl)).identifier == identifier27) {
2206 return label as LabelElementImpl;
2207 }
2208 }
2209 for (VariableElement variable in _localVariables) {
2210 if (((variable as VariableElementImpl)).identifier == identifier27) {
2211 return variable as VariableElementImpl;
2212 }
2213 }
2214 for (ParameterElement parameter in _parameters) {
2215 if (((parameter as ParameterElementImpl)).identifier == identifier27) {
2216 return parameter as ParameterElementImpl;
2217 }
2218 }
2219 return null;
2220 }
2221 List<FunctionElement> get functions => _functions;
2222 List<LabelElement> get labels => _labels;
2223 List<LocalVariableElement> get localVariables => _localVariables;
2224 List<ParameterElement> get parameters => _parameters;
2225 FunctionType get type => _type;
2226 /**
2227 * Set the functions defined within this executable element to the given funct ions.
2228 * @param functions the functions defined within this executable element
2229 */
2230 void set functions(List<FunctionElement> functions3) {
2231 for (FunctionElement function in functions3) {
2232 ((function as FunctionElementImpl)).enclosingElement = this;
2233 }
2234 this._functions = functions3;
2235 }
2236 /**
2237 * Set the labels defined within this executable element to the given labels.
2238 * @param labels the labels defined within this executable element
2239 */
2240 void set labels(List<LabelElement> labels2) {
2241 for (LabelElement label in labels2) {
2242 ((label as LabelElementImpl)).enclosingElement = this;
2243 }
2244 this._labels = labels2;
2245 }
2246 /**
2247 * Set the local variables defined within this executable element to the given variables.
2248 * @param localVariables the local variables defined within this executable el ement
2249 */
2250 void set localVariables(List<LocalVariableElement> localVariables2) {
2251 for (LocalVariableElement variable in localVariables2) {
2252 ((variable as LocalVariableElementImpl)).enclosingElement = this;
2253 }
2254 this._localVariables = localVariables2;
2255 }
2256 /**
2257 * Set the parameters defined by this executable element to the given paramete rs.
2258 * @param parameters the parameters defined by this executable element
2259 */
2260 void set parameters(List<ParameterElement> parameters7) {
2261 for (ParameterElement parameter in parameters7) {
2262 ((parameter as ParameterElementImpl)).enclosingElement = this;
2263 }
2264 this._parameters = parameters7;
2265 }
2266 /**
2267 * Set the type of function defined by this executable element to the given ty pe.
2268 * @param type the type of function defined by this executable element
2269 */
2270 void set type(FunctionType type7) {
2271 this._type = type7;
2272 }
2273 void visitChildren(ElementVisitor<Object> visitor) {
2274 super.visitChildren(visitor);
2275 safelyVisitChildren(_functions, visitor);
2276 safelyVisitChildren(_labels, visitor);
2277 safelyVisitChildren(_localVariables, visitor);
2278 safelyVisitChildren(_parameters, visitor);
2279 }
2280 void appendTo(JavaStringBuilder builder) {
2281 builder.append("(");
2282 int parameterCount = _parameters.length;
2283 for (int i = 0; i < parameterCount; i++) {
2284 if (i > 0) {
2285 builder.append(", ");
2286 }
2287 ((_parameters[i] as ParameterElementImpl)).appendTo(builder);
2288 }
2289 builder.append(")");
2290 if (_type != null) {
2291 builder.append(" -> ");
2292 builder.append(_type.returnType);
2293 }
2294 }
2295 }
2296 /**
2297 * Instances of the class {@code ExportElementImpl} implement an {@link ExportEl ement}.
2298 * @coverage dart.engine.element
2299 */
2300 class ExportElementImpl extends ElementImpl implements ExportElement {
2301 /**
2302 * The library that is exported from this library by this export directive.
2303 */
2304 LibraryElement _exportedLibrary;
2305 /**
2306 * The combinators that were specified as part of the export directive in the order in which they
2307 * were specified.
2308 */
2309 List<NamespaceCombinator> _combinators = NamespaceCombinator.EMPTY_ARRAY;
2310 /**
2311 * Initialize a newly created export element.
2312 */
2313 ExportElementImpl() : super.con1(null) {
2314 }
2315 accept(ElementVisitor visitor) => visitor.visitExportElement(this);
2316 List<NamespaceCombinator> get combinators => _combinators;
2317 LibraryElement get exportedLibrary => _exportedLibrary;
2318 ElementKind get kind => ElementKind.EXPORT;
2319 /**
2320 * Set the combinators that were specified as part of the export directive to the given array of
2321 * combinators.
2322 * @param combinators the combinators that were specified as part of the expor t directive
2323 */
2324 void set combinators(List<NamespaceCombinator> combinators2) {
2325 this._combinators = combinators2;
2326 }
2327 /**
2328 * Set the library that is exported from this library by this import directive to the given
2329 * library.
2330 * @param exportedLibrary the library that is exported from this library
2331 */
2332 void set exportedLibrary(LibraryElement exportedLibrary2) {
2333 this._exportedLibrary = exportedLibrary2;
2334 }
2335 void appendTo(JavaStringBuilder builder) {
2336 builder.append("export ");
2337 ((_exportedLibrary as LibraryElementImpl)).appendTo(builder);
2338 }
2339 }
2340 /**
2341 * Instances of the class {@code ExternalHtmlScriptElementImpl} implement an{@li nk ExternalHtmlScriptElement}.
2342 * @coverage dart.engine.element
2343 */
2344 class ExternalHtmlScriptElementImpl extends HtmlScriptElementImpl implements Ext ernalHtmlScriptElement {
2345 /**
2346 * The source specified in the {@code source} attribute or {@code null} if uns pecified.
2347 */
2348 Source _scriptSource;
2349 /**
2350 * Initialize a newly created script element to have the specified tag name an d offset.
2351 * @param node the XML node from which this element is derived (not {@code nul l})
2352 */
2353 ExternalHtmlScriptElementImpl(XmlTagNode node) : super(node) {
2354 }
2355 accept(ElementVisitor visitor) => visitor.visitExternalHtmlScriptElement(this) ;
2356 ElementKind get kind => ElementKind.EXTERNAL_HTML_SCRIPT;
2357 Source get scriptSource => _scriptSource;
2358 /**
2359 * Set the source specified in the {@code source} attribute.
2360 * @param scriptSource the script source or {@code null} if unspecified
2361 */
2362 void set scriptSource(Source scriptSource2) {
2363 this._scriptSource = scriptSource2;
2364 }
2365 }
2366 /**
2367 * Instances of the class {@code FieldElementImpl} implement a {@code FieldEleme nt}.
2368 * @coverage dart.engine.element
2369 */
2370 class FieldElementImpl extends PropertyInducingElementImpl implements FieldEleme nt {
2371 /**
2372 * An empty array of field elements.
2373 */
2374 static List<FieldElement> EMPTY_ARRAY = new List<FieldElement>(0);
2375 /**
2376 * Initialize a newly created field element to have the given name.
2377 * @param name the name of this element
2378 */
2379 FieldElementImpl.con1(Identifier name) : super.con1(name) {
2380 _jtd_constructor_170_impl(name);
2381 }
2382 _jtd_constructor_170_impl(Identifier name) {
2383 }
2384 /**
2385 * Initialize a newly created synthetic field element to have the given name.
2386 * @param name the name of this element
2387 */
2388 FieldElementImpl.con2(String name) : super.con2(name) {
2389 _jtd_constructor_171_impl(name);
2390 }
2391 _jtd_constructor_171_impl(String name) {
2392 }
2393 accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
2394 ClassElement get enclosingElement => super.enclosingElement as ClassElement;
2395 ElementKind get kind => ElementKind.FIELD;
2396 bool isStatic() => hasModifier(Modifier.STATIC);
2397 /**
2398 * Set whether this field is static to correspond to the given value.
2399 * @param isStatic {@code true} if the field is static
2400 */
2401 void set static(bool isStatic) {
2402 setModifier(Modifier.STATIC, isStatic);
2403 }
2404 }
2405 /**
2406 * Instances of the class {@code FunctionElementImpl} implement a {@code Functio nElement}.
2407 * @coverage dart.engine.element
2408 */
2409 class FunctionElementImpl extends ExecutableElementImpl implements FunctionEleme nt {
2410 /**
2411 * The offset to the beginning of the visible range for this element.
2412 */
2413 int _visibleRangeOffset = 0;
2414 /**
2415 * The length of the visible range for this element, or {@code -1} if this ele ment does not have a
2416 * visible range.
2417 */
2418 int _visibleRangeLength = -1;
2419 /**
2420 * An empty array of function elements.
2421 */
2422 static List<FunctionElement> EMPTY_ARRAY = new List<FunctionElement>(0);
2423 /**
2424 * Initialize a newly created synthetic function element.
2425 */
2426 FunctionElementImpl() : super.con2("", -1) {
2427 _jtd_constructor_172_impl();
2428 }
2429 _jtd_constructor_172_impl() {
2430 synthetic = true;
2431 }
2432 /**
2433 * Initialize a newly created function element to have the given name.
2434 * @param name the name of this element
2435 */
2436 FunctionElementImpl.con1(Identifier name) : super.con1(name) {
2437 _jtd_constructor_173_impl(name);
2438 }
2439 _jtd_constructor_173_impl(Identifier name) {
2440 }
2441 accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
2442 String get identifier => name;
2443 ElementKind get kind => ElementKind.FUNCTION;
2444 SourceRange get visibleRange {
2445 if (_visibleRangeLength < 0) {
2446 return null;
2447 }
2448 return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
2449 }
2450 bool isStatic() => enclosingElement is CompilationUnitElement;
2451 /**
2452 * Set the visible range for this element to the range starting at the given o ffset with the given
2453 * length.
2454 * @param offset the offset to the beginning of the visible range for this ele ment
2455 * @param length the length of the visible range for this element, or {@code - 1} if this element
2456 * does not have a visible range
2457 */
2458 void setVisibleRange(int offset, int length) {
2459 _visibleRangeOffset = offset;
2460 _visibleRangeLength = length;
2461 }
2462 void appendTo(JavaStringBuilder builder) {
2463 String name13 = name;
2464 if (name13 != null) {
2465 builder.append(name13);
2466 }
2467 super.appendTo(builder);
2468 }
2469 }
2470 /**
2471 * Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowComb inator}.
2472 * @coverage dart.engine.element
2473 */
2474 class HideCombinatorImpl implements HideCombinator {
2475 /**
2476 * The names that are not to be made visible in the importing library even if they are defined in
2477 * the imported library.
2478 */
2479 List<String> _hiddenNames = StringUtilities.EMPTY_ARRAY;
2480 /**
2481 * Initialize a newly created combinator.
2482 */
2483 HideCombinatorImpl() : super() {
2484 }
2485 List<String> get hiddenNames => _hiddenNames;
2486 /**
2487 * Set the names that are not to be made visible in the importing library even if they are defined
2488 * in the imported library to the given names.
2489 * @param hiddenNames the names that are not to be made visible in the importi ng library
2490 */
2491 void set hiddenNames(List<String> hiddenNames2) {
2492 this._hiddenNames = hiddenNames2;
2493 }
2494 String toString() {
2495 JavaStringBuilder builder = new JavaStringBuilder();
2496 builder.append("show ");
2497 int count = _hiddenNames.length;
2498 for (int i = 0; i < count; i++) {
2499 if (i > 0) {
2500 builder.append(", ");
2501 }
2502 builder.append(_hiddenNames[i]);
2503 }
2504 return builder.toString();
2505 }
2506 }
2507 /**
2508 * Instances of the class {@code HtmlElementImpl} implement an {@link HtmlElemen t}.
2509 * @coverage dart.engine.element
2510 */
2511 class HtmlElementImpl extends ElementImpl implements HtmlElement {
2512 /**
2513 * An empty array of HTML file elements.
2514 */
2515 static List<HtmlElement> EMPTY_ARRAY = new List<HtmlElement>(0);
2516 /**
2517 * The analysis context in which this library is defined.
2518 */
2519 AnalysisContext _context;
2520 /**
2521 * The scripts contained in or referenced from script tags in the HTML file.
2522 */
2523 List<HtmlScriptElement> _scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
2524 /**
2525 * The source that corresponds to this HTML file.
2526 */
2527 Source _source;
2528 /**
2529 * Initialize a newly created HTML element to have the given name.
2530 * @param context the analysis context in which the HTML file is defined
2531 * @param name the name of this element
2532 */
2533 HtmlElementImpl(AnalysisContext context, String name) : super.con2(name, -1) {
2534 this._context = context;
2535 }
2536 accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
2537 bool operator ==(Object object) => identical(runtimeType, object.runtimeType) && _source == ((object as CompilationUnitElementImpl)).source;
2538 AnalysisContext get context => _context;
2539 ElementKind get kind => ElementKind.HTML;
2540 List<HtmlScriptElement> get scripts => _scripts;
2541 Source get source => _source;
2542 int get hashCode => _source.hashCode;
2543 /**
2544 * Set the scripts contained in the HTML file to the given scripts.
2545 * @param scripts the scripts
2546 */
2547 void set scripts(List<HtmlScriptElement> scripts2) {
2548 for (HtmlScriptElement script in scripts2) {
2549 ((script as HtmlScriptElementImpl)).enclosingElement = this;
2550 }
2551 this._scripts = scripts2;
2552 }
2553 /**
2554 * Set the source that corresponds to this HTML file to the given source.
2555 * @param source the source that corresponds to this HTML file
2556 */
2557 void set source(Source source6) {
2558 this._source = source6;
2559 }
2560 void visitChildren(ElementVisitor<Object> visitor) {
2561 super.visitChildren(visitor);
2562 safelyVisitChildren(_scripts, visitor);
2563 }
2564 void appendTo(JavaStringBuilder builder) {
2565 if (_source == null) {
2566 builder.append("{HTML file}");
2567 } else {
2568 builder.append(_source.fullName);
2569 }
2570 }
2571 }
2572 /**
2573 * Instances of the class {@code HtmlScriptElementImpl} implement an {@link Html ScriptElement}.
2574 * @coverage dart.engine.element
2575 */
2576 abstract class HtmlScriptElementImpl extends ElementImpl implements HtmlScriptEl ement {
2577 /**
2578 * An empty array of HTML script elements.
2579 */
2580 static List<HtmlScriptElement> EMPTY_ARRAY = new List<HtmlScriptElement>(0);
2581 /**
2582 * Initialize a newly created script element to have the specified tag name an d offset.
2583 * @param node the XML node from which this element is derived (not {@code nul l})
2584 */
2585 HtmlScriptElementImpl(XmlTagNode node) : super.con2(node.tag.lexeme, node.tag. offset) {
2586 }
2587 }
2588 /**
2589 * Instances of the class {@code ImportElementImpl} implement an {@link ImportEl ement}.
2590 * @coverage dart.engine.element
2591 */
2592 class ImportElementImpl extends ElementImpl implements ImportElement {
2593 /**
2594 * The library that is imported into this library by this import directive.
2595 */
2596 LibraryElement _importedLibrary;
2597 /**
2598 * The combinators that were specified as part of the import directive in the order in which they
2599 * were specified.
2600 */
2601 List<NamespaceCombinator> _combinators = NamespaceCombinator.EMPTY_ARRAY;
2602 /**
2603 * The prefix that was specified as part of the import directive, or {@code nu ll} if there was no
2604 * prefix specified.
2605 */
2606 PrefixElement _prefix;
2607 /**
2608 * Initialize a newly created import element.
2609 */
2610 ImportElementImpl() : super.con1(null) {
2611 }
2612 accept(ElementVisitor visitor) => visitor.visitImportElement(this);
2613 List<NamespaceCombinator> get combinators => _combinators;
2614 LibraryElement get importedLibrary => _importedLibrary;
2615 ElementKind get kind => ElementKind.IMPORT;
2616 PrefixElement get prefix => _prefix;
2617 /**
2618 * Set the combinators that were specified as part of the import directive to the given array of
2619 * combinators.
2620 * @param combinators the combinators that were specified as part of the impor t directive
2621 */
2622 void set combinators(List<NamespaceCombinator> combinators3) {
2623 this._combinators = combinators3;
2624 }
2625 /**
2626 * Set the library that is imported into this library by this import directive to the given
2627 * library.
2628 * @param importedLibrary the library that is imported into this library
2629 */
2630 void set importedLibrary(LibraryElement importedLibrary3) {
2631 this._importedLibrary = importedLibrary3;
2632 }
2633 /**
2634 * Set the prefix that was specified as part of the import directive to the gi ven prefix.
2635 * @param prefix the prefix that was specified as part of the import directive
2636 */
2637 void set prefix(PrefixElement prefix3) {
2638 this._prefix = prefix3;
2639 }
2640 void visitChildren(ElementVisitor<Object> visitor) {
2641 super.visitChildren(visitor);
2642 safelyVisitChild(_prefix, visitor);
2643 }
2644 void appendTo(JavaStringBuilder builder) {
2645 builder.append("import ");
2646 ((_importedLibrary as LibraryElementImpl)).appendTo(builder);
2647 }
2648 }
2649 /**
2650 * Instances of the class {@code LabelElementImpl} implement a {@code LabelEleme nt}.
2651 * @coverage dart.engine.element
2652 */
2653 class LabelElementImpl extends ElementImpl implements LabelElement {
2654 /**
2655 * A flag indicating whether this label is associated with a {@code switch} st atement.
2656 */
2657 bool _onSwitchStatement = false;
2658 /**
2659 * A flag indicating whether this label is associated with a {@code switch} me mber ({@code case}or {@code default}).
2660 */
2661 bool _onSwitchMember = false;
2662 /**
2663 * An empty array of label elements.
2664 */
2665 static List<LabelElement> EMPTY_ARRAY = new List<LabelElement>(0);
2666 /**
2667 * Initialize a newly created label element to have the given name.
2668 * @param name the name of this element
2669 * @param onSwitchStatement {@code true} if this label is associated with a {@ code switch}statement
2670 * @param onSwitchMember {@code true} if this label is associated with a {@cod e switch} member
2671 */
2672 LabelElementImpl(Identifier name, bool onSwitchStatement, bool onSwitchMember) : super.con1(name) {
2673 this._onSwitchStatement = onSwitchStatement;
2674 this._onSwitchMember = onSwitchMember;
2675 }
2676 accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
2677 ExecutableElement get enclosingElement => super.enclosingElement as Executable Element;
2678 ElementKind get kind => ElementKind.LABEL;
2679 /**
2680 * Return {@code true} if this label is associated with a {@code switch} membe r ({@code case} or{@code default}).
2681 * @return {@code true} if this label is associated with a {@code switch} memb er
2682 */
2683 bool isOnSwitchMember() => _onSwitchMember;
2684 /**
2685 * Return {@code true} if this label is associated with a {@code switch} state ment.
2686 * @return {@code true} if this label is associated with a {@code switch} stat ement
2687 */
2688 bool isOnSwitchStatement() => _onSwitchStatement;
2689 }
2690 /**
2691 * Instances of the class {@code LibraryElementImpl} implement a {@code LibraryE lement}.
2692 * @coverage dart.engine.element
2693 */
2694 class LibraryElementImpl extends ElementImpl implements LibraryElement {
2695 /**
2696 * An empty array of library elements.
2697 */
2698 static List<LibraryElement> EMPTY_ARRAY = new List<LibraryElement>(0);
2699 /**
2700 * Determine if the given library is up to date with respect to the given time stamp.
2701 * @param library the library to process
2702 * @param timeStamp the time stamp to check against
2703 * @param visitedLibraries the set of visited libraries
2704 */
2705 static bool isUpToDate(LibraryElement library, int timeStamp, Set<LibraryEleme nt> visitedLibraries) {
2706 if (!visitedLibraries.contains(library)) {
2707 javaSetAdd(visitedLibraries, library);
2708 if (timeStamp < library.definingCompilationUnit.source.modificationStamp) {
2709 return false;
2710 }
2711 for (CompilationUnitElement element in library.parts) {
2712 if (timeStamp < element.source.modificationStamp) {
2713 return false;
2714 }
2715 }
2716 for (LibraryElement importedLibrary in library.importedLibraries) {
2717 if (!isUpToDate(importedLibrary, timeStamp, visitedLibraries)) {
2718 return false;
2719 }
2720 }
2721 for (LibraryElement exportedLibrary in library.exportedLibraries) {
2722 if (!isUpToDate(exportedLibrary, timeStamp, visitedLibraries)) {
2723 return false;
2724 }
2725 }
2726 }
2727 return true;
2728 }
2729 /**
2730 * The analysis context in which this library is defined.
2731 */
2732 AnalysisContext _context;
2733 /**
2734 * The compilation unit that defines this library.
2735 */
2736 CompilationUnitElement _definingCompilationUnit;
2737 /**
2738 * The entry point for this library, or {@code null} if this library does not have an entry point.
2739 */
2740 FunctionElement _entryPoint;
2741 /**
2742 * An array containing specifications of all of the imports defined in this li brary.
2743 */
2744 List<ImportElement> _imports = ImportElement.EMPTY_ARRAY;
2745 /**
2746 * An array containing specifications of all of the exports defined in this li brary.
2747 */
2748 List<ExportElement> _exports = ExportElement.EMPTY_ARRAY;
2749 /**
2750 * An array containing all of the compilation units that are included in this library using a{@code part} directive.
2751 */
2752 List<CompilationUnitElement> _parts = CompilationUnitElementImpl.EMPTY_ARRAY;
2753 /**
2754 * Initialize a newly created library element to have the given name.
2755 * @param context the analysis context in which the library is defined
2756 * @param name the name of this element
2757 */
2758 LibraryElementImpl(AnalysisContext context, LibraryIdentifier name) : super.co n1(name) {
2759 this._context = context;
2760 }
2761 accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
2762 bool operator ==(Object object) => identical(runtimeType, object.runtimeType) && _definingCompilationUnit == ((object as LibraryElementImpl)).definingCompilat ionUnit;
2763 ElementImpl getChild(String identifier28) {
2764 if (((_definingCompilationUnit as CompilationUnitElementImpl)).identifier == identifier28) {
2765 return _definingCompilationUnit as CompilationUnitElementImpl;
2766 }
2767 for (CompilationUnitElement part in _parts) {
2768 if (((part as CompilationUnitElementImpl)).identifier == identifier28) {
2769 return part as CompilationUnitElementImpl;
2770 }
2771 }
2772 return null;
2773 }
2774 AnalysisContext get context => _context;
2775 CompilationUnitElement get definingCompilationUnit => _definingCompilationUnit ;
2776 FunctionElement get entryPoint => _entryPoint;
2777 List<LibraryElement> get exportedLibraries {
2778 Set<LibraryElement> libraries = new Set<LibraryElement>();
2779 for (ExportElement element in _exports) {
2780 LibraryElement library = element.exportedLibrary;
2781 javaSetAdd(libraries, library);
2782 }
2783 return new List.from(libraries);
2784 }
2785 List<ExportElement> get exports => _exports;
2786 String get identifier => _definingCompilationUnit.source.fullName;
2787 List<LibraryElement> get importedLibraries {
2788 Set<LibraryElement> libraries = new Set<LibraryElement>();
2789 for (ImportElement element in _imports) {
2790 LibraryElement prefix = element.importedLibrary;
2791 javaSetAdd(libraries, prefix);
2792 }
2793 return new List.from(libraries);
2794 }
2795 List<ImportElement> get imports => _imports;
2796 ElementKind get kind => ElementKind.LIBRARY;
2797 List<CompilationUnitElement> get parts => _parts;
2798 List<PrefixElement> get prefixes {
2799 Set<PrefixElement> prefixes = new Set<PrefixElement>();
2800 for (ImportElement element in _imports) {
2801 PrefixElement prefix4 = element.prefix;
2802 if (prefix4 != null) {
2803 javaSetAdd(prefixes, prefix4);
2804 }
2805 }
2806 return new List.from(prefixes);
2807 }
2808 int get hashCode => _definingCompilationUnit.hashCode;
2809 bool isBrowserApplication() => _entryPoint != null && isOrImportsBrowserLibrar y();
2810 bool isDartCore() => name == "dart.core";
2811 bool isUpToDate2(int timeStamp) {
2812 Set<LibraryElement> visitedLibraries = new Set();
2813 return isUpToDate(this, timeStamp, visitedLibraries);
2814 }
2815 /**
2816 * Set the compilation unit that defines this library to the given compilation unit.
2817 * @param definingCompilationUnit the compilation unit that defines this libra ry
2818 */
2819 void set definingCompilationUnit(CompilationUnitElement definingCompilationUni t2) {
2820 ((definingCompilationUnit2 as CompilationUnitElementImpl)).enclosingElement = this;
2821 this._definingCompilationUnit = definingCompilationUnit2;
2822 }
2823 /**
2824 * Set the entry point for this library to the given function.
2825 * @param entryPoint the entry point for this library
2826 */
2827 void set entryPoint(FunctionElement entryPoint2) {
2828 this._entryPoint = entryPoint2;
2829 }
2830 /**
2831 * Set the specifications of all of the exports defined in this library to the given array.
2832 * @param exports the specifications of all of the exports defined in this lib rary
2833 */
2834 void set exports(List<ExportElement> exports2) {
2835 for (ExportElement exportElement in exports2) {
2836 ((exportElement as ExportElementImpl)).enclosingElement = this;
2837 }
2838 this._exports = exports2;
2839 }
2840 /**
2841 * Set the specifications of all of the imports defined in this library to the given array.
2842 * @param imports the specifications of all of the imports defined in this lib rary
2843 */
2844 void set imports(List<ImportElement> imports2) {
2845 for (ImportElement importElement in imports2) {
2846 ((importElement as ImportElementImpl)).enclosingElement = this;
2847 PrefixElementImpl prefix5 = importElement.prefix as PrefixElementImpl;
2848 if (prefix5 != null) {
2849 prefix5.enclosingElement = this;
2850 }
2851 }
2852 this._imports = imports2;
2853 }
2854 /**
2855 * Set the compilation units that are included in this library using a {@code part} directive.
2856 * @param parts the compilation units that are included in this library using a {@code part}directive
2857 */
2858 void set parts(List<CompilationUnitElement> parts2) {
2859 for (CompilationUnitElement compilationUnit in parts2) {
2860 ((compilationUnit as CompilationUnitElementImpl)).enclosingElement = this;
2861 }
2862 this._parts = parts2;
2863 }
2864 void visitChildren(ElementVisitor<Object> visitor) {
2865 super.visitChildren(visitor);
2866 safelyVisitChild(_definingCompilationUnit, visitor);
2867 safelyVisitChildren(_exports, visitor);
2868 safelyVisitChildren(_imports, visitor);
2869 safelyVisitChildren(_parts, visitor);
2870 }
2871 /**
2872 * Answer {@code true} if the receiver directly or indirectly imports the dart :html libraries.
2873 * @return {@code true} if the receiver directly or indirectly imports the dar t:html libraries
2874 */
2875 bool isOrImportsBrowserLibrary() {
2876 List<LibraryElement> visited = new List<LibraryElement>();
2877 Source htmlLibSource = definingCompilationUnit.source.resolve("dart:html");
2878 visited.add(this);
2879 for (int index = 0; index < visited.length; index++) {
2880 LibraryElement library = visited[index];
2881 Source source10 = library.definingCompilationUnit.source;
2882 if (source10 == htmlLibSource) {
2883 return true;
2884 }
2885 for (LibraryElement importedLibrary in library.importedLibraries) {
2886 if (!visited.contains(importedLibrary)) {
2887 visited.add(importedLibrary);
2888 }
2889 }
2890 for (LibraryElement exportedLibrary in library.exportedLibraries) {
2891 if (!visited.contains(exportedLibrary)) {
2892 visited.add(exportedLibrary);
2893 }
2894 }
2895 }
2896 return false;
2897 }
2898 }
2899 /**
2900 * Instances of the class {@code LocalVariableElementImpl} implement a {@code Lo calVariableElement}.
2901 * @coverage dart.engine.element
2902 */
2903 class LocalVariableElementImpl extends VariableElementImpl implements LocalVaria bleElement {
2904 /**
2905 * The offset to the beginning of the visible range for this element.
2906 */
2907 int _visibleRangeOffset = 0;
2908 /**
2909 * The length of the visible range for this element, or {@code -1} if this ele ment does not have a
2910 * visible range.
2911 */
2912 int _visibleRangeLength = -1;
2913 /**
2914 * An empty array of field elements.
2915 */
2916 static List<LocalVariableElement> EMPTY_ARRAY = new List<LocalVariableElement> (0);
2917 /**
2918 * Initialize a newly created parameter element to have the given name.
2919 * @param name the name of this element
2920 */
2921 LocalVariableElementImpl(Identifier name) : super.con1(name) {
2922 }
2923 accept(ElementVisitor visitor) => visitor.visitLocalVariableElement(this);
2924 ElementKind get kind => ElementKind.LOCAL_VARIABLE;
2925 SourceRange get visibleRange {
2926 if (_visibleRangeLength < 0) {
2927 return null;
2928 }
2929 return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
2930 }
2931 /**
2932 * Set the visible range for this element to the range starting at the given o ffset with the given
2933 * length.
2934 * @param offset the offset to the beginning of the visible range for this ele ment
2935 * @param length the length of the visible range for this element, or {@code - 1} if this element
2936 * does not have a visible range
2937 */
2938 void setVisibleRange(int offset, int length) {
2939 _visibleRangeOffset = offset;
2940 _visibleRangeLength = length;
2941 }
2942 void appendTo(JavaStringBuilder builder) {
2943 builder.append(type);
2944 builder.append(" ");
2945 builder.append(name);
2946 }
2947 }
2948 /**
2949 * Instances of the class {@code MethodElementImpl} implement a {@code MethodEle ment}.
2950 * @coverage dart.engine.element
2951 */
2952 class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
2953 /**
2954 * An empty array of method elements.
2955 */
2956 static List<MethodElement> EMPTY_ARRAY = new List<MethodElement>(0);
2957 /**
2958 * Initialize a newly created method element to have the given name.
2959 * @param name the name of this element
2960 */
2961 MethodElementImpl.con1(Identifier name) : super.con1(name) {
2962 _jtd_constructor_181_impl(name);
2963 }
2964 _jtd_constructor_181_impl(Identifier name) {
2965 }
2966 /**
2967 * Initialize a newly created method element to have the given name.
2968 * @param name the name of this element
2969 * @param nameOffset the offset of the name of this element in the file that c ontains the
2970 * declaration of this element
2971 */
2972 MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOff set) {
2973 _jtd_constructor_182_impl(name, nameOffset);
2974 }
2975 _jtd_constructor_182_impl(String name, int nameOffset) {
2976 }
2977 accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
2978 ClassElement get enclosingElement => super.enclosingElement as ClassElement;
2979 ElementKind get kind => ElementKind.METHOD;
2980 bool isAbstract() => hasModifier(Modifier.ABSTRACT);
2981 bool isStatic() => hasModifier(Modifier.STATIC);
2982 /**
2983 * Set whether this method is abstract to correspond to the given value.
2984 * @param isAbstract {@code true} if the method is abstract
2985 */
2986 void set abstract(bool isAbstract) {
2987 setModifier(Modifier.ABSTRACT, isAbstract);
2988 }
2989 /**
2990 * Set whether this method is static to correspond to the given value.
2991 * @param isStatic {@code true} if the method is static
2992 */
2993 void set static(bool isStatic) {
2994 setModifier(Modifier.STATIC, isStatic);
2995 }
2996 void appendTo(JavaStringBuilder builder) {
2997 builder.append(enclosingElement.name);
2998 builder.append(".");
2999 builder.append(name);
3000 super.appendTo(builder);
3001 }
3002 }
3003 /**
3004 * The enumeration {@code Modifier} defines constants for all of the modifiers d efined by the Dart
3005 * language and for a few additional flags that are useful.
3006 * @coverage dart.engine.element
3007 */
3008 class Modifier {
3009 static final Modifier ABSTRACT = new Modifier('ABSTRACT', 0);
3010 static final Modifier CONST = new Modifier('CONST', 1);
3011 static final Modifier FACTORY = new Modifier('FACTORY', 2);
3012 static final Modifier FINAL = new Modifier('FINAL', 3);
3013 static final Modifier GETTER = new Modifier('GETTER', 4);
3014 static final Modifier INITIALIZING_FORMAL = new Modifier('INITIALIZING_FORMAL' , 5);
3015 static final Modifier MIXIN = new Modifier('MIXIN', 6);
3016 static final Modifier SETTER = new Modifier('SETTER', 7);
3017 static final Modifier STATIC = new Modifier('STATIC', 8);
3018 static final Modifier SYNTHETIC = new Modifier('SYNTHETIC', 9);
3019 static final Modifier TYPEDEF = new Modifier('TYPEDEF', 10);
3020 static final List<Modifier> values = [ABSTRACT, CONST, FACTORY, FINAL, GETTER, INITIALIZING_FORMAL, MIXIN, SETTER, STATIC, SYNTHETIC, TYPEDEF];
3021 final String __name;
3022 final int __ordinal;
3023 int get ordinal => __ordinal;
3024 Modifier(this.__name, this.__ordinal) {
3025 }
3026 String toString() => __name;
3027 }
3028 /**
3029 * Instances of the class {@code MultiplyDefinedElementImpl} represent a collect ion of elements that
3030 * have the same name within the same scope.
3031 * @coverage dart.engine.element
3032 */
3033 class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
3034 /**
3035 * The analysis context in which the multiply defined elements are defined.
3036 */
3037 AnalysisContext _context;
3038 /**
3039 * The name of the conflicting elements.
3040 */
3041 String _name;
3042 /**
3043 * A list containing all of the elements that conflict.
3044 */
3045 List<Element> _conflictingElements;
3046 /**
3047 * Initialize a newly created element to represent a list of conflicting eleme nts.
3048 * @param context the analysis context in which the multiply defined elements are defined
3049 * @param firstElement the first element that conflicts
3050 * @param secondElement the second element that conflicts
3051 */
3052 MultiplyDefinedElementImpl(AnalysisContext context, Element firstElement, Elem ent secondElement) {
3053 _name = firstElement.name;
3054 _conflictingElements = computeConflictingElements(firstElement, secondElemen t);
3055 }
3056 accept(ElementVisitor visitor) => visitor.visitMultiplyDefinedElement(this);
3057 Element getAncestor(Type elementClass) => null;
3058 List<Element> get conflictingElements => _conflictingElements;
3059 AnalysisContext get context => _context;
3060 Element get enclosingElement => null;
3061 ElementKind get kind => ElementKind.ERROR;
3062 LibraryElement get library => null;
3063 ElementLocation get location => null;
3064 List<Annotation> get metadata => AnnotationImpl.EMPTY_ARRAY;
3065 String get name => _name;
3066 int get nameOffset => -1;
3067 Source get source => null;
3068 bool isAccessibleIn(LibraryElement library) {
3069 for (Element element in _conflictingElements) {
3070 if (element.isAccessibleIn(library)) {
3071 return true;
3072 }
3073 }
3074 return false;
3075 }
3076 bool isSynthetic() => true;
3077 String toString() {
3078 JavaStringBuilder builder = new JavaStringBuilder();
3079 builder.append("[");
3080 int count = _conflictingElements.length;
3081 for (int i = 0; i < count; i++) {
3082 if (i > 0) {
3083 builder.append(", ");
3084 }
3085 ((_conflictingElements[i] as ElementImpl)).appendTo(builder);
3086 }
3087 builder.append("]");
3088 return builder.toString();
3089 }
3090 void visitChildren(ElementVisitor<Object> visitor) {
3091 }
3092 /**
3093 * Add the given element to the list of elements. If the element is a multiply -defined element,
3094 * add all of the conflicting elements that it represents.
3095 * @param elements the list to which the element(s) are to be added
3096 * @param element the element(s) to be added
3097 */
3098 void add(List<Element> elements, Element element) {
3099 if (element is MultiplyDefinedElementImpl) {
3100 for (Element conflictingElement in ((element as MultiplyDefinedElementImpl ))._conflictingElements) {
3101 elements.add(conflictingElement);
3102 }
3103 } else {
3104 elements.add(element);
3105 }
3106 }
3107 /**
3108 * Use the given elements to construct an array of conflicting elements. If ei ther of the given
3109 * elements are multiply-defined elements then the conflicting elements they r epresent will be
3110 * included in the array. Otherwise, the element itself will be included.
3111 * @param firstElement the first element to be included
3112 * @param secondElement the second element to be included
3113 * @return an array containing all of the conflicting elements
3114 */
3115 List<Element> computeConflictingElements(Element firstElement, Element secondE lement) {
3116 List<Element> elements = new List<Element>();
3117 add(elements, firstElement);
3118 add(elements, secondElement);
3119 return new List.from(elements);
3120 }
3121 }
3122 /**
3123 * Instances of the class {@code ParameterElementImpl} implement a {@code Parame terElement}.
3124 * @coverage dart.engine.element
3125 */
3126 class ParameterElementImpl extends VariableElementImpl implements ParameterEleme nt {
3127 /**
3128 * The kind of this parameter.
3129 */
3130 ParameterKind _parameterKind;
3131 /**
3132 * The offset to the beginning of the visible range for this element.
3133 */
3134 int _visibleRangeOffset = 0;
3135 /**
3136 * The length of the visible range for this element, or {@code -1} if this ele ment does not have a
3137 * visible range.
3138 */
3139 int _visibleRangeLength = -1;
3140 /**
3141 * An empty array of field elements.
3142 */
3143 static List<ParameterElement> EMPTY_ARRAY = new List<ParameterElement>(0);
3144 /**
3145 * Initialize a newly created parameter element to have the given name.
3146 * @param name the name of this element
3147 */
3148 ParameterElementImpl(Identifier name) : super.con1(name) {
3149 }
3150 accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
3151 ElementKind get kind => ElementKind.PARAMETER;
3152 ParameterKind get parameterKind => _parameterKind;
3153 SourceRange get visibleRange {
3154 if (_visibleRangeLength < 0) {
3155 return null;
3156 }
3157 return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
3158 }
3159 bool isInitializingFormal() => hasModifier(Modifier.INITIALIZING_FORMAL);
3160 /**
3161 * Set whether this parameter is an initializing formal parameter to match the given value.
3162 * @param isInitializingFormal {@code true} if this parameter is an initializi ng formal parameter
3163 */
3164 void set initializingFormal(bool isInitializingFormal) {
3165 setModifier(Modifier.INITIALIZING_FORMAL, isInitializingFormal);
3166 }
3167 /**
3168 * Set the kind of this parameter to the given kind.
3169 * @param parameterKind the new kind of this parameter
3170 */
3171 void set parameterKind(ParameterKind parameterKind2) {
3172 this._parameterKind = parameterKind2;
3173 }
3174 /**
3175 * Set the visible range for this element to the range starting at the given o ffset with the given
3176 * length.
3177 * @param offset the offset to the beginning of the visible range for this ele ment
3178 * @param length the length of the visible range for this element, or {@code - 1} if this element
3179 * does not have a visible range
3180 */
3181 void setVisibleRange(int offset, int length) {
3182 _visibleRangeOffset = offset;
3183 _visibleRangeLength = length;
3184 }
3185 void appendTo(JavaStringBuilder builder) {
3186 builder.append(type);
3187 builder.append(" ");
3188 builder.append(name);
3189 builder.append(" (");
3190 builder.append(kind);
3191 builder.append(")");
3192 }
3193 }
3194 /**
3195 * Instances of the class {@code PrefixElementImpl} implement a {@code PrefixEle ment}.
3196 * @coverage dart.engine.element
3197 */
3198 class PrefixElementImpl extends ElementImpl implements PrefixElement {
3199 /**
3200 * An array containing all of the libraries that are imported using this prefi x.
3201 */
3202 List<LibraryElement> _importedLibraries = LibraryElementImpl.EMPTY_ARRAY;
3203 /**
3204 * An empty array of prefix elements.
3205 */
3206 static List<PrefixElement> EMPTY_ARRAY = new List<PrefixElement>(0);
3207 /**
3208 * Initialize a newly created prefix element to have the given name.
3209 * @param name the name of this element
3210 */
3211 PrefixElementImpl(Identifier name) : super.con1(name) {
3212 }
3213 accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
3214 LibraryElement get enclosingElement => super.enclosingElement as LibraryElemen t;
3215 List<LibraryElement> get importedLibraries => _importedLibraries;
3216 ElementKind get kind => ElementKind.PREFIX;
3217 /**
3218 * Set the libraries that are imported using this prefix to the given librarie s.
3219 * @param importedLibraries the libraries that are imported using this prefix
3220 */
3221 void set importedLibraries(List<LibraryElement> importedLibraries2) {
3222 for (LibraryElement library in importedLibraries2) {
3223 ((library as LibraryElementImpl)).enclosingElement = this;
3224 }
3225 this._importedLibraries = importedLibraries2;
3226 }
3227 void appendTo(JavaStringBuilder builder) {
3228 builder.append("as ");
3229 super.appendTo(builder);
3230 }
3231 }
3232 /**
3233 * Instances of the class {@code PropertyAccessorElementImpl} implement a{@code PropertyAccessorElement}.
3234 * @coverage dart.engine.element
3235 */
3236 class PropertyAccessorElementImpl extends ExecutableElementImpl implements Prope rtyAccessorElement {
3237 /**
3238 * The variable associated with this accessor.
3239 */
3240 PropertyInducingElement _variable;
3241 /**
3242 * An empty array of property accessor elements.
3243 */
3244 static List<PropertyAccessorElement> EMPTY_ARRAY = new List<PropertyAccessorEl ement>(0);
3245 /**
3246 * Initialize a newly created property accessor element to have the given name .
3247 * @param name the name of this element
3248 */
3249 PropertyAccessorElementImpl.con1(Identifier name) : super.con1(name) {
3250 _jtd_constructor_187_impl(name);
3251 }
3252 _jtd_constructor_187_impl(Identifier name) {
3253 }
3254 /**
3255 * Initialize a newly created synthetic property accessor element to be associ ated with the given
3256 * variable.
3257 * @param variable the variable with which this access is associated
3258 */
3259 PropertyAccessorElementImpl.con2(PropertyInducingElementImpl variable2) : supe r.con2(variable2.name, -1) {
3260 _jtd_constructor_188_impl(variable2);
3261 }
3262 _jtd_constructor_188_impl(PropertyInducingElementImpl variable2) {
3263 this._variable = variable2;
3264 synthetic = true;
3265 }
3266 accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
3267 bool operator ==(Object object) => super == object && identical(isGetter(), (( object as PropertyAccessorElement)).isGetter());
3268 ElementKind get kind {
3269 if (isGetter()) {
3270 return ElementKind.GETTER;
3271 }
3272 return ElementKind.SETTER;
3273 }
3274 PropertyInducingElement get variable => _variable;
3275 bool isGetter() => hasModifier(Modifier.GETTER);
3276 bool isSetter() => hasModifier(Modifier.SETTER);
3277 bool isStatic() => variable.isStatic();
3278 /**
3279 * Set whether this accessor is a getter to correspond to the given value.
3280 * @param isGetter {@code true} if the accessor is a getter
3281 */
3282 void set getter(bool isGetter) {
3283 setModifier(Modifier.GETTER, isGetter);
3284 }
3285 /**
3286 * Set whether this accessor is a setter to correspond to the given value.
3287 * @param isSetter {@code true} if the accessor is a setter
3288 */
3289 void set setter(bool isSetter) {
3290 setModifier(Modifier.SETTER, isSetter);
3291 }
3292 /**
3293 * Set the variable associated with this accessor to the given variable.
3294 * @param variable the variable associated with this accessor
3295 */
3296 void set variable(PropertyInducingElement variable3) {
3297 this._variable = variable3;
3298 }
3299 void appendTo(JavaStringBuilder builder) {
3300 builder.append(isGetter() ? "get " : "set ");
3301 builder.append(variable.name);
3302 super.appendTo(builder);
3303 }
3304 }
3305 /**
3306 * Instances of the class {@code PropertyInducingElementImpl} implement a{@code PropertyInducingElement}.
3307 * @coverage dart.engine.element
3308 */
3309 abstract class PropertyInducingElementImpl extends VariableElementImpl implement s PropertyInducingElement {
3310 /**
3311 * The getter associated with this element.
3312 */
3313 PropertyAccessorElement _getter;
3314 /**
3315 * The setter associated with this element, or {@code null} if the element is effectively{@code final} and therefore does not have a setter associated with it .
3316 */
3317 PropertyAccessorElement _setter;
3318 /**
3319 * An empty array of elements.
3320 */
3321 static List<PropertyInducingElement> EMPTY_ARRAY = new List<PropertyInducingEl ement>(0);
3322 /**
3323 * Initialize a newly created element to have the given name.
3324 * @param name the name of this element
3325 */
3326 PropertyInducingElementImpl.con1(Identifier name) : super.con1(name) {
3327 _jtd_constructor_189_impl(name);
3328 }
3329 _jtd_constructor_189_impl(Identifier name) {
3330 }
3331 /**
3332 * Initialize a newly created synthetic element to have the given name.
3333 * @param name the name of this element
3334 */
3335 PropertyInducingElementImpl.con2(String name) : super.con2(name, -1) {
3336 _jtd_constructor_190_impl(name);
3337 }
3338 _jtd_constructor_190_impl(String name) {
3339 synthetic = true;
3340 }
3341 PropertyAccessorElement get getter => _getter;
3342 PropertyAccessorElement get setter => _setter;
3343 /**
3344 * Set the getter associated with this element to the given accessor.
3345 * @param getter the getter associated with this element
3346 */
3347 void set getter(PropertyAccessorElement getter2) {
3348 this._getter = getter2;
3349 }
3350 /**
3351 * Set the setter associated with this element to the given accessor.
3352 * @param setter the setter associated with this element
3353 */
3354 void set setter(PropertyAccessorElement setter2) {
3355 this._setter = setter2;
3356 }
3357 }
3358 /**
3359 * Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowComb inator}.
3360 * @coverage dart.engine.element
3361 */
3362 class ShowCombinatorImpl implements ShowCombinator {
3363 /**
3364 * The names that are to be made visible in the importing library if they are defined in the
3365 * imported library.
3366 */
3367 List<String> _shownNames = StringUtilities.EMPTY_ARRAY;
3368 /**
3369 * Initialize a newly created combinator.
3370 */
3371 ShowCombinatorImpl() : super() {
3372 }
3373 List<String> get shownNames => _shownNames;
3374 /**
3375 * Set the names that are to be made visible in the importing library if they are defined in the
3376 * imported library to the given names.
3377 * @param shownNames the names that are to be made visible in the importing li brary
3378 */
3379 void set shownNames(List<String> shownNames2) {
3380 this._shownNames = shownNames2;
3381 }
3382 String toString() {
3383 JavaStringBuilder builder = new JavaStringBuilder();
3384 builder.append("show ");
3385 int count = _shownNames.length;
3386 for (int i = 0; i < count; i++) {
3387 if (i > 0) {
3388 builder.append(", ");
3389 }
3390 builder.append(_shownNames[i]);
3391 }
3392 return builder.toString();
3393 }
3394 }
3395 /**
3396 * Instances of the class {@code TopLevelVariableElementImpl} implement a{@code TopLevelVariableElement}.
3397 * @coverage dart.engine.element
3398 */
3399 class TopLevelVariableElementImpl extends PropertyInducingElementImpl implements TopLevelVariableElement {
3400 /**
3401 * An empty array of top-level variable elements.
3402 */
3403 static List<TopLevelVariableElement> EMPTY_ARRAY = new List<TopLevelVariableEl ement>(0);
3404 /**
3405 * Initialize a newly created top-level variable element to have the given nam e.
3406 * @param name the name of this element
3407 */
3408 TopLevelVariableElementImpl.con1(Identifier name) : super.con1(name) {
3409 _jtd_constructor_192_impl(name);
3410 }
3411 _jtd_constructor_192_impl(Identifier name) {
3412 }
3413 /**
3414 * Initialize a newly created synthetic top-level variable element to have the given name.
3415 * @param name the name of this element
3416 */
3417 TopLevelVariableElementImpl.con2(String name) : super.con2(name) {
3418 _jtd_constructor_193_impl(name);
3419 }
3420 _jtd_constructor_193_impl(String name) {
3421 }
3422 accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
3423 ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
3424 bool isStatic() => true;
3425 }
3426 /**
3427 * Instances of the class {@code TypeAliasElementImpl} implement a {@code TypeAl iasElement}.
3428 * @coverage dart.engine.element
3429 */
3430 class TypeAliasElementImpl extends ElementImpl implements TypeAliasElement {
3431 /**
3432 * An array containing all of the parameters defined by this type alias.
3433 */
3434 List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
3435 /**
3436 * The type of function defined by this type alias.
3437 */
3438 FunctionType _type;
3439 /**
3440 * An array containing all of the type variables defined for this type.
3441 */
3442 List<TypeVariableElement> _typeVariables = TypeVariableElementImpl.EMPTY_ARRAY ;
3443 /**
3444 * An empty array of type alias elements.
3445 */
3446 static List<TypeAliasElement> EMPTY_ARRAY = new List<TypeAliasElement>(0);
3447 /**
3448 * Initialize a newly created type alias element to have the given name.
3449 * @param name the name of this element
3450 */
3451 TypeAliasElementImpl(Identifier name) : super.con1(name) {
3452 }
3453 accept(ElementVisitor visitor) => visitor.visitTypeAliasElement(this);
3454 ElementImpl getChild(String identifier29) {
3455 for (VariableElement parameter in _parameters) {
3456 if (((parameter as VariableElementImpl)).identifier == identifier29) {
3457 return parameter as VariableElementImpl;
3458 }
3459 }
3460 for (TypeVariableElement typeVariable in _typeVariables) {
3461 if (((typeVariable as TypeVariableElementImpl)).identifier == identifier29 ) {
3462 return typeVariable as TypeVariableElementImpl;
3463 }
3464 }
3465 return null;
3466 }
3467 CompilationUnitElement get enclosingElement => super.enclosingElement as Compi lationUnitElement;
3468 ElementKind get kind => ElementKind.TYPE_ALIAS;
3469 List<ParameterElement> get parameters => _parameters;
3470 FunctionType get type => _type;
3471 List<TypeVariableElement> get typeVariables => _typeVariables;
3472 /**
3473 * Set the parameters defined by this type alias to the given parameters.
3474 * @param parameters the parameters defined by this type alias
3475 */
3476 void set parameters(List<ParameterElement> parameters8) {
3477 if (parameters8 != null) {
3478 for (ParameterElement parameter in parameters8) {
3479 ((parameter as ParameterElementImpl)).enclosingElement = this;
3480 }
3481 }
3482 this._parameters = parameters8;
3483 }
3484 /**
3485 * Set the type of function defined by this type alias to the given type.
3486 * @param type the type of function defined by this type alias
3487 */
3488 void set type(FunctionType type8) {
3489 this._type = type8;
3490 }
3491 /**
3492 * Set the type variables defined for this type to the given variables.
3493 * @param typeVariables the type variables defined for this type
3494 */
3495 void set typeVariables(List<TypeVariableElement> typeVariables3) {
3496 for (TypeVariableElement variable in typeVariables3) {
3497 ((variable as TypeVariableElementImpl)).enclosingElement = this;
3498 }
3499 this._typeVariables = typeVariables3;
3500 }
3501 void visitChildren(ElementVisitor<Object> visitor) {
3502 super.visitChildren(visitor);
3503 safelyVisitChildren(_parameters, visitor);
3504 safelyVisitChildren(_typeVariables, visitor);
3505 }
3506 void appendTo(JavaStringBuilder builder) {
3507 builder.append("typedef ");
3508 builder.append(name);
3509 int variableCount = _typeVariables.length;
3510 if (variableCount > 0) {
3511 builder.append("<");
3512 for (int i = 0; i < variableCount; i++) {
3513 if (i > 0) {
3514 builder.append(", ");
3515 }
3516 ((_typeVariables[i] as TypeVariableElementImpl)).appendTo(builder);
3517 }
3518 builder.append(">");
3519 }
3520 builder.append("(");
3521 int parameterCount = _parameters.length;
3522 for (int i = 0; i < parameterCount; i++) {
3523 if (i > 0) {
3524 builder.append(", ");
3525 }
3526 ((_parameters[i] as ParameterElementImpl)).appendTo(builder);
3527 }
3528 builder.append(")");
3529 if (_type != null) {
3530 builder.append(" -> ");
3531 builder.append(_type.returnType);
3532 }
3533 }
3534 }
3535 /**
3536 * Instances of the class {@code TypeVariableElementImpl} implement a {@code Typ eVariableElement}.
3537 * @coverage dart.engine.element
3538 */
3539 class TypeVariableElementImpl extends ElementImpl implements TypeVariableElement {
3540 /**
3541 * The type defined by this type variable.
3542 */
3543 TypeVariableType _type;
3544 /**
3545 * The type representing the bound associated with this variable, or {@code nu ll} if this variable
3546 * does not have an explicit bound.
3547 */
3548 Type2 _bound;
3549 /**
3550 * An empty array of type variable elements.
3551 */
3552 static List<TypeVariableElement> EMPTY_ARRAY = new List<TypeVariableElement>(0 );
3553 /**
3554 * Initialize a newly created type variable element to have the given name.
3555 * @param name the name of this element
3556 */
3557 TypeVariableElementImpl(Identifier name) : super.con1(name) {
3558 }
3559 accept(ElementVisitor visitor) => visitor.visitTypeVariableElement(this);
3560 Type2 get bound => _bound;
3561 ElementKind get kind => ElementKind.TYPE_VARIABLE;
3562 TypeVariableType get type => _type;
3563 /**
3564 * Set the type representing the bound associated with this variable to the gi ven type.
3565 * @param bound the type representing the bound associated with this variable
3566 */
3567 void set bound(Type2 bound2) {
3568 this._bound = bound2;
3569 }
3570 /**
3571 * Set the type defined by this type variable to the given type
3572 * @param type the type defined by this type variable
3573 */
3574 void set type(TypeVariableType type9) {
3575 this._type = type9;
3576 }
3577 void appendTo(JavaStringBuilder builder) {
3578 builder.append(name);
3579 if (_bound != null) {
3580 builder.append(" extends ");
3581 builder.append(_bound);
3582 }
3583 }
3584 }
3585 /**
3586 * Instances of the class {@code VariableElementImpl} implement a {@code Variabl eElement}.
3587 * @coverage dart.engine.element
3588 */
3589 abstract class VariableElementImpl extends ElementImpl implements VariableElemen t {
3590 /**
3591 * The declared type of this variable.
3592 */
3593 Type2 _type;
3594 /**
3595 * A synthetic function representing this variable's initializer, or {@code nu ll} if this variable
3596 * does not have an initializer.
3597 */
3598 FunctionElement _initializer;
3599 /**
3600 * An empty array of variable elements.
3601 */
3602 static List<VariableElement> EMPTY_ARRAY = new List<VariableElement>(0);
3603 /**
3604 * Initialize a newly created variable element to have the given name.
3605 * @param name the name of this element
3606 */
3607 VariableElementImpl.con1(Identifier name) : super.con1(name) {
3608 _jtd_constructor_196_impl(name);
3609 }
3610 _jtd_constructor_196_impl(Identifier name) {
3611 }
3612 /**
3613 * Initialize a newly created variable element to have the given name.
3614 * @param name the name of this element
3615 * @param nameOffset the offset of the name of this element in the file that c ontains the
3616 * declaration of this element
3617 */
3618 VariableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameO ffset) {
3619 _jtd_constructor_197_impl(name, nameOffset);
3620 }
3621 _jtd_constructor_197_impl(String name, int nameOffset) {
3622 }
3623 FunctionElement get initializer => _initializer;
3624 Type2 get type => _type;
3625 bool isConst() => hasModifier(Modifier.CONST);
3626 bool isFinal() => hasModifier(Modifier.FINAL);
3627 /**
3628 * Set whether this variable is const to correspond to the given value.
3629 * @param isConst {@code true} if the variable is const
3630 */
3631 void set const2(bool isConst) {
3632 setModifier(Modifier.CONST, isConst);
3633 }
3634 /**
3635 * Set whether this variable is final to correspond to the given value.
3636 * @param isFinal {@code true} if the variable is final
3637 */
3638 void set final2(bool isFinal) {
3639 setModifier(Modifier.FINAL, isFinal);
3640 }
3641 /**
3642 * Set the function representing this variable's initializer to the given func tion.
3643 * @param initializer the function representing this variable's initializer
3644 */
3645 void set initializer(FunctionElement initializer3) {
3646 if (initializer3 != null) {
3647 ((initializer3 as FunctionElementImpl)).enclosingElement = this;
3648 }
3649 this._initializer = initializer3;
3650 }
3651 /**
3652 * Set the declared type of this variable to the given type.
3653 * @param type the declared type of this variable
3654 */
3655 void set type(Type2 type10) {
3656 this._type = type10;
3657 }
3658 void visitChildren(ElementVisitor<Object> visitor) {
3659 super.visitChildren(visitor);
3660 safelyVisitChild(_initializer, visitor);
3661 }
3662 void appendTo(JavaStringBuilder builder) {
3663 builder.append(type);
3664 builder.append(" ");
3665 builder.append(name);
3666 }
3667 }
3668 /**
3669 * The unique instance of the class {@code BottomTypeImpl} implements the type { @code bottom}.
3670 * @coverage dart.engine.type
3671 */
3672 class BottomTypeImpl extends TypeImpl {
3673 /**
3674 * The unique instance of this class.
3675 */
3676 static BottomTypeImpl _INSTANCE = new BottomTypeImpl();
3677 /**
3678 * Return the unique instance of this class.
3679 * @return the unique instance of this class
3680 */
3681 static BottomTypeImpl get instance => _INSTANCE;
3682 /**
3683 * Prevent the creation of instances of this class.
3684 */
3685 BottomTypeImpl() : super(null, "<bottom>") {
3686 }
3687 bool operator ==(Object object) => identical(object, this);
3688 bool isMoreSpecificThan(Type2 type) => true;
3689 bool isSubtypeOf(Type2 type) => true;
3690 bool isSupertypeOf(Type2 type) => false;
3691 BottomTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTyp es) => this;
3692 }
3693 /**
3694 * The unique instance of the class {@code DynamicTypeImpl} implements the type {@code dynamic}.
3695 * @coverage dart.engine.type
3696 */
3697 class DynamicTypeImpl extends TypeImpl {
3698 /**
3699 * The unique instance of this class.
3700 */
3701 static DynamicTypeImpl _INSTANCE = new DynamicTypeImpl();
3702 /**
3703 * Return the unique instance of this class.
3704 * @return the unique instance of this class
3705 */
3706 static DynamicTypeImpl get instance => _INSTANCE;
3707 /**
3708 * Prevent the creation of instances of this class.
3709 */
3710 DynamicTypeImpl() : super(new DynamicElementImpl(), Keyword.DYNAMIC.syntax) {
3711 ((element as DynamicElementImpl)).type = this;
3712 }
3713 bool operator ==(Object object) => object is DynamicTypeImpl;
3714 bool isDynamic() => true;
3715 bool isMoreSpecificThan(Type2 type) => false;
3716 bool isSubtypeOf(Type2 type) => identical(this, type);
3717 bool isSupertypeOf(Type2 type) => true;
3718 DynamicTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTy pes) => this;
3719 }
3720 /**
3721 * Instances of the class {@code FunctionTypeImpl} defines the behavior common t o objects
3722 * representing the type of a function, method, constructor, getter, or setter.
3723 * @coverage dart.engine.type
3724 */
3725 class FunctionTypeImpl extends TypeImpl implements FunctionType {
3726 /**
3727 * Return {@code true} if all of the name/type pairs in the first map are equa l to the
3728 * corresponding name/type pairs in the second map. The maps are expected to i terate over their
3729 * entries in the same order in which those entries were added to the map.
3730 * @param firstTypes the first map of name/type pairs being compared
3731 * @param secondTypes the second map of name/type pairs being compared
3732 * @return {@code true} if all of the name/type pairs in the first map are equ al to the
3733 * corresponding name/type pairs in the second map
3734 */
3735 static bool equals2(Map<String, Type2> firstTypes, Map<String, Type2> secondTy pes) {
3736 if (secondTypes.length != firstTypes.length) {
3737 return false;
3738 }
3739 JavaIterator<MapEntry<String, Type2>> firstIterator = new JavaIterator(getMa pEntrySet(firstTypes));
3740 JavaIterator<MapEntry<String, Type2>> secondIterator = new JavaIterator(getM apEntrySet(firstTypes));
3741 while (firstIterator.hasNext) {
3742 MapEntry<String, Type2> firstEntry = firstIterator.next();
3743 MapEntry<String, Type2> secondEntry = secondIterator.next();
3744 if (firstEntry.getKey() != secondEntry.getKey() || firstEntry.getValue() ! = secondEntry.getValue()) {
3745 return false;
3746 }
3747 }
3748 return true;
3749 }
3750 /**
3751 * Return a map containing the results of using the given argument types and p arameter types to
3752 * perform a substitution on all of the values in the given map. The order of the entries will be
3753 * preserved.
3754 * @param types the types on which a substitution is to be performed
3755 * @param argumentTypes the argument types for the substitution
3756 * @param parameterTypes the parameter types for the substitution
3757 * @return the result of performing the substitution on each of the types
3758 */
3759 static Map<String, Type2> substitute3(Map<String, Type2> types, List<Type2> ar gumentTypes, List<Type2> parameterTypes) {
3760 if (types.isEmpty) {
3761 return types;
3762 }
3763 LinkedHashMap<String, Type2> newTypes = new LinkedHashMap<String, Type2>();
3764 for (MapEntry<String, Type2> entry in getMapEntrySet(types)) {
3765 newTypes[entry.getKey()] = entry.getValue().substitute2(argumentTypes, par ameterTypes);
3766 }
3767 return newTypes;
3768 }
3769 /**
3770 * An array containing the actual types of the type arguments.
3771 */
3772 List<Type2> _typeArguments = TypeImpl.EMPTY_ARRAY;
3773 /**
3774 * An array containing the types of the normal parameters of this type of func tion. The parameter
3775 * types are in the same order as they appear in the declaration of the functi on.
3776 * @return the types of the normal parameters of this type of function
3777 */
3778 List<Type2> _normalParameterTypes = TypeImpl.EMPTY_ARRAY;
3779 /**
3780 * A table mapping the names of optional (positional) parameters to the types of the optional
3781 * parameters of this type of function.
3782 */
3783 List<Type2> _optionalParameterTypes = TypeImpl.EMPTY_ARRAY;
3784 /**
3785 * A table mapping the names of named parameters to the types of the named par ameters of this type
3786 * of function.
3787 */
3788 Map<String, Type2> _namedParameterTypes = new Map();
3789 /**
3790 * The type of object returned by this type of function.
3791 */
3792 Type2 _returnType = VoidTypeImpl.instance;
3793 /**
3794 * Initialize a newly created function type to be declared by the given elemen t and to have the
3795 * given name.
3796 * @param element the element representing the declaration of the function typ e
3797 */
3798 FunctionTypeImpl.con1(ExecutableElement element) : super(element, element == n ull ? null : element.name) {
3799 _jtd_constructor_248_impl(element);
3800 }
3801 _jtd_constructor_248_impl(ExecutableElement element) {
3802 }
3803 /**
3804 * Initialize a newly created function type to be declared by the given elemen t and to have the
3805 * given name.
3806 * @param element the element representing the declaration of the function typ e
3807 */
3808 FunctionTypeImpl.con2(TypeAliasElement element) : super(element, element == nu ll ? null : element.name) {
3809 _jtd_constructor_249_impl(element);
3810 }
3811 _jtd_constructor_249_impl(TypeAliasElement element) {
3812 }
3813 bool operator ==(Object object) {
3814 if (object is! FunctionTypeImpl) {
3815 return false;
3816 }
3817 FunctionTypeImpl otherType = object as FunctionTypeImpl;
3818 return element == otherType.element && JavaArrays.equals(_normalParameterTyp es, otherType._normalParameterTypes) && JavaArrays.equals(_optionalParameterType s, otherType._optionalParameterTypes) && equals2(_namedParameterTypes, otherType ._namedParameterTypes);
3819 }
3820 Map<String, Type2> get namedParameterTypes => _namedParameterTypes;
3821 List<Type2> get normalParameterTypes => _normalParameterTypes;
3822 List<Type2> get optionalParameterTypes => _optionalParameterTypes;
3823 Type2 get returnType => _returnType;
3824 List<Type2> get typeArguments => _typeArguments;
3825 int get hashCode {
3826 Element element39 = element;
3827 if (element39 == null) {
3828 return 0;
3829 }
3830 return element39.hashCode;
3831 }
3832 bool isSubtypeOf(Type2 type) {
3833 if (type == null) {
3834 return false;
3835 } else if (identical(this, type) || type.isDynamic() || type.isDartCoreFunct ion()) {
3836 return true;
3837 } else if (type is! FunctionType) {
3838 return false;
3839 } else if (this == type) {
3840 return true;
3841 }
3842 FunctionType t = this;
3843 FunctionType s = type as FunctionType;
3844 if (t.normalParameterTypes.length != s.normalParameterTypes.length) {
3845 return false;
3846 } else if (t.normalParameterTypes.length > 0) {
3847 List<Type2> tTypes = t.normalParameterTypes;
3848 List<Type2> sTypes = s.normalParameterTypes;
3849 for (int i = 0; i < tTypes.length; i++) {
3850 if (!tTypes[i].isAssignableTo(sTypes[i])) {
3851 return false;
3852 }
3853 }
3854 }
3855 if (t.optionalParameterTypes.length > 0) {
3856 List<Type2> tOpTypes = t.optionalParameterTypes;
3857 List<Type2> sOpTypes = s.optionalParameterTypes;
3858 if (tOpTypes.length < sOpTypes.length) {
3859 return false;
3860 }
3861 for (int i = 0; i < sOpTypes.length; i++) {
3862 if (!tOpTypes[i].isAssignableTo(sOpTypes[i])) {
3863 return false;
3864 }
3865 }
3866 if (t.namedParameterTypes.length > 0 || s.namedParameterTypes.length > 0) {
3867 return false;
3868 }
3869 } else if (s.optionalParameterTypes.length > 0) {
3870 return false;
3871 }
3872 if (t.namedParameterTypes.length > 0) {
3873 Map<String, Type2> namedTypesT = t.namedParameterTypes;
3874 Map<String, Type2> namedTypesS = s.namedParameterTypes;
3875 if (namedTypesT.length < namedTypesS.length) {
3876 return false;
3877 }
3878 JavaIterator<MapEntry<String, Type2>> iteratorS = new JavaIterator(getMapE ntrySet(namedTypesS));
3879 while (iteratorS.hasNext) {
3880 MapEntry<String, Type2> entryS = iteratorS.next();
3881 Type2 typeT = namedTypesT[entryS.getKey()];
3882 if (typeT == null) {
3883 return false;
3884 }
3885 if (!entryS.getValue().isAssignableTo(typeT)) {
3886 return false;
3887 }
3888 }
3889 } else if (s.namedParameterTypes.length > 0) {
3890 return false;
3891 }
3892 return s.returnType == VoidTypeImpl.instance || t.returnType.isAssignableTo( s.returnType);
3893 }
3894 /**
3895 * Set the mapping of the names of named parameters to the types of the named parameters of this
3896 * type of function to the given mapping.
3897 * @param namedParameterTypes the mapping of the names of named parameters to the types of the
3898 * named parameters of this type of function
3899 */
3900 void set namedParameterTypes(LinkedHashMap<String, Type2> namedParameterTypes2 ) {
3901 this._namedParameterTypes = namedParameterTypes2;
3902 }
3903 /**
3904 * Set the types of the normal parameters of this type of function to the type s in the given
3905 * array.
3906 * @param normalParameterTypes the types of the normal parameters of this type of function
3907 */
3908 void set normalParameterTypes(List<Type2> normalParameterTypes2) {
3909 this._normalParameterTypes = normalParameterTypes2;
3910 }
3911 /**
3912 * Set the types of the optional parameters of this type of function to the ty pes in the given
3913 * array.
3914 * @param optionalParameterTypes the types of the optional parameters of this type of function
3915 */
3916 void set optionalParameterTypes(List<Type2> optionalParameterTypes2) {
3917 this._optionalParameterTypes = optionalParameterTypes2;
3918 }
3919 /**
3920 * Set the type of object returned by this type of function to the given type.
3921 * @param returnType the type of object returned by this type of function
3922 */
3923 void set returnType(Type2 returnType3) {
3924 this._returnType = returnType3;
3925 }
3926 /**
3927 * Set the actual types of the type arguments to the given types.
3928 * @param typeArguments the actual types of the type arguments
3929 */
3930 void set typeArguments(List<Type2> typeArguments4) {
3931 this._typeArguments = typeArguments4;
3932 }
3933 FunctionTypeImpl substitute4(List<Type2> argumentTypes) => substitute2(argumen tTypes, typeArguments);
3934 FunctionTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterT ypes) {
3935 if (argumentTypes.length != parameterTypes.length) {
3936 throw new IllegalArgumentException("argumentTypes.length (${argumentTypes. length}) != parameterTypes.length (${parameterTypes.length})");
3937 }
3938 if (argumentTypes.length == 0) {
3939 return this;
3940 }
3941 Element element40 = element;
3942 FunctionTypeImpl newType = (element40 is ExecutableElement) ? new FunctionTy peImpl.con1((element40 as ExecutableElement)) : new FunctionTypeImpl.con2((eleme nt40 as TypeAliasElement));
3943 newType.returnType = _returnType.substitute2(argumentTypes, parameterTypes);
3944 newType.normalParameterTypes = TypeImpl.substitute(_normalParameterTypes, ar gumentTypes, parameterTypes);
3945 newType.optionalParameterTypes = TypeImpl.substitute(_optionalParameterTypes , argumentTypes, parameterTypes);
3946 newType._namedParameterTypes = substitute3(_namedParameterTypes, argumentTyp es, parameterTypes);
3947 return newType;
3948 }
3949 void appendTo(JavaStringBuilder builder) {
3950 builder.append("(");
3951 bool needsComma = false;
3952 if (_normalParameterTypes.length > 0) {
3953 for (Type2 type in _normalParameterTypes) {
3954 if (needsComma) {
3955 builder.append(", ");
3956 } else {
3957 needsComma = true;
3958 }
3959 ((type as TypeImpl)).appendTo(builder);
3960 }
3961 }
3962 if (_optionalParameterTypes.length > 0) {
3963 if (needsComma) {
3964 builder.append(", ");
3965 needsComma = false;
3966 }
3967 builder.append("[");
3968 for (Type2 type in _optionalParameterTypes) {
3969 if (needsComma) {
3970 builder.append(", ");
3971 } else {
3972 needsComma = true;
3973 }
3974 ((type as TypeImpl)).appendTo(builder);
3975 }
3976 builder.append("]");
3977 needsComma = true;
3978 }
3979 if (_namedParameterTypes.length > 0) {
3980 if (needsComma) {
3981 builder.append(", ");
3982 needsComma = false;
3983 }
3984 builder.append("{");
3985 for (MapEntry<String, Type2> entry in getMapEntrySet(_namedParameterTypes) ) {
3986 if (needsComma) {
3987 builder.append(", ");
3988 } else {
3989 needsComma = true;
3990 }
3991 builder.append(entry.getKey());
3992 builder.append(": ");
3993 ((entry.getValue() as TypeImpl)).appendTo(builder);
3994 }
3995 builder.append("}");
3996 needsComma = true;
3997 }
3998 builder.append(") -> ");
3999 if (_returnType == null) {
4000 builder.append("null");
4001 } else {
4002 ((_returnType as TypeImpl)).appendTo(builder);
4003 }
4004 }
4005 }
4006 /**
4007 * Instances of the class {@code InterfaceTypeImpl} defines the behavior common to objects
4008 * representing the type introduced by either a class or an interface, or a refe rence to such a
4009 * type.
4010 * @coverage dart.engine.type
4011 */
4012 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
4013 /**
4014 * An empty array of types.
4015 */
4016 static List<InterfaceType> EMPTY_ARRAY = new List<InterfaceType>(0);
4017 /**
4018 * This method computes the longest inheritance path from some passed {@link T ype} to Object.
4019 * @param type the {@link Type} to compute the longest inheritance path of fro m the passed{@link Type} to Object
4020 * @return the computed longest inheritance path to Object
4021 * @see #computeLongestInheritancePathToObject(Type,int)
4022 * @see InterfaceType#getLeastUpperBound(Type)
4023 */
4024 static int computeLongestInheritancePathToObject(InterfaceType type) => comput eLongestInheritancePathToObject2(type, 0);
4025 /**
4026 * Returns the set of all superinterfaces of the passed {@link Type}.
4027 * @param type the {@link Type} to compute the set of superinterfaces of
4028 * @return the {@link Set} of superinterfaces of the passed {@link Type}
4029 * @see #computeSuperinterfaceSet(Type,HashSet)
4030 * @see #getLeastUpperBound(Type)
4031 */
4032 static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => comp uteSuperinterfaceSet2(type, new Set<InterfaceType>());
4033 /**
4034 * This method computes the longest inheritance path from some passed {@link T ype} to Object. This
4035 * method calls itself recursively, callers should use the public method{@link #computeLongestInheritancePathToObject(Type)}.
4036 * @param type the {@link Type} to compute the longest inheritance path of fro m the passed{@link Type} to Object
4037 * @param depth a field used recursively
4038 * @return the computed longest inheritance path to Object
4039 * @see #computeLongestInheritancePathToObject(Type)
4040 * @see #getLeastUpperBound(Type)
4041 */
4042 static int computeLongestInheritancePathToObject2(InterfaceType type, int dept h) {
4043 ClassElement classElement = type.element;
4044 if (classElement.supertype == null) {
4045 return depth;
4046 }
4047 List<InterfaceType> superinterfaces = classElement.interfaces;
4048 int longestPath = 1;
4049 int pathLength;
4050 if (superinterfaces.length > 0) {
4051 for (InterfaceType superinterface in superinterfaces) {
4052 pathLength = computeLongestInheritancePathToObject2(superinterface, dept h + 1);
4053 if (pathLength > longestPath) {
4054 longestPath = pathLength;
4055 }
4056 }
4057 }
4058 InterfaceType supertype3 = classElement.supertype;
4059 pathLength = computeLongestInheritancePathToObject2(supertype3, depth + 1);
4060 if (pathLength > longestPath) {
4061 longestPath = pathLength;
4062 }
4063 return longestPath;
4064 }
4065 /**
4066 * Returns the set of all superinterfaces of the passed {@link Type}. This is a recursive method,
4067 * callers should call the public {@link #computeSuperinterfaceSet(Type)}.
4068 * @param type the {@link Type} to compute the set of superinterfaces of
4069 * @param set a {@link HashSet} used recursively by this method
4070 * @return the {@link Set} of superinterfaces of the passed {@link Type}
4071 * @see #computeSuperinterfaceSet(Type)
4072 * @see #getLeastUpperBound(Type)
4073 */
4074 static Set<InterfaceType> computeSuperinterfaceSet2(InterfaceType type, Set<In terfaceType> set) {
4075 Element element41 = type.element;
4076 if (element41 != null && element41 is ClassElement) {
4077 ClassElement classElement = element41 as ClassElement;
4078 List<InterfaceType> superinterfaces = classElement.interfaces;
4079 for (InterfaceType superinterface in superinterfaces) {
4080 javaSetAdd(set, superinterface);
4081 computeSuperinterfaceSet2(superinterface, set);
4082 }
4083 InterfaceType supertype4 = classElement.supertype;
4084 if (supertype4 != null) {
4085 javaSetAdd(set, supertype4);
4086 computeSuperinterfaceSet2(supertype4, set);
4087 }
4088 }
4089 return set;
4090 }
4091 /**
4092 * An array containing the actual types of the type arguments.
4093 */
4094 List<Type2> _typeArguments = TypeImpl.EMPTY_ARRAY;
4095 /**
4096 * Initialize a newly created type to be declared by the given element.
4097 * @param element the element representing the declaration of the type
4098 */
4099 InterfaceTypeImpl.con1(ClassElement element) : super(element, element.name) {
4100 _jtd_constructor_250_impl(element);
4101 }
4102 _jtd_constructor_250_impl(ClassElement element) {
4103 }
4104 /**
4105 * Initialize a newly created type to have the given name. This constructor sh ould only be used in
4106 * cases where there is no declaration of the type.
4107 * @param name the name of the type
4108 */
4109 InterfaceTypeImpl.con2(String name) : super(null, name) {
4110 _jtd_constructor_251_impl(name);
4111 }
4112 _jtd_constructor_251_impl(String name) {
4113 }
4114 bool operator ==(Object object) {
4115 if (object is! InterfaceTypeImpl) {
4116 return false;
4117 }
4118 InterfaceTypeImpl otherType = object as InterfaceTypeImpl;
4119 return element == otherType.element && JavaArrays.equals(_typeArguments, oth erType._typeArguments);
4120 }
4121 ClassElement get element => super.element as ClassElement;
4122 Type2 getLeastUpperBound(Type2 type) {
4123 Type2 dynamicType = DynamicTypeImpl.instance;
4124 if (identical(this, dynamicType) || identical(type, dynamicType)) {
4125 return dynamicType;
4126 }
4127 if (type == null || type is! InterfaceType) {
4128 return null;
4129 }
4130 InterfaceType i = this;
4131 InterfaceType j = type as InterfaceType;
4132 Set<InterfaceType> si = computeSuperinterfaceSet(i);
4133 Set<InterfaceType> sj = computeSuperinterfaceSet(j);
4134 javaSetAdd(si, i);
4135 javaSetAdd(sj, j);
4136 si.retainAll(sj);
4137 Set<InterfaceType> s = si;
4138 List<InterfaceType> sn = new List.from(s);
4139 List<int> depths = new List<int>.filled(sn.length, 0);
4140 int maxDepth = 0;
4141 for (int n = 0; n < sn.length; n++) {
4142 depths[n] = computeLongestInheritancePathToObject(sn[n]);
4143 if (depths[n] > maxDepth) {
4144 maxDepth = depths[n];
4145 }
4146 }
4147 for (; maxDepth >= 0; maxDepth--) {
4148 int indexOfLeastUpperBound = -1;
4149 int numberOfTypesAtMaxDepth = 0;
4150 for (int m = 0; m < depths.length; m++) {
4151 if (depths[m] == maxDepth) {
4152 numberOfTypesAtMaxDepth++;
4153 indexOfLeastUpperBound = m;
4154 }
4155 }
4156 if (numberOfTypesAtMaxDepth == 1) {
4157 return sn[indexOfLeastUpperBound];
4158 }
4159 }
4160 return null;
4161 }
4162 Type2 get superclass {
4163 ClassElement classElement = element;
4164 return element.supertype.substitute2(_typeArguments, TypeVariableTypeImpl.ge tTypes(classElement.typeVariables));
4165 }
4166 List<Type2> get typeArguments => _typeArguments;
4167 int get hashCode {
4168 ClassElement element42 = element;
4169 if (element42 == null) {
4170 return 0;
4171 }
4172 return element42.hashCode;
4173 }
4174 bool isDartCoreFunction() {
4175 ClassElement element43 = element;
4176 if (element43 == null) {
4177 return false;
4178 }
4179 return element43.name == "Function" && element43.library.isDartCore();
4180 }
4181 bool isDirectSupertypeOf(InterfaceType type) {
4182 ClassElement i = element;
4183 ClassElement j = type.element;
4184 InterfaceType supertype5 = j.supertype;
4185 if (supertype5 == null) {
4186 return false;
4187 }
4188 ClassElement supertypeElement = supertype5.element;
4189 if (supertypeElement == i) {
4190 return true;
4191 }
4192 for (InterfaceType interfaceType in j.interfaces) {
4193 if (interfaceType.element == i) {
4194 return true;
4195 }
4196 }
4197 for (InterfaceType mixinType in j.mixins) {
4198 if (mixinType.element == i) {
4199 return true;
4200 }
4201 }
4202 return false;
4203 }
4204 bool isMoreSpecificThan(Type2 type) {
4205 if (identical(type, DynamicTypeImpl.instance)) {
4206 return true;
4207 } else if (type is! InterfaceType) {
4208 return false;
4209 }
4210 InterfaceType s = type as InterfaceType;
4211 if (this == s) {
4212 return true;
4213 }
4214 if (s.isDirectSupertypeOf(this)) {
4215 return true;
4216 }
4217 ClassElement tElement = element;
4218 ClassElement sElement = s.element;
4219 if (tElement == sElement) {
4220 List<Type2> tArguments = typeArguments;
4221 List<Type2> sArguments = s.typeArguments;
4222 if (tArguments.length != sArguments.length) {
4223 return false;
4224 }
4225 for (int i = 0; i < tArguments.length; i++) {
4226 if (!tArguments[i].isMoreSpecificThan(sArguments[i])) {
4227 return false;
4228 }
4229 }
4230 return true;
4231 }
4232 if (element.supertype == null) {
4233 return false;
4234 }
4235 return element.supertype.isMoreSpecificThan(type);
4236 }
4237 bool isSubtypeOf(Type2 type) {
4238 if (identical(type, DynamicTypeImpl.instance)) {
4239 return true;
4240 } else if (type is TypeVariableType) {
4241 return true;
4242 } else if (type is! InterfaceType) {
4243 return false;
4244 } else if (this == type) {
4245 return true;
4246 }
4247 InterfaceType typeT = this;
4248 InterfaceType typeS = type as InterfaceType;
4249 ClassElement elementT = element;
4250 if (elementT == null) {
4251 return false;
4252 }
4253 typeT = substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(elementT.t ypeVariables));
4254 if (typeT == typeS) {
4255 return true;
4256 } else if (elementT == typeS.element) {
4257 List<Type2> typeTArgs = typeT.typeArguments;
4258 List<Type2> typeSArgs = typeS.typeArguments;
4259 if (typeTArgs.length != typeSArgs.length) {
4260 return false;
4261 }
4262 for (int i = 0; i < typeTArgs.length; i++) {
4263 if (!typeTArgs[i].isSubtypeOf(typeSArgs[i])) {
4264 return false;
4265 }
4266 }
4267 return true;
4268 }
4269 Type2 supertype6 = elementT.supertype;
4270 if (supertype6 == null) {
4271 return false;
4272 }
4273 List<Type2> interfaceTypes = elementT.interfaces;
4274 for (Type2 interfaceType in interfaceTypes) {
4275 if (interfaceType.isSubtypeOf(typeS)) {
4276 return true;
4277 }
4278 }
4279 List<Type2> mixinTypes = elementT.mixins;
4280 for (Type2 mixinType in mixinTypes) {
4281 if (mixinType == typeS) {
4282 return true;
4283 }
4284 }
4285 return supertype6.isSubtypeOf(typeS);
4286 }
4287 /**
4288 * Set the actual types of the type arguments to those in the given array.
4289 * @param typeArguments the actual types of the type arguments
4290 */
4291 void set typeArguments(List<Type2> typeArguments5) {
4292 this._typeArguments = typeArguments5;
4293 }
4294 InterfaceTypeImpl substitute5(List<Type2> argumentTypes) => substitute2(argume ntTypes, typeArguments);
4295 InterfaceTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameter Types) {
4296 if (argumentTypes.length != parameterTypes.length) {
4297 throw new IllegalArgumentException("argumentTypes.length (${argumentTypes. length}) != parameterTypes.length (${parameterTypes.length})");
4298 }
4299 if (argumentTypes.length == 0) {
4300 return this;
4301 }
4302 InterfaceTypeImpl newType = new InterfaceTypeImpl.con1(element);
4303 newType.typeArguments = TypeImpl.substitute(_typeArguments, argumentTypes, p arameterTypes);
4304 return newType;
4305 }
4306 void appendTo(JavaStringBuilder builder) {
4307 builder.append(name);
4308 int argumentCount = _typeArguments.length;
4309 if (argumentCount > 0) {
4310 builder.append("<");
4311 for (int i = 0; i < argumentCount; i++) {
4312 if (i > 0) {
4313 builder.append(", ");
4314 }
4315 ((_typeArguments[i] as TypeImpl)).appendTo(builder);
4316 }
4317 builder.append(">");
4318 }
4319 }
4320 }
4321 /**
4322 * The abstract class {@code TypeImpl} implements the behavior common to objects representing the
4323 * declared type of elements in the element model.
4324 * @coverage dart.engine.type
4325 */
4326 abstract class TypeImpl implements Type2 {
4327 /**
4328 * Return an array containing the results of using the given argument types an d parameter types to
4329 * perform a substitution on all of the given types.
4330 * @param types the types on which a substitution is to be performed
4331 * @param argumentTypes the argument types for the substitution
4332 * @param parameterTypes the parameter types for the substitution
4333 * @return the result of performing the substitution on each of the types
4334 */
4335 static List<Type2> substitute(List<Type2> types, List<Type2> argumentTypes, Li st<Type2> parameterTypes) {
4336 int length6 = types.length;
4337 if (length6 == 0) {
4338 return types;
4339 }
4340 List<Type2> newTypes = new List<Type2>(length6);
4341 for (int i = 0; i < length6; i++) {
4342 newTypes[i] = types[i].substitute2(argumentTypes, parameterTypes);
4343 }
4344 return newTypes;
4345 }
4346 /**
4347 * The element representing the declaration of this type, or {@code null} if t he type has not, or
4348 * cannot, be associated with an element.
4349 */
4350 Element _element;
4351 /**
4352 * The name of this type, or {@code null} if the type does not have a name.
4353 */
4354 String _name;
4355 /**
4356 * An empty array of types.
4357 */
4358 static List<Type2> EMPTY_ARRAY = new List<Type2>(0);
4359 /**
4360 * Initialize a newly created type to be declared by the given element and to have the given name.
4361 * @param element the element representing the declaration of the type
4362 * @param name the name of the type
4363 */
4364 TypeImpl(Element element, String name) {
4365 this._element = element;
4366 this._name = name;
4367 }
4368 Element get element => _element;
4369 Type2 getLeastUpperBound(Type2 type) => null;
4370 String get name => _name;
4371 bool isAssignableTo(Type2 type) => this.isSubtypeOf(type) || type.isSubtypeOf( this);
4372 bool isDartCoreFunction() => false;
4373 bool isDynamic() => false;
4374 bool isMoreSpecificThan(Type2 type) => false;
4375 bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this);
4376 bool isVoid() => false;
4377 String toString() {
4378 JavaStringBuilder builder = new JavaStringBuilder();
4379 appendTo(builder);
4380 return builder.toString();
4381 }
4382 /**
4383 * Append a textual representation of this type to the given builder.
4384 * @param builder the builder to which the text is to be appended
4385 */
4386 void appendTo(JavaStringBuilder builder) {
4387 if (_name == null) {
4388 builder.append("<unnamed type>");
4389 } else {
4390 builder.append(_name);
4391 }
4392 }
4393 }
4394 /**
4395 * Instances of the class {@code TypeVariableTypeImpl} defines the behavior of o bjects representing
4396 * the type introduced by a type variable.
4397 * @coverage dart.engine.type
4398 */
4399 class TypeVariableTypeImpl extends TypeImpl implements TypeVariableType {
4400 /**
4401 * Return an array containing the type variable types defined by the given arr ay of type variable
4402 * elements.
4403 * @param typeVariables the type variable elements defining the type variable types to be returned
4404 * @return the type variable types defined by the type variable elements
4405 */
4406 static List<TypeVariableType> getTypes(List<TypeVariableElement> typeVariables ) {
4407 int count = typeVariables.length;
4408 List<TypeVariableType> types = new List<TypeVariableType>(count);
4409 for (int i = 0; i < count; i++) {
4410 types[i] = typeVariables[i].type;
4411 }
4412 return types;
4413 }
4414 /**
4415 * Initialize a newly created type variable to be declared by the given elemen t and to have the
4416 * given name.
4417 * @param element the element representing the declaration of the type variabl e
4418 */
4419 TypeVariableTypeImpl(TypeVariableElement element) : super(element, element.nam e) {
4420 }
4421 bool operator ==(Object object) => object is TypeVariableTypeImpl && element = = ((object as TypeVariableTypeImpl)).element;
4422 TypeVariableElement get element => super.element as TypeVariableElement;
4423 int get hashCode => element.hashCode;
4424 bool isMoreSpecificThan(Type2 type) {
4425 Type2 upperBound = element.bound;
4426 return type == upperBound;
4427 }
4428 bool isSubtypeOf(Type2 type) => true;
4429 Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) {
4430 int length7 = parameterTypes.length;
4431 for (int i = 0; i < length7; i++) {
4432 if (parameterTypes[i] == this) {
4433 return argumentTypes[i];
4434 }
4435 }
4436 return this;
4437 }
4438 }
4439 /**
4440 * The unique instance of the class {@code VoidTypeImpl} implements the type {@c ode void}.
4441 * @coverage dart.engine.type
4442 */
4443 class VoidTypeImpl extends TypeImpl implements VoidType {
4444 /**
4445 * The unique instance of this class.
4446 */
4447 static VoidTypeImpl _INSTANCE = new VoidTypeImpl();
4448 /**
4449 * Return the unique instance of this class.
4450 * @return the unique instance of this class
4451 */
4452 static VoidTypeImpl get instance => _INSTANCE;
4453 /**
4454 * Prevent the creation of instances of this class.
4455 */
4456 VoidTypeImpl() : super(null, Keyword.VOID.syntax) {
4457 }
4458 bool operator ==(Object object) => identical(object, this);
4459 bool isSubtypeOf(Type2 type) => identical(type, this) || identical(type, Dynam icTypeImpl.instance);
4460 bool isVoid() => true;
4461 VoidTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes ) => this;
4462 }
4463 /**
4464 * The interface {@code FunctionType} defines the behavior common to objects rep resenting the type
4465 * of a function, method, constructor, getter, or setter. Function types come in three variations:
4466 * <ol>
4467 * <li>The types of functions that only have required parameters. These have the general form
4468 * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i>.</li>
4469 * <li>The types of functions with optional positional parameters. These have th e general form
4470 * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub>, &hellip;, T<sub >n+k</sub>]) &rarr;
4471 * T</i>.</li>
4472 * <li>The types of functions with named positional parameters. These have the g eneral form
4473 * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<s ub>xk</sub> xk})
4474 * &rarr; T</i>.</li>
4475 * </ol>
4476 * @coverage dart.engine.type
4477 */
4478 abstract class FunctionType implements Type2 {
4479 /**
4480 * Return a map from the names of named parameters to the types of the named p arameters of this
4481 * type of function. The entries in the map will be iterated in the same order as the order in
4482 * which the named parameters were defined. If there were no named parameters declared then the
4483 * map will be empty.
4484 * @return a map from the name to the types of the named parameters of this ty pe of function
4485 */
4486 Map<String, Type2> get namedParameterTypes;
4487 /**
4488 * Return an array containing the types of the normal parameters of this type of function. The
4489 * parameter types are in the same order as they appear in the declaration of the function.
4490 * @return the types of the normal parameters of this type of function
4491 */
4492 List<Type2> get normalParameterTypes;
4493 /**
4494 * Return a map from the names of optional (positional) parameters to the type s of the optional
4495 * parameters of this type of function. The entries in the map will be iterate d in the same order
4496 * as the order in which the optional parameters were defined. If there were n o optional
4497 * parameters declared then the map will be empty.
4498 * @return a map from the name to the types of the optional parameters of this type of function
4499 */
4500 List<Type2> get optionalParameterTypes;
4501 /**
4502 * Return the type of object returned by this type of function.
4503 * @return the type of object returned by this type of function
4504 */
4505 Type2 get returnType;
4506 /**
4507 * Return an array containing the actual types of the type arguments. If this type's element does
4508 * not have type parameters, then the array should be empty (although it is po ssible for type
4509 * arguments to be erroneously declared). If the element has type parameters a nd the actual type
4510 * does not explicitly include argument values, then the type "dynamic" will b e automatically
4511 * provided.
4512 * @return the actual types of the type arguments
4513 */
4514 List<Type2> get typeArguments;
4515 /**
4516 * Return {@code true} if this type is a subtype of the given type.
4517 * <p>
4518 * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i> is a subtype of the
4519 * function type <i>(S<sub>1</sub>, &hellip;, S<sub>n</sub>) &rarr; S</i>, if all of the following
4520 * conditions are met:
4521 * <ul>
4522 * <li>Either
4523 * <ul>
4524 * <li><i>S</i> is void, or</li>
4525 * <li><i>T &hArr; S</i>.</li>
4526 * </ul>
4527 * </li>
4528 * <li>For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S< sub>i</sub></i>.</li>
4529 * </ul>
4530 * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, [T<sub>n+1</sub >, &hellip;,
4531 * T<sub>n+k</sub>]) &rarr; T</i> is a subtype of the function type <i>(S<sub> 1</sub>, &hellip;,
4532 * S<sub>n</sub>, [S<sub>n+1</sub>, &hellip;, S<sub>n+m</sub>]) &rarr; S</i>, if all of the
4533 * following conditions are met:
4534 * <ul>
4535 * <li>Either
4536 * <ul>
4537 * <li><i>S</i> is void, or</li>
4538 * <li><i>T &hArr; S</i>.</li>
4539 * </ul>
4540 * </li>
4541 * <li><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>
4542 * &hArr; S<sub>i</sub></i>.</li>
4543 * </ul>
4544 * A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;,
4545 * T<sub>xk</sub> xk}) &rarr; T</i> is a subtype of the function type <i>(S<su b>1</sub>, &hellip;,
4546 * S<sub>n</sub>, {S<sub>y1</sub> y1, &hellip;, S<sub>ym</sub> ym}) &rarr; S</ i>, if all of the
4547 * following conditions are met:
4548 * <ul>
4549 * <li>Either
4550 * <ul>
4551 * <li><i>S</i> is void,</li>
4552 * <li>or <i>T &hArr; S</i>.</li>
4553 * </ul>
4554 * </li>
4555 * <li>For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> &hArr; S< sub>i</sub></i>.</li>
4556 * <li><i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>, &he llip;,
4557 * x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>.</li>
4558 * <li>For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, &hellip;, y<sub>m</s ub>}</i>,
4559 * <i>y<sub>i</sub> = x<sub>j</sub> => Tj &hArr; Si</i>.</li>
4560 * </ul>
4561 * In addition, the following subtype rules apply:
4562 * <p>
4563 * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, []) &rarr; T <: (T<sub>1</sub>, &hellip;,
4564 * T<sub>n</sub>) &rarr; T.</i><br>
4565 * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>, &he llip;,
4566 * T<sub>n</sub>, {}) &rarr; T.</i><br>
4567 * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {}) &rarr; T <: (T<sub>1</sub>, &hellip;,
4568 * T<sub>n</sub>) &rarr; T.</i><br>
4569 * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T <: (T<sub>1</sub>, &he llip;,
4570 * T<sub>n</sub>, []) &rarr; T.</i>
4571 * <p>
4572 * All functions implement the class {@code Function}. However not all functio n types are a
4573 * subtype of {@code Function}. If an interface type <i>I</i> includes a metho d named{@code call()}, and the type of {@code call()} is the function type <i>F< /i>, then <i>I</i> is
4574 * considered to be a subtype of <i>F</i>.
4575 * @param type the type being compared with this type
4576 * @return {@code true} if this type is a subtype of the given type
4577 */
4578 bool isSubtypeOf(Type2 type);
4579 /**
4580 * Return the type resulting from substituting the given arguments for this ty pe's parameters.
4581 * This is fully equivalent to {@code substitute(argumentTypes, getTypeArgumen ts())}.
4582 * @param argumentTypes the actual type arguments being substituted for the ty pe parameters
4583 * @return the result of performing the substitution
4584 */
4585 FunctionType substitute4(List<Type2> argumentTypes);
4586 FunctionType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes );
4587 }
4588 /**
4589 * The interface {@code InterfaceType} defines the behavior common to objects re presenting the type
4590 * introduced by either a class or an interface, or a reference to such a type.
4591 * @coverage dart.engine.type
4592 */
4593 abstract class InterfaceType implements Type2 {
4594 ClassElement get element;
4595 /**
4596 * Return the least upper bound of this type and the given type, or {@code nul l} if there is no
4597 * least upper bound.
4598 * <p>
4599 * Given two interfaces <i>I</i> and <i>J</i>, let <i>S<sub>I</sub></i> be the set of
4600 * superinterfaces of <i>I<i>, let <i>S<sub>J</sub></i> be the set of superint erfaces of <i>J</i>
4601 * and let <i>S = (I &cup; S<sub>I</sub>) &cap; (J &cup; S<sub>J</sub>)</i>. F urthermore, we
4602 * define <i>S<sub>n</sub> = {T | T &isin; S &and; depth(T) = n}</i> for any f inite <i>n</i>,
4603 * where <i>depth(T)</i> is the number of steps in the longest inheritance pat h from <i>T</i> to
4604 * <i>Object</i>. Let <i>q</i> be the largest number such that <i>S<sub>q</sub ></i> has
4605 * cardinality one. The least upper bound of <i>I</i> and <i>J</i> is the sole element of
4606 * <i>S<sub>q</sub></i>.
4607 * @param type the other type used to compute the least upper bound
4608 * @return the least upper bound of this type and the given type
4609 */
4610 Type2 getLeastUpperBound(Type2 type);
4611 /**
4612 * Return the type representing the superclass of this type. Note that this is <b>not</b>, in
4613 * general, equivalent to getting the superclass from this type's element beca use the type
4614 * returned by this method will have had it's type parameters replaced.
4615 * @return the superclass of this type
4616 */
4617 Type2 get superclass;
4618 /**
4619 * Return an array containing the actual types of the type arguments. If this type's element does
4620 * not have type parameters, then the array should be empty (although it is po ssible for type
4621 * arguments to be erroneously declared). If the element has type parameters a nd the actual type
4622 * does not explicitly include argument values, then the type "dynamic" will b e automatically
4623 * provided.
4624 * @return the actual types of the type arguments
4625 */
4626 List<Type2> get typeArguments;
4627 /**
4628 * Return {@code true} if this type is a direct supertype of the given type. T he implicit
4629 * interface of class <i>I</i> is a direct supertype of the implicit interface of class <i>J</i>
4630 * iff:
4631 * <ul>
4632 * <li><i>I</i> is Object, and <i>J</i> has no extends clause.</li>
4633 * <li><i>I</i> is listed in the extends clause of <i>J</i>.</li>
4634 * <li><i>I</i> is listed in the implements clause of <i>J</i>.</li>
4635 * <li><i>I</i> is listed in the with clause of <i>J</i>.</li>
4636 * <li><i>J</i> is a mixin application of the mixin of <i>I</i>.</li>
4637 * </ul>
4638 * @param type the type being compared with this type
4639 * @return {@code true} if this type is a direct supertype of the given type
4640 */
4641 bool isDirectSupertypeOf(InterfaceType type);
4642 /**
4643 * Return {@code true} if this type is more specific than the given type. An i nterface type
4644 * <i>T</i> is more specific than an interface type <i>S</i>, written <i>T &la quo; S</i>, if one
4645 * of the following conditions is met:
4646 * <ul>
4647 * <li>Reflexivity: <i>T</i> is <i>S</i>.
4648 * <li><i>T</i> is bottom.
4649 * <li><i>S</i> is dynamic.
4650 * <li>Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
4651 * <li><i>T</i> is a type variable and <i>S</i> is the upper bound of <i>T</i> .
4652 * <li>Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;, T< sub>n</sub>&gt;</i>
4653 * and S</i> is of the form <i>I&lt;S<sub>1</sub>, &hellip;, S<sub>n</sub>&gt; </i> and
4654 * <i>T<sub>i</sub> &laquo; S<sub>i</sub></i>, <i>1 <= i <= n</i>.
4655 * <li>Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
4656 * </ul>
4657 * @param type the type being compared with this type
4658 * @return {@code true} if this type is more specific than the given type
4659 */
4660 bool isMoreSpecificThan(Type2 type);
4661 /**
4662 * Return {@code true} if this type is a subtype of the given type. An interfa ce type <i>T</i> is
4663 * a subtype of an interface type <i>S</i>, written <i>T</i> <: <i>S</i>, iff
4664 * <i>[bottom/dynamic]T</i> &laquo; <i>S</i> (<i>T</i> is more specific than < i>S</i>). If an
4665 * interface type <i>I</i> includes a method named <i>call()</i>, and the type of <i>call()</i> is
4666 * the function type <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>.
4667 * @param type the type being compared with this type
4668 * @return {@code true} if this type is a subtype of the given type
4669 */
4670 bool isSubtypeOf(Type2 type);
4671 /**
4672 * Return the type resulting from substituting the given arguments for this ty pe's parameters.
4673 * This is fully equivalent to {@code substitute(argumentTypes, getTypeArgumen ts())}.
4674 * @param argumentTypes the actual type arguments being substituted for the ty pe parameters
4675 * @return the result of performing the substitution
4676 */
4677 InterfaceType substitute5(List<Type2> argumentTypes);
4678 InterfaceType substitute2(List<Type2> argumentTypes, List<Type2> parameterType s);
4679 }
4680 /**
4681 * The interface {@code Type} defines the behavior of objects representing the d eclared type of
4682 * elements in the element model.
4683 * @coverage dart.engine.type
4684 */
4685 abstract class Type2 {
4686 /**
4687 * Return the element representing the declaration of this type, or {@code nul l} if the type has
4688 * not, or cannot, be associated with an element. The former case will occur i f the element model
4689 * is not yet complete; the latter case will occur if this object represents a n undefined type.
4690 * @return the element representing the declaration of this type
4691 */
4692 Element get element;
4693 /**
4694 * Return the least upper bound of this type and the given type, or {@code nul l} if there is no
4695 * least upper bound.
4696 * @param type the other type used to compute the least upper bound
4697 * @return the least upper bound of this type and the given type
4698 */
4699 Type2 getLeastUpperBound(Type2 type);
4700 /**
4701 * Return the name of this type, or {@code null} if the type does not have a n ame, such as when
4702 * the type represents the type of an unnamed function.
4703 * @return the name of this type
4704 */
4705 String get name;
4706 /**
4707 * Return {@code true} if this type is assignable to the given type. A type <i >T</i> may be
4708 * assigned to a type <i>S</i>, written <i>T</i> &hArr; <i>S</i>, iff either < i>T</i> <: <i>S</i>
4709 * or <i>S</i> <: <i>T</i>.
4710 * @param type the type being compared with this type
4711 * @return {@code true} if this type is assignable to the given type
4712 */
4713 bool isAssignableTo(Type2 type);
4714 /**
4715 * Return {@code true} if this type represents the type 'Function' defined in the dart:core
4716 * library.
4717 * @return {@code true} if this type represents the type 'Function' defined in the dart:core
4718 * library
4719 */
4720 bool isDartCoreFunction();
4721 /**
4722 * Return {@code true} if this type represents the type 'dynamic'.
4723 * @return {@code true} if this type represents the type 'dynamic'
4724 */
4725 bool isDynamic();
4726 /**
4727 * Return {@code true} if this type is more specific than the given type.
4728 * @param type the type being compared with this type
4729 * @return {@code true} if this type is more specific than the given type
4730 */
4731 bool isMoreSpecificThan(Type2 type);
4732 /**
4733 * Return {@code true} if this type is a subtype of the given type.
4734 * @param type the type being compared with this type
4735 * @return {@code true} if this type is a subtype of the given type
4736 */
4737 bool isSubtypeOf(Type2 type);
4738 /**
4739 * Return {@code true} if this type is a supertype of the given type. A type < i>S</i> is a
4740 * supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff <i>T</i> is a subt ype of <i>S</i>.
4741 * @param type the type being compared with this type
4742 * @return {@code true} if this type is a supertype of the given type
4743 */
4744 bool isSupertypeOf(Type2 type);
4745 /**
4746 * Return {@code true} if this type represents the type 'void'.
4747 * @return {@code true} if this type represents the type 'void'
4748 */
4749 bool isVoid();
4750 /**
4751 * Return the type resulting from substituting the given arguments for the giv en parameters in
4752 * this type. The specification defines this operation in section 2: <blockquo te> The notation
4753 * <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ..., y<sub>n</sub>]E</ i> denotes a copy of
4754 * <i>E</i> in which all occurrences of <i>y<sub>i</sub>, 1 <= i <= n</i> have been replaced with
4755 * <i>x<sub>i</sub></i>.</blockquote> Note that, contrary to the specification , this method will
4756 * not create a copy of this type if no substitutions were required, but will return this type
4757 * directly.
4758 * @param argumentTypes the actual type arguments being substituted for the pa rameters
4759 * @param parameterTypes the parameters to be replaced
4760 * @return the result of performing the substitution
4761 */
4762 Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
4763 }
4764 /**
4765 * The interface {@code TypeVariableType} defines the behavior of objects repres enting the type
4766 * introduced by a type variable.
4767 * @coverage dart.engine.type
4768 */
4769 abstract class TypeVariableType implements Type2 {
4770 TypeVariableElement get element;
4771 }
4772 /**
4773 * The interface {@code VoidType} defines the behavior of the unique object repr esenting the type{@code void}.
4774 * @coverage dart.engine.type
4775 */
4776 abstract class VoidType implements Type2 {
4777 VoidType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
4778 }
OLDNEW
« no previous file with comments | « pkg/analyzer-experimental/lib/src/generated/ast.dart ('k') | pkg/analyzer-experimental/lib/src/generated/engine.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698