| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 /// Implementation of the element model used for deserialiation. |
| 6 /// |
| 7 /// These classes are created by [ElementDeserializer] triggered by the |
| 8 /// [Deserializer]. |
| 9 |
| 10 library dart2js.serialization.modelz; |
| 11 |
| 12 import 'serialization.dart'; |
| 13 import 'keys.dart'; |
| 14 import '../constants/expressions.dart'; |
| 15 import '../dart2jslib.dart' |
| 16 show Backend, |
| 17 Compiler, |
| 18 DiagnosticListener, |
| 19 Script, |
| 20 SourceSpan; |
| 21 import '../dart_types.dart'; |
| 22 import '../elements/elements.dart'; |
| 23 import '../elements/modelx.dart' show FunctionSignatureX; |
| 24 import '../elements/common.dart'; |
| 25 import '../elements/visitor.dart'; |
| 26 import '../ordered_typeset.dart'; |
| 27 import '../resolution/resolution.dart'; |
| 28 import '../resolution/class_members.dart' as class_members; |
| 29 import '../resolution/enum_creator.dart' show AstBuilder; |
| 30 import '../scanner/scannerlib.dart' show Token, SEMICOLON_INFO; |
| 31 import '../serialization/constant_serialization.dart'; |
| 32 import '../io/source_file.dart'; |
| 33 import '../tree/tree.dart'; |
| 34 import '../util/util.dart' show Link, LinkBuilder; |
| 35 |
| 36 /// Compute a [Link] from an [Iterable]. |
| 37 Link toLink(Iterable iterable) { |
| 38 LinkBuilder builder = new LinkBuilder(); |
| 39 for (var element in iterable) { |
| 40 builder.addLast(element); |
| 41 } |
| 42 return builder.toLink(); |
| 43 } |
| 44 |
| 45 abstract class ElementZ extends Element with ElementCommon { |
| 46 @override |
| 47 bool get isFactoryConstructor => false; |
| 48 |
| 49 String toString() { |
| 50 if (enclosingElement == null || isTopLevel) return 'Z$kind($name)'; |
| 51 return 'Z$kind(${enclosingElement.name}#$name)'; |
| 52 } |
| 53 |
| 54 _unsupported(text) => throw new UnsupportedError('${this}.$text'); |
| 55 |
| 56 @override |
| 57 AnalyzableElement get analyzableElement { |
| 58 Element element = this; |
| 59 if (element is AnalyzableElement) { |
| 60 return element; |
| 61 } else if (enclosingElement != null) { |
| 62 return enclosingElement.analyzableElement; |
| 63 } |
| 64 return null; |
| 65 } |
| 66 |
| 67 @override |
| 68 FunctionElement asFunctionElement() => null; |
| 69 |
| 70 @override |
| 71 Scope buildScope() => _unsupported('analyzableElement'); |
| 72 |
| 73 @override |
| 74 CompilationUnitElement get compilationUnit { |
| 75 return _unsupported('compilationUnit'); |
| 76 } |
| 77 |
| 78 @override |
| 79 ClassElement get contextClass => _unsupported('contextClass'); |
| 80 |
| 81 @override |
| 82 void diagnose(Element context, DiagnosticListener listener) { |
| 83 _unsupported('diagnose'); |
| 84 } |
| 85 |
| 86 @override |
| 87 ClassElement get enclosingClass => null; |
| 88 |
| 89 @override |
| 90 Element get enclosingClassOrCompilationUnit { |
| 91 return _unsupported('enclosingClassOrCompilationUnit'); |
| 92 } |
| 93 |
| 94 @override |
| 95 String get fixedBackendName => _unsupported('fixedBackendName'); |
| 96 |
| 97 @override |
| 98 bool get hasFixedBackendName => _unsupported('hasFixedBackendName'); |
| 99 |
| 100 @override |
| 101 LibraryElement get implementationLibrary => library; |
| 102 |
| 103 @override |
| 104 bool get isAbstract => false; |
| 105 |
| 106 @override |
| 107 bool get isAssignable => _unsupported('isAssignable'); |
| 108 |
| 109 @override |
| 110 bool get isClassMember => false; |
| 111 |
| 112 @override |
| 113 bool get isClosure => _unsupported('isClosure'); |
| 114 |
| 115 @override |
| 116 bool get isConst => _unsupported('isConst'); |
| 117 |
| 118 @override |
| 119 bool get isDeferredLoaderGetter => false; |
| 120 |
| 121 @override |
| 122 bool get isFinal => _unsupported('isFinal'); |
| 123 |
| 124 @override |
| 125 bool get isInstanceMember => false; |
| 126 |
| 127 @override |
| 128 bool get isLocal => false; |
| 129 |
| 130 @override |
| 131 bool get isMixinApplication => false; |
| 132 |
| 133 @override |
| 134 bool get isNative => false; |
| 135 |
| 136 @override |
| 137 bool get isOperator => false; |
| 138 |
| 139 @override |
| 140 bool get isStatic => false; |
| 141 |
| 142 // TODO(johnniwinther): Find a more precise semantics for this. |
| 143 @override |
| 144 bool get isSynthesized => true; |
| 145 |
| 146 @override |
| 147 bool get isTopLevel => false; |
| 148 |
| 149 // TODO(johnniwinther): Support metadata. |
| 150 @override |
| 151 Link<MetadataAnnotation> get metadata => const Link<MetadataAnnotation>(); |
| 152 |
| 153 @override |
| 154 Element get outermostEnclosingMemberOrTopLevel { |
| 155 return _unsupported('outermostEnclosingMemberOrTopLevel'); |
| 156 } |
| 157 |
| 158 @override |
| 159 Token get position => _unsupported('position'); |
| 160 } |
| 161 |
| 162 abstract class DeserializedElementZ extends ElementZ { |
| 163 ObjectDecoder _decoder; |
| 164 |
| 165 DeserializedElementZ(this._decoder); |
| 166 |
| 167 @override |
| 168 String get name => _decoder.getString(Key.NAME); |
| 169 |
| 170 @override |
| 171 SourceSpan get sourcePosition { |
| 172 // TODO(johnniwinther): Should this be cached? |
| 173 int offset = _decoder.getInt(Key.OFFSET, isOptional: true); |
| 174 if (offset == null) return null; |
| 175 Uri uri = _decoder.getUri(Key.URI, isOptional: true); |
| 176 if (uri == null) { |
| 177 uri = compilationUnit.script.readableUri; |
| 178 } |
| 179 int length = _decoder.getInt(Key.LENGTH, isOptional: true); |
| 180 if (length == null) { |
| 181 length = name.length; |
| 182 } |
| 183 return new SourceSpan(uri, offset, offset + length); |
| 184 } |
| 185 } |
| 186 |
| 187 /// Deserializer for a collection of member elements serialized as a map from |
| 188 /// names to element declarations. |
| 189 /// |
| 190 /// The serialized data contains the declared getters and setters but lookup |
| 191 /// into the map returns an [AbstractFieldElement] for pairs of corresponding |
| 192 /// getters and setters. |
| 193 /// |
| 194 /// The underlying map encoding allows for lazy computation of the members upon |
| 195 /// query. |
| 196 class MappedContainer { |
| 197 Map<String, Element> _lookupCache = {}; |
| 198 |
| 199 Element lookup(String name, MapDecoder members) { |
| 200 if (_lookupCache.containsKey(name)) { |
| 201 Element element = _lookupCache[name]; |
| 202 if (element != null) { |
| 203 return element; |
| 204 } |
| 205 } |
| 206 if (members == null) { |
| 207 return null; |
| 208 } |
| 209 bool hasId = members.containsKey(name); |
| 210 String setterName = '$name,='; |
| 211 bool hasSetterId = members.containsKey(setterName); |
| 212 Element element; |
| 213 Element setterElement; |
| 214 if (!hasId && !hasSetterId) { |
| 215 _lookupCache[name] = null; |
| 216 return null; |
| 217 } |
| 218 bool isAccessor = false; |
| 219 if (hasId) { |
| 220 element = members.getElement(name); |
| 221 isAccessor = element.isGetter; |
| 222 } |
| 223 if (hasSetterId) { |
| 224 setterElement = members.getElement(setterName); |
| 225 isAccessor = true; |
| 226 } |
| 227 if (isAccessor) { |
| 228 element = new AbstractFieldElementZ(name, element, setterElement); |
| 229 } |
| 230 _lookupCache[name] = element; |
| 231 return element; |
| 232 } |
| 233 } |
| 234 |
| 235 /// Deserializer for a collection of member elements serialized as a list of |
| 236 /// element declarations. |
| 237 /// |
| 238 /// The serialized data contains the declared getters and setters but lookup |
| 239 /// into the map returns an [AbstractFieldElement] for pairs of corresponding |
| 240 /// getters and setters. |
| 241 /// |
| 242 /// The underlying list encoding requires the complete lookup map to be computed |
| 243 /// before query. |
| 244 class ListedContainer { |
| 245 final Map<String, Element> _lookupMap = <String, Element>{}; |
| 246 |
| 247 ListedContainer(List<Element> elements) { |
| 248 Set<String> accessorNames = new Set<String>(); |
| 249 Map<String, Element> getters = <String, Element>{}; |
| 250 Map<String, Element> setters = <String, Element>{}; |
| 251 for (Element element in elements) { |
| 252 String name = element.name; |
| 253 if (element.isGetter) { |
| 254 accessorNames.add(name); |
| 255 getters[name] = element; |
| 256 // Inserting [element] here to ensure insert order of [name]. |
| 257 _lookupMap[name] = element; |
| 258 } else if (element.isSetter) { |
| 259 accessorNames.add(name); |
| 260 setters[name] = element; |
| 261 // Inserting [element] here to ensure insert order of [name]. |
| 262 _lookupMap[name] = element; |
| 263 } else { |
| 264 _lookupMap[name] = element; |
| 265 } |
| 266 } |
| 267 for (String name in accessorNames) { |
| 268 _lookupMap[name] = |
| 269 new AbstractFieldElementZ(name, getters[name], setters[name]); |
| 270 } |
| 271 } |
| 272 |
| 273 Element lookup(String name) => _lookupMap[name]; |
| 274 |
| 275 void forEach(f(Element element)) => _lookupMap.values.forEach(f); |
| 276 |
| 277 Iterable<Element> get values => _lookupMap.values; |
| 278 } |
| 279 |
| 280 |
| 281 abstract class AnalyzableElementMixin implements AnalyzableElement, ElementZ { |
| 282 @override |
| 283 bool get hasTreeElements => _unsupported('hasTreeElements'); |
| 284 |
| 285 @override |
| 286 TreeElements get treeElements => _unsupported('treeElements'); |
| 287 } |
| 288 |
| 289 |
| 290 abstract class AstElementMixin implements AstElement, ElementZ { |
| 291 @override |
| 292 bool get hasNode => _unsupported('hasNode'); |
| 293 |
| 294 @override |
| 295 bool get hasResolvedAst => _unsupported('hasResolvedAst'); |
| 296 |
| 297 @override |
| 298 get node => _unsupported('node'); |
| 299 |
| 300 @override |
| 301 ResolvedAst get resolvedAst => _unsupported('resolvedAst'); |
| 302 } |
| 303 |
| 304 abstract class ContainerMixin |
| 305 implements DeserializedElementZ, ScopeContainerElement { |
| 306 MappedContainer _membersMap = new MappedContainer(); |
| 307 |
| 308 @override |
| 309 Element localLookup(String name) { |
| 310 return _membersMap.lookup( |
| 311 name, _decoder.getMap(Key.MEMBERS, isOptional: true)); |
| 312 } |
| 313 |
| 314 @override |
| 315 void forEachLocalMember(f(Element element)) { |
| 316 MapDecoder members = |
| 317 _decoder.getMap(Key.MEMBERS, isOptional: true); |
| 318 if (members == null) return; |
| 319 members.forEachKey((String key) { |
| 320 Element member = members.getElement(key); |
| 321 if (member != null) { |
| 322 f(member); |
| 323 } |
| 324 }); |
| 325 } |
| 326 } |
| 327 |
| 328 class AbstractFieldElementZ extends ElementZ implements AbstractFieldElement { |
| 329 final String name; |
| 330 final FunctionElement getter; |
| 331 final FunctionElement setter; |
| 332 |
| 333 AbstractFieldElementZ(this.name, this.getter, this.setter); |
| 334 |
| 335 @override |
| 336 ElementKind get kind => ElementKind.ABSTRACT_FIELD; |
| 337 |
| 338 @override |
| 339 accept(ElementVisitor visitor, arg) { |
| 340 return visitor.visitAbstractFieldElement(this, arg); |
| 341 } |
| 342 |
| 343 @override |
| 344 LibraryElement get library { |
| 345 return getter != null ? getter.library : setter.library; |
| 346 } |
| 347 |
| 348 @override |
| 349 Element get enclosingElement { |
| 350 return getter != null ? getter.enclosingElement : setter.enclosingElement; |
| 351 } |
| 352 |
| 353 @override |
| 354 SourceSpan get sourcePosition { |
| 355 return getter != null ? getter.sourcePosition : setter.sourcePosition; |
| 356 } |
| 357 } |
| 358 |
| 359 class LibraryElementZ extends DeserializedElementZ |
| 360 with AnalyzableElementMixin, |
| 361 ContainerMixin, |
| 362 LibraryElementCommon |
| 363 implements LibraryElement { |
| 364 Uri _canonicalUri; |
| 365 CompilationUnitElement _entryCompilationUnit; |
| 366 Link<CompilationUnitElement> _compilationUnits; |
| 367 Link<Element> _exports; |
| 368 ListedContainer _exportsMap; |
| 369 ListedContainer _importsMap; |
| 370 Map<LibraryTag, LibraryElement> _libraryDependencies; |
| 371 |
| 372 LibraryElementZ(ObjectDecoder decoder) |
| 373 : super(decoder); |
| 374 |
| 375 @override |
| 376 ElementKind get kind => ElementKind.LIBRARY; |
| 377 |
| 378 @override |
| 379 Element get enclosingElement => null; |
| 380 |
| 381 @override |
| 382 String get name => entryCompilationUnit.name; |
| 383 |
| 384 @override |
| 385 accept(ElementVisitor visitor, arg) { |
| 386 return visitor.visitLibraryElement(this, arg); |
| 387 } |
| 388 |
| 389 @override |
| 390 LibraryElement get library => this; |
| 391 |
| 392 @override |
| 393 Uri get canonicalUri { |
| 394 if (_canonicalUri == null) { |
| 395 _canonicalUri = _decoder.getUri(Key.CANONICAL_URI); |
| 396 } |
| 397 return _canonicalUri; |
| 398 } |
| 399 |
| 400 @override |
| 401 CompilationUnitElement get entryCompilationUnit { |
| 402 if (_entryCompilationUnit == null) { |
| 403 _entryCompilationUnit = _decoder.getElement(Key.COMPILATION_UNIT); |
| 404 } |
| 405 return _entryCompilationUnit; |
| 406 } |
| 407 |
| 408 @override |
| 409 Link<CompilationUnitElement> get compilationUnits { |
| 410 if (_compilationUnits == null) { |
| 411 _compilationUnits = |
| 412 toLink(_decoder.getElements(Key.COMPILATION_UNITS)); |
| 413 } |
| 414 return _compilationUnits; |
| 415 } |
| 416 |
| 417 @override |
| 418 bool hasLibraryName() { |
| 419 return getLibraryName() != ''; |
| 420 } |
| 421 |
| 422 @override |
| 423 String getLibraryName() { |
| 424 return _decoder.getString(Key.LIBRARY_NAME); |
| 425 } |
| 426 |
| 427 @override |
| 428 bool get exportsHandled => true; |
| 429 |
| 430 void _ensureExports() { |
| 431 if (_exports == null) { |
| 432 _exportsMap = new ListedContainer(_decoder.getElements(Key.EXPORTS)); |
| 433 _exports = toLink(_exportsMap.values); |
| 434 } |
| 435 } |
| 436 |
| 437 Link<Element> get exports { |
| 438 _ensureExports(); |
| 439 return _exports; |
| 440 } |
| 441 |
| 442 @override |
| 443 void forEachExport(f(Element element)) { |
| 444 exports.forEach(f); |
| 445 } |
| 446 |
| 447 @override |
| 448 Element find(String elementName) { |
| 449 Element element = localLookup(elementName); |
| 450 if (element == null) { |
| 451 _ensureImports(); |
| 452 element = _importsMap.lookup(elementName); |
| 453 } |
| 454 return element; |
| 455 } |
| 456 |
| 457 @override |
| 458 Element findLocal(String elementName) { |
| 459 return localLookup(elementName); |
| 460 } |
| 461 |
| 462 void _ensureLibraryDependencies() { |
| 463 if (_libraryDependencies == null) { |
| 464 _libraryDependencies = <LibraryTag, LibraryElement>{}; |
| 465 ListDecoder tags = _decoder.getList(Key.TAGS); |
| 466 AstBuilder builder = new AstBuilder(0); |
| 467 for (int i = 0; i < tags.length; i++) { |
| 468 ObjectDecoder dependency = tags.getObject(i); |
| 469 String kind = dependency.getString(Key.KIND); |
| 470 LibraryElement library = dependency.getElement(Key.LIBRARY); |
| 471 // TODO(johnniwinther): Add `ImportElement` and `ExportElement` to the |
| 472 // element model to avoid hacking up nodes. |
| 473 if (kind == 'import') { |
| 474 Import tag = new Import( |
| 475 builder.keywordToken('import'), |
| 476 builder.literalString(library.canonicalUri.toString()) |
| 477 ..getEndToken().next = builder.symbolToken(SEMICOLON_INFO), |
| 478 null, // prefix |
| 479 null, // combinators |
| 480 null, // metadata |
| 481 isDeferred: false); |
| 482 _libraryDependencies[tag] = library; |
| 483 } else if (kind == 'export') { |
| 484 Export tag = new Export( |
| 485 builder.keywordToken('export'), |
| 486 builder.literalString(library.canonicalUri.toString()) |
| 487 ..getEndToken().next = builder.symbolToken(SEMICOLON_INFO), |
| 488 null, // combinators |
| 489 null); // metadata |
| 490 _libraryDependencies[tag] = library; |
| 491 } |
| 492 } |
| 493 } |
| 494 } |
| 495 |
| 496 @override |
| 497 Iterable<LibraryTag> get tags { |
| 498 _ensureLibraryDependencies(); |
| 499 return _libraryDependencies.keys; |
| 500 } |
| 501 |
| 502 LibraryElement getLibraryFromTag(LibraryDependency tag) { |
| 503 _ensureLibraryDependencies(); |
| 504 return _libraryDependencies[tag]; |
| 505 } |
| 506 |
| 507 @override |
| 508 bool get canUseNative => false; |
| 509 |
| 510 @override |
| 511 Element findExported(String elementName) => _unsupported('findExported'); |
| 512 |
| 513 void _ensureImports() { |
| 514 if (_importsMap == null) { |
| 515 _importsMap = new ListedContainer(_decoder.getElements(Key.IMPORTS)); |
| 516 } |
| 517 } |
| 518 |
| 519 @override |
| 520 void forEachImport(f(Element element)) { |
| 521 _ensureImports(); |
| 522 _importsMap.forEach(f); |
| 523 } |
| 524 |
| 525 @override |
| 526 Link<Import> getImportsFor(Element element) => _unsupported('getImportsFor'); |
| 527 |
| 528 @override |
| 529 LibraryName get libraryTag => _unsupported('libraryTag'); |
| 530 |
| 531 String toString() { |
| 532 return 'Zlibrary(${canonicalUri})'; |
| 533 } |
| 534 } |
| 535 |
| 536 class ScriptZ implements Script { |
| 537 final Uri resourceUri; |
| 538 |
| 539 ScriptZ(this.resourceUri); |
| 540 |
| 541 @override |
| 542 Script copyWithFile(SourceFile file) { |
| 543 throw new UnsupportedError('ScriptZ.copyWithFile'); |
| 544 } |
| 545 |
| 546 @override |
| 547 SourceFile get file => throw new UnsupportedError('ScriptZ.file'); |
| 548 |
| 549 @override |
| 550 bool get isSynthesized => throw new UnsupportedError('ScriptZ.isSynthesized'); |
| 551 |
| 552 @override |
| 553 String get name => resourceUri.toString(); |
| 554 |
| 555 // TODO(johnniwinther): Support the distinction between [readableUri] and |
| 556 // [resourceUri]; needed for platform libraries. |
| 557 @override |
| 558 Uri get readableUri => resourceUri; |
| 559 |
| 560 @override |
| 561 String get text => throw new UnsupportedError('ScriptZ.text'); |
| 562 } |
| 563 |
| 564 class CompilationUnitElementZ extends DeserializedElementZ |
| 565 with LibraryMemberMixin, |
| 566 CompilationUnitElementCommon |
| 567 implements CompilationUnitElement { |
| 568 List<Element> _members; |
| 569 Script _script; |
| 570 |
| 571 CompilationUnitElementZ(ObjectDecoder decoder) |
| 572 : super(decoder); |
| 573 |
| 574 @override |
| 575 ElementKind get kind => ElementKind.COMPILATION_UNIT; |
| 576 |
| 577 @override |
| 578 CompilationUnitElement get compilationUnit => this; |
| 579 |
| 580 @override |
| 581 accept(ElementVisitor visitor, arg) { |
| 582 return visitor.visitCompilationUnitElement(this, arg); |
| 583 } |
| 584 |
| 585 @override |
| 586 void forEachLocalMember(f(Element element)) { |
| 587 if (_members == null) { |
| 588 _members = |
| 589 _decoder.getElements(Key.ELEMENTS, isOptional: true); |
| 590 } |
| 591 _members.forEach(f); |
| 592 } |
| 593 |
| 594 @override |
| 595 Script get script { |
| 596 if (_script == null) { |
| 597 Uri resolvedUri = _decoder.getUri(Key.URI); |
| 598 _script = new ScriptZ(resolvedUri); |
| 599 } |
| 600 return _script; |
| 601 } |
| 602 |
| 603 @override |
| 604 String get name => script.name; |
| 605 } |
| 606 |
| 607 |
| 608 abstract class LibraryMemberMixin implements DeserializedElementZ { |
| 609 LibraryElement _library; |
| 610 CompilationUnitElement _compilationUnit; |
| 611 |
| 612 @override |
| 613 LibraryElement get library { |
| 614 if (_library == null) { |
| 615 _library = _decoder.getElement(Key.LIBRARY); |
| 616 } |
| 617 return _library; |
| 618 } |
| 619 |
| 620 @override |
| 621 CompilationUnitElement get compilationUnit { |
| 622 if (_compilationUnit == null) { |
| 623 _compilationUnit = _decoder.getElement(Key.COMPILATION_UNIT); |
| 624 } |
| 625 return _compilationUnit; |
| 626 } |
| 627 |
| 628 @override |
| 629 Element get enclosingElement => compilationUnit; |
| 630 |
| 631 @override |
| 632 ClassElement get enclosingClass => null; |
| 633 |
| 634 @override |
| 635 bool get isTopLevel => true; |
| 636 |
| 637 @override |
| 638 bool get isStatic => false; |
| 639 } |
| 640 |
| 641 abstract class ClassMemberMixin implements DeserializedElementZ { |
| 642 ClassElement _class; |
| 643 |
| 644 @override |
| 645 Element get enclosingElement => enclosingClass; |
| 646 |
| 647 @override |
| 648 ClassElement get enclosingClass { |
| 649 if (_class == null) { |
| 650 _class = _decoder.getElement(Key.CLASS); |
| 651 } |
| 652 return _class; |
| 653 } |
| 654 |
| 655 @override |
| 656 bool get isClassMember => true; |
| 657 |
| 658 @override |
| 659 LibraryElement get library => enclosingClass.library; |
| 660 |
| 661 @override |
| 662 CompilationUnitElement get compilationUnit => enclosingClass.compilationUnit; |
| 663 } |
| 664 |
| 665 abstract class InstanceMemberMixin implements DeserializedElementZ { |
| 666 @override |
| 667 bool get isTopLevel => false; |
| 668 |
| 669 @override |
| 670 bool get isStatic => false; |
| 671 |
| 672 @override |
| 673 bool get isInstanceMember => true; |
| 674 } |
| 675 |
| 676 abstract class StaticMemberMixin implements DeserializedElementZ { |
| 677 @override |
| 678 bool get isTopLevel => false; |
| 679 |
| 680 @override |
| 681 bool get isStatic => true; |
| 682 } |
| 683 |
| 684 abstract class TypedElementMixin |
| 685 implements DeserializedElementZ, TypedElement { |
| 686 DartType _type; |
| 687 |
| 688 @override |
| 689 DartType get type { |
| 690 if (_type == null) { |
| 691 _type = _decoder.getType(Key.TYPE); |
| 692 } |
| 693 return _type; |
| 694 } |
| 695 |
| 696 @override |
| 697 DartType computeType(Compiler compiler) => type; |
| 698 } |
| 699 |
| 700 abstract class ParametersMixin |
| 701 implements DeserializedElementZ, FunctionTypedElement { |
| 702 FunctionSignature _functionSignature; |
| 703 List<ParameterElement> _parameters; |
| 704 |
| 705 bool get hasFunctionSignature => true; |
| 706 |
| 707 @override |
| 708 FunctionSignature get functionSignature { |
| 709 if (_functionSignature == null) { |
| 710 List<Element> requiredParameters = []; |
| 711 List<Element> optionalParameters = []; |
| 712 List orderedOptionalParameters = []; |
| 713 int requiredParameterCount = 0; |
| 714 int optionalParameterCount = 0; |
| 715 bool optionalParametersAreNamed = false; |
| 716 List<DartType> parameterTypes = <DartType>[]; |
| 717 List<DartType> optionalParameterTypes = <DartType>[]; |
| 718 List<String> namedParameters = <String>[]; |
| 719 List<DartType> namedParameterTypes = <DartType>[]; |
| 720 for (ParameterElement parameter in parameters) { |
| 721 if (parameter.isOptional) { |
| 722 optionalParameterCount++; |
| 723 requiredParameters.add(parameter); |
| 724 orderedOptionalParameters.add(parameter); |
| 725 if (parameter.isNamed) { |
| 726 optionalParametersAreNamed = true; |
| 727 namedParameters.add(parameter.name); |
| 728 namedParameterTypes.add(parameter.type); |
| 729 } else { |
| 730 optionalParameterTypes.add(parameter.type); |
| 731 } |
| 732 } else { |
| 733 requiredParameterCount++; |
| 734 optionalParameters.add(parameter); |
| 735 parameterTypes.add(parameter.type); |
| 736 } |
| 737 } |
| 738 if (optionalParametersAreNamed) { |
| 739 orderedOptionalParameters.sort((Element a, Element b) { |
| 740 return a.name.compareTo(b.name); |
| 741 }); |
| 742 } |
| 743 |
| 744 FunctionType type = new FunctionType( |
| 745 this, |
| 746 _decoder.getType(Key.RETURN_TYPE), |
| 747 parameterTypes, |
| 748 optionalParameterTypes, |
| 749 namedParameters, |
| 750 namedParameterTypes); |
| 751 _functionSignature = new FunctionSignatureX( |
| 752 requiredParameters: requiredParameters, |
| 753 requiredParameterCount: requiredParameterCount, |
| 754 optionalParameters: optionalParameters, |
| 755 optionalParameterCount: optionalParameterCount, |
| 756 optionalParametersAreNamed: optionalParametersAreNamed, |
| 757 orderedOptionalParameters: orderedOptionalParameters, |
| 758 type: type); |
| 759 } |
| 760 return _functionSignature; |
| 761 } |
| 762 |
| 763 List<ParameterElement> get parameters { |
| 764 if (_parameters == null) { |
| 765 _parameters = _decoder.getElements(Key.PARAMETERS, isOptional: true); |
| 766 } |
| 767 return _parameters; |
| 768 } |
| 769 } |
| 770 |
| 771 abstract class FunctionTypedElementMixin |
| 772 implements FunctionElement, DeserializedElementZ { |
| 773 @override |
| 774 AsyncMarker get asyncMarker => _unsupported(''); |
| 775 |
| 776 @override |
| 777 bool get isExternal => _unsupported(''); |
| 778 |
| 779 @override |
| 780 FunctionElement asFunctionElement() => this; |
| 781 } |
| 782 |
| 783 class ClassElementZ extends DeserializedElementZ |
| 784 with AnalyzableElementMixin, |
| 785 AstElementMixin, |
| 786 ClassElementCommon, |
| 787 class_members.ClassMemberMixin, |
| 788 ContainerMixin, |
| 789 LibraryMemberMixin, |
| 790 TypeDeclarationMixin<InterfaceType> |
| 791 implements ClassElement { |
| 792 bool _isObject; |
| 793 DartType _supertype; |
| 794 OrderedTypeSet _allSupertypesAndSelf; |
| 795 Link<DartType> _interfaces; |
| 796 |
| 797 ClassElementZ(ObjectDecoder decoder) |
| 798 : super(decoder); |
| 799 |
| 800 InterfaceType _createType(List<DartType> typeArguments) { |
| 801 return new InterfaceType(this, typeArguments); |
| 802 } |
| 803 |
| 804 @override |
| 805 ElementKind get kind => ElementKind.CLASS; |
| 806 |
| 807 @override |
| 808 accept(ElementVisitor visitor, arg) { |
| 809 return visitor.visitClassElement(this, arg); |
| 810 } |
| 811 |
| 812 @override |
| 813 DartType get supertype { |
| 814 if (_isObject == null) { |
| 815 _supertype = _decoder.getType(Key.SUPERTYPE, isOptional: true); |
| 816 _isObject = _supertype == null; |
| 817 } |
| 818 return _supertype; |
| 819 } |
| 820 |
| 821 @override |
| 822 bool get isAbstract => _decoder.getBool(Key.IS_ABSTRACT); |
| 823 |
| 824 @override |
| 825 bool get isObject { |
| 826 return supertype == null; |
| 827 } |
| 828 |
| 829 @override |
| 830 void addBackendMember(Element element) => _unsupported('addBackendMember'); |
| 831 |
| 832 @override |
| 833 OrderedTypeSet get allSupertypesAndSelf { |
| 834 if (_allSupertypesAndSelf == null) { |
| 835 ObjectDecoder supertypesDeserializer = |
| 836 _decoder.getObject(Key.SUPERTYPES); |
| 837 List<int> offsets = supertypesDeserializer.getInts(Key.OFFSETS); |
| 838 List<Link<DartType>> levels = new List<Link<DartType>>(offsets.length); |
| 839 LinkBuilder<DartType> typesBuilder = new LinkBuilder<DartType>(); |
| 840 int offset = 0; |
| 841 int depth = offsets.length - 1; |
| 842 for (DartType type in supertypesDeserializer.getTypes(Key.TYPES)) { |
| 843 Link<DartType> link = typesBuilder.addLast(type); |
| 844 if (offsets[depth] == offset) { |
| 845 levels[depth] = link; |
| 846 depth--; |
| 847 } |
| 848 offset++; |
| 849 } |
| 850 LinkBuilder<DartType> supertypesBuilder = new LinkBuilder<DartType>(); |
| 851 for (DartType supertype in |
| 852 supertypesDeserializer.getTypes(Key.SUPERTYPES, isOptional: true)) { |
| 853 supertypesBuilder.addLast(supertype); |
| 854 } |
| 855 Link<DartType> types = typesBuilder.toLink(); |
| 856 Link<DartType> supertypes = supertypesBuilder.toLink(); |
| 857 _allSupertypesAndSelf = new OrderedTypeSet.internal( |
| 858 levels, types, supertypes); |
| 859 } |
| 860 return _allSupertypesAndSelf; |
| 861 } |
| 862 |
| 863 @override |
| 864 void forEachBackendMember(void f(Element member)) { |
| 865 _unsupported('forEachBackendMember'); |
| 866 } |
| 867 |
| 868 @override |
| 869 bool get hasBackendMembers => _unsupported('hasBackendMembers'); |
| 870 |
| 871 @override |
| 872 bool get hasConstructor => _unsupported('hasConstructor'); |
| 873 |
| 874 @override |
| 875 bool hasFieldShadowedBy(Element fieldMember) => _unsupported(''); |
| 876 |
| 877 @override |
| 878 bool get hasIncompleteHierarchy => _unsupported('hasIncompleteHierarchy'); |
| 879 |
| 880 @override |
| 881 bool get hasLocalScopeMembers => _unsupported('hasLocalScopeMembers'); |
| 882 |
| 883 @override |
| 884 bool implementsFunction(Compiler compiler) { |
| 885 return _unsupported('implementsFunction'); |
| 886 } |
| 887 |
| 888 @override |
| 889 Link<DartType> get interfaces { |
| 890 if (_interfaces == null) { |
| 891 _interfaces = toLink( |
| 892 _decoder.getTypes(Key.INTERFACES, isOptional: true)); |
| 893 } |
| 894 return _interfaces; |
| 895 } |
| 896 |
| 897 @override |
| 898 bool get isEnumClass => false; |
| 899 |
| 900 @override |
| 901 bool get isProxy => _unsupported('isProxy'); |
| 902 |
| 903 @override |
| 904 bool get isUnnamedMixinApplication { |
| 905 return _unsupported('isUnnamedMixinApplication'); |
| 906 } |
| 907 |
| 908 @override |
| 909 Element lookupBackendMember(String memberName) { |
| 910 return _unsupported('lookupBackendMember'); |
| 911 } |
| 912 |
| 913 @override |
| 914 ConstructorElement lookupDefaultConstructor() { |
| 915 ConstructorElement constructor = lookupConstructor(""); |
| 916 if (constructor != null && constructor.parameters.isEmpty) { |
| 917 return constructor; |
| 918 } |
| 919 return null; |
| 920 } |
| 921 |
| 922 @override |
| 923 String get nativeTagInfo => _unsupported('nativeTagInfo'); |
| 924 |
| 925 @override |
| 926 void reverseBackendMembers() => _unsupported('reverseBackendMembers'); |
| 927 |
| 928 @override |
| 929 ClassElement get superclass => supertype != null ? supertype.element : null; |
| 930 } |
| 931 |
| 932 abstract class ConstructorElementZ extends DeserializedElementZ |
| 933 with AnalyzableElementMixin, |
| 934 AstElementMixin, |
| 935 ClassMemberMixin, |
| 936 FunctionTypedElementMixin, |
| 937 ParametersMixin, |
| 938 TypedElementMixin, |
| 939 MemberElementMixin |
| 940 implements ConstructorElement { |
| 941 ConstantConstructor _constantConstructor; |
| 942 |
| 943 ConstructorElementZ(ObjectDecoder decoder) |
| 944 : super(decoder); |
| 945 |
| 946 accept(ElementVisitor visitor, arg) { |
| 947 return visitor.visitConstructorElement(this, arg); |
| 948 } |
| 949 |
| 950 @override |
| 951 bool get isConst => _decoder.getBool(Key.IS_CONST); |
| 952 |
| 953 @override |
| 954 bool get isExternal => _decoder.getBool(Key.IS_EXTERNAL); |
| 955 |
| 956 bool get isFromEnvironmentConstructor { |
| 957 return name == 'fromEnvironment' && |
| 958 library.isDartCore && |
| 959 (enclosingClass.name == 'bool' || |
| 960 enclosingClass.name == 'int' || |
| 961 enclosingClass.name == 'String'); |
| 962 } |
| 963 |
| 964 ConstantConstructor get constantConstructor { |
| 965 if (isConst && _constantConstructor == null) { |
| 966 ObjectDecoder data = |
| 967 _decoder.getObject(Key.CONSTRUCTOR, isOptional: true); |
| 968 if (data == null) { |
| 969 assert(isFromEnvironmentConstructor || isExternal); |
| 970 return null; |
| 971 } |
| 972 _constantConstructor = ConstantConstructorDeserializer.deserialize(data); |
| 973 } |
| 974 return _constantConstructor; |
| 975 } |
| 976 |
| 977 @override |
| 978 AsyncMarker get asyncMarker => _unsupported('asyncMarker'); |
| 979 |
| 980 @override |
| 981 InterfaceType computeEffectiveTargetType(InterfaceType newType) { |
| 982 return _unsupported('computeEffectiveTargetType'); |
| 983 } |
| 984 |
| 985 @override |
| 986 ConstructorElement get definingConstructor { |
| 987 return _unsupported('definingConstructor'); |
| 988 } |
| 989 |
| 990 @override |
| 991 ConstructorElement get effectiveTarget { |
| 992 return _unsupported('effectiveTarget'); |
| 993 } |
| 994 |
| 995 @override |
| 996 ConstructorElement get immediateRedirectionTarget { |
| 997 return _unsupported('immediateRedirectionTarget'); |
| 998 } |
| 999 |
| 1000 @override |
| 1001 bool get isRedirectingFactory => _unsupported('isRedirectingFactory'); |
| 1002 |
| 1003 @override |
| 1004 bool get isRedirectingGenerative => _unsupported('isRedirectingGenerative'); |
| 1005 |
| 1006 @override |
| 1007 bool get isCyclicRedirection => _unsupported('isCyclicRedirection'); |
| 1008 |
| 1009 @override |
| 1010 PrefixElement get redirectionDeferredPrefix { |
| 1011 return _unsupported('redirectionDeferredPrefix'); |
| 1012 } |
| 1013 } |
| 1014 |
| 1015 class GenerativeConstructorElementZ extends ConstructorElementZ { |
| 1016 GenerativeConstructorElementZ(ObjectDecoder decoder) |
| 1017 : super(decoder); |
| 1018 |
| 1019 @override |
| 1020 ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR; |
| 1021 } |
| 1022 |
| 1023 class FactoryConstructorElementZ extends ConstructorElementZ { |
| 1024 |
| 1025 FactoryConstructorElementZ(ObjectDecoder decoder) |
| 1026 : super(decoder); |
| 1027 |
| 1028 @override |
| 1029 ElementKind get kind => ElementKind.FUNCTION; |
| 1030 |
| 1031 @override |
| 1032 bool get isFactoryConstructor => true; |
| 1033 } |
| 1034 |
| 1035 abstract class MemberElementMixin |
| 1036 implements DeserializedElementZ, MemberElement { |
| 1037 |
| 1038 @override |
| 1039 MemberElement get memberContext => this; |
| 1040 |
| 1041 @override |
| 1042 Name get memberName => new Name(name, library); |
| 1043 |
| 1044 @override |
| 1045 List<FunctionElement> get nestedClosures => const <FunctionElement>[]; |
| 1046 |
| 1047 } |
| 1048 |
| 1049 abstract class FieldElementZ extends DeserializedElementZ |
| 1050 with AnalyzableElementMixin, |
| 1051 AstElementMixin, |
| 1052 TypedElementMixin, |
| 1053 MemberElementMixin |
| 1054 implements FieldElement { |
| 1055 ConstantExpression _constant; |
| 1056 |
| 1057 FieldElementZ(ObjectDecoder decoder) |
| 1058 : super(decoder); |
| 1059 |
| 1060 @override |
| 1061 ElementKind get kind => ElementKind.FIELD; |
| 1062 |
| 1063 @override |
| 1064 accept(ElementVisitor visitor, arg) { |
| 1065 return visitor.visitFieldElement(this, arg); |
| 1066 } |
| 1067 |
| 1068 @override |
| 1069 bool get isFinal => _decoder.getBool(Key.IS_FINAL); |
| 1070 |
| 1071 @override |
| 1072 bool get isConst => _decoder.getBool(Key.IS_CONST); |
| 1073 |
| 1074 @override |
| 1075 ConstantExpression get constant { |
| 1076 if (isConst && _constant == null) { |
| 1077 _constant = _decoder.getConstant(Key.CONSTANT); |
| 1078 } |
| 1079 return _constant; |
| 1080 } |
| 1081 |
| 1082 @override |
| 1083 Expression get initializer => _unsupported('initializer'); |
| 1084 } |
| 1085 |
| 1086 |
| 1087 class TopLevelFieldElementZ extends FieldElementZ with LibraryMemberMixin { |
| 1088 TopLevelFieldElementZ(ObjectDecoder decoder) |
| 1089 : super(decoder); |
| 1090 } |
| 1091 |
| 1092 class StaticFieldElementZ extends FieldElementZ |
| 1093 with ClassMemberMixin, StaticMemberMixin { |
| 1094 StaticFieldElementZ(ObjectDecoder decoder) |
| 1095 : super(decoder); |
| 1096 } |
| 1097 |
| 1098 class InstanceFieldElementZ extends FieldElementZ |
| 1099 with ClassMemberMixin, InstanceMemberMixin { |
| 1100 InstanceFieldElementZ(ObjectDecoder decoder) |
| 1101 : super(decoder); |
| 1102 } |
| 1103 |
| 1104 abstract class FunctionElementZ extends DeserializedElementZ |
| 1105 with AnalyzableElementMixin, |
| 1106 AstElementMixin, |
| 1107 ParametersMixin, |
| 1108 FunctionTypedElementMixin, |
| 1109 TypedElementMixin, |
| 1110 MemberElementMixin |
| 1111 implements MethodElement { |
| 1112 FunctionElementZ(ObjectDecoder decoder) |
| 1113 : super(decoder); |
| 1114 |
| 1115 @override |
| 1116 ElementKind get kind => ElementKind.FUNCTION; |
| 1117 |
| 1118 @override |
| 1119 accept(ElementVisitor visitor, arg) { |
| 1120 return visitor.visitFunctionElement(this, arg); |
| 1121 } |
| 1122 |
| 1123 @override |
| 1124 bool get isOperator => _decoder.getBool(Key.IS_OPERATOR); |
| 1125 } |
| 1126 |
| 1127 class TopLevelFunctionElementZ extends FunctionElementZ |
| 1128 with LibraryMemberMixin { |
| 1129 TopLevelFunctionElementZ(ObjectDecoder decoder) |
| 1130 : super(decoder); |
| 1131 } |
| 1132 |
| 1133 class StaticFunctionElementZ extends FunctionElementZ |
| 1134 with ClassMemberMixin, StaticMemberMixin { |
| 1135 StaticFunctionElementZ(ObjectDecoder decoder) |
| 1136 : super(decoder); |
| 1137 } |
| 1138 |
| 1139 class InstanceFunctionElementZ extends FunctionElementZ |
| 1140 with ClassMemberMixin, InstanceMemberMixin { |
| 1141 InstanceFunctionElementZ(ObjectDecoder decoder) |
| 1142 : super(decoder); |
| 1143 } |
| 1144 |
| 1145 abstract class GetterElementZ extends DeserializedElementZ |
| 1146 with AnalyzableElementMixin, |
| 1147 AstElementMixin, |
| 1148 FunctionTypedElementMixin, |
| 1149 ParametersMixin, |
| 1150 TypedElementMixin, |
| 1151 MemberElementMixin |
| 1152 implements FunctionElement { |
| 1153 |
| 1154 GetterElementZ(ObjectDecoder decoder) |
| 1155 : super(decoder); |
| 1156 |
| 1157 @override |
| 1158 ElementKind get kind => ElementKind.GETTER; |
| 1159 |
| 1160 @override |
| 1161 accept(ElementVisitor visitor, arg) { |
| 1162 return visitor.visitFunctionElement(this, arg); |
| 1163 } |
| 1164 } |
| 1165 |
| 1166 class TopLevelGetterElementZ extends GetterElementZ with LibraryMemberMixin { |
| 1167 TopLevelGetterElementZ(ObjectDecoder decoder) |
| 1168 : super(decoder); |
| 1169 } |
| 1170 |
| 1171 class StaticGetterElementZ extends GetterElementZ |
| 1172 with ClassMemberMixin, StaticMemberMixin { |
| 1173 StaticGetterElementZ(ObjectDecoder decoder) |
| 1174 : super(decoder); |
| 1175 } |
| 1176 |
| 1177 class InstanceGetterElementZ extends GetterElementZ |
| 1178 with ClassMemberMixin, InstanceMemberMixin { |
| 1179 InstanceGetterElementZ(ObjectDecoder decoder) |
| 1180 : super(decoder); |
| 1181 } |
| 1182 |
| 1183 abstract class SetterElementZ extends DeserializedElementZ |
| 1184 with AnalyzableElementMixin, |
| 1185 AstElementMixin, |
| 1186 FunctionTypedElementMixin, |
| 1187 ParametersMixin, |
| 1188 TypedElementMixin, |
| 1189 MemberElementMixin |
| 1190 implements FunctionElement { |
| 1191 |
| 1192 SetterElementZ(ObjectDecoder decoder) |
| 1193 : super(decoder); |
| 1194 |
| 1195 @override |
| 1196 ElementKind get kind => ElementKind.SETTER; |
| 1197 |
| 1198 @override |
| 1199 accept(ElementVisitor visitor, arg) { |
| 1200 return visitor.visitFunctionElement(this, arg); |
| 1201 } |
| 1202 } |
| 1203 |
| 1204 class TopLevelSetterElementZ extends SetterElementZ with LibraryMemberMixin { |
| 1205 TopLevelSetterElementZ(ObjectDecoder decoder) |
| 1206 : super(decoder); |
| 1207 } |
| 1208 |
| 1209 class StaticSetterElementZ extends SetterElementZ |
| 1210 with ClassMemberMixin, StaticMemberMixin { |
| 1211 StaticSetterElementZ(ObjectDecoder decoder) |
| 1212 : super(decoder); |
| 1213 } |
| 1214 |
| 1215 class InstanceSetterElementZ extends SetterElementZ |
| 1216 with ClassMemberMixin, InstanceMemberMixin { |
| 1217 InstanceSetterElementZ(ObjectDecoder decoder) |
| 1218 : super(decoder); |
| 1219 } |
| 1220 |
| 1221 abstract class TypeDeclarationMixin<T extends GenericType> |
| 1222 implements DeserializedElementZ, TypeDeclarationElement { |
| 1223 List<DartType> _typeVariables; |
| 1224 T _rawType; |
| 1225 T _thisType; |
| 1226 |
| 1227 void _ensureTypes() { |
| 1228 if (_typeVariables == null) { |
| 1229 _typeVariables = _decoder.getTypes( |
| 1230 Key.TYPE_VARIABLES, isOptional: true); |
| 1231 _rawType = _createType(new List<DartType>.filled( |
| 1232 _typeVariables.length, const DynamicType())); |
| 1233 _thisType = _createType(_typeVariables); |
| 1234 } |
| 1235 } |
| 1236 |
| 1237 T _createType(List<DartType> typeArguments); |
| 1238 |
| 1239 @override |
| 1240 List<DartType> get typeVariables { |
| 1241 _ensureTypes(); |
| 1242 return _typeVariables; |
| 1243 } |
| 1244 |
| 1245 @override |
| 1246 T get rawType { |
| 1247 _ensureTypes(); |
| 1248 return _rawType; |
| 1249 } |
| 1250 |
| 1251 @override |
| 1252 T get thisType { |
| 1253 _ensureTypes(); |
| 1254 return _thisType; |
| 1255 } |
| 1256 |
| 1257 @override |
| 1258 T computeType(Compiler compiler) => thisType; |
| 1259 |
| 1260 @override |
| 1261 bool get isResolved => true; |
| 1262 |
| 1263 @override |
| 1264 void ensureResolved(Compiler compiler) {} |
| 1265 } |
| 1266 |
| 1267 class TypedefElementZ extends DeserializedElementZ |
| 1268 with AnalyzableElementMixin, |
| 1269 AstElementMixin, |
| 1270 LibraryMemberMixin, |
| 1271 ParametersMixin, |
| 1272 TypeDeclarationMixin<TypedefType> |
| 1273 implements TypedefElement { |
| 1274 DartType _alias; |
| 1275 |
| 1276 TypedefElementZ(ObjectDecoder decoder) |
| 1277 : super(decoder); |
| 1278 |
| 1279 TypedefType _createType(List<DartType> typeArguments) { |
| 1280 return new TypedefType(this, typeArguments); |
| 1281 } |
| 1282 |
| 1283 @override |
| 1284 ElementKind get kind => ElementKind.TYPEDEF; |
| 1285 |
| 1286 @override |
| 1287 accept(ElementVisitor visitor, arg) { |
| 1288 return visitor.visitTypedefElement(this, arg); |
| 1289 } |
| 1290 |
| 1291 @override |
| 1292 DartType get alias { |
| 1293 if (_alias == null) { |
| 1294 _alias = _decoder.getType(Key.ALIAS); |
| 1295 } |
| 1296 return _alias; |
| 1297 } |
| 1298 |
| 1299 @override |
| 1300 void checkCyclicReference(Compiler compiler) {} |
| 1301 } |
| 1302 |
| 1303 class TypeVariableElementZ extends DeserializedElementZ |
| 1304 with AnalyzableElementMixin, |
| 1305 AstElementMixin, |
| 1306 TypedElementMixin |
| 1307 implements TypeVariableElement { |
| 1308 TypeDeclarationElement _typeDeclaration; |
| 1309 TypeVariableType _type; |
| 1310 DartType _bound; |
| 1311 |
| 1312 TypeVariableElementZ(ObjectDecoder decoder) |
| 1313 : super(decoder); |
| 1314 |
| 1315 @override |
| 1316 ElementKind get kind => ElementKind.TYPE_VARIABLE; |
| 1317 |
| 1318 @override |
| 1319 accept(ElementVisitor visitor, arg) { |
| 1320 return visitor.visitTypeVariableElement(this, arg); |
| 1321 } |
| 1322 |
| 1323 @override |
| 1324 CompilationUnitElement get compilationUnit { |
| 1325 return typeDeclaration.compilationUnit; |
| 1326 } |
| 1327 |
| 1328 @override |
| 1329 Element get enclosingElement => typeDeclaration; |
| 1330 |
| 1331 @override |
| 1332 Element get enclosingClass => typeDeclaration; |
| 1333 |
| 1334 @override |
| 1335 int get index => _decoder.getInt(Key.INDEX); |
| 1336 |
| 1337 @override |
| 1338 TypeDeclarationElement get typeDeclaration { |
| 1339 if (_typeDeclaration == null) { |
| 1340 _typeDeclaration = |
| 1341 _decoder.getElement(Key.TYPE_DECLARATION); |
| 1342 } |
| 1343 return _typeDeclaration; |
| 1344 } |
| 1345 |
| 1346 DartType get bound { |
| 1347 if (_bound == null) { |
| 1348 _bound = _decoder.getType(Key.BOUND); |
| 1349 } |
| 1350 return _bound; |
| 1351 } |
| 1352 |
| 1353 @override |
| 1354 LibraryElement get library => typeDeclaration.library; |
| 1355 } |
| 1356 |
| 1357 class ParameterElementZ extends DeserializedElementZ |
| 1358 with AnalyzableElementMixin, |
| 1359 AstElementMixin, |
| 1360 TypedElementMixin |
| 1361 implements ParameterElement { |
| 1362 FunctionElement _functionDeclaration; |
| 1363 ConstantExpression _constant; |
| 1364 DartType _type; |
| 1365 |
| 1366 ParameterElementZ(ObjectDecoder decoder) : super(decoder); |
| 1367 |
| 1368 @override |
| 1369 accept(ElementVisitor visitor, arg) { |
| 1370 return visitor.visitParameterElement(this, arg); |
| 1371 } |
| 1372 |
| 1373 @override |
| 1374 ConstantExpression get constant { |
| 1375 if (isOptional) { |
| 1376 if (_constant == null) { |
| 1377 _constant = _decoder.getConstant(Key.CONSTANT); |
| 1378 } |
| 1379 return _constant; |
| 1380 } |
| 1381 return null; |
| 1382 } |
| 1383 |
| 1384 @override |
| 1385 CompilationUnitElement get compilationUnit { |
| 1386 return functionDeclaration.compilationUnit; |
| 1387 } |
| 1388 |
| 1389 @override |
| 1390 ExecutableElement get executableContext => functionDeclaration; |
| 1391 |
| 1392 @override |
| 1393 Element get enclosingElement => functionDeclaration; |
| 1394 |
| 1395 @override |
| 1396 FunctionElement get functionDeclaration { |
| 1397 if (_functionDeclaration == null) { |
| 1398 _functionDeclaration = _decoder.getElement(Key.FUNCTION); |
| 1399 } |
| 1400 return _functionDeclaration; |
| 1401 } |
| 1402 |
| 1403 @override |
| 1404 FunctionSignature get functionSignature => _unsupported('functionSignature'); |
| 1405 |
| 1406 @override |
| 1407 Expression get initializer => _unsupported('initializer'); |
| 1408 |
| 1409 @override |
| 1410 bool get isNamed => _decoder.getBool(Key.IS_NAMED); |
| 1411 |
| 1412 @override |
| 1413 bool get isOptional => _decoder.getBool(Key.IS_OPTIONAL); |
| 1414 |
| 1415 @override |
| 1416 ElementKind get kind => ElementKind.PARAMETER; |
| 1417 |
| 1418 @override |
| 1419 LibraryElement get library => executableContext.library; |
| 1420 |
| 1421 @override |
| 1422 MemberElement get memberContext => executableContext.memberContext; |
| 1423 } |
| 1424 |
| 1425 |
| 1426 class InitializingFormalElementZ extends ParameterElementZ |
| 1427 implements InitializingFormalElement { |
| 1428 FieldElement _fieldElement; |
| 1429 |
| 1430 InitializingFormalElementZ(ObjectDecoder decoder) |
| 1431 : super(decoder); |
| 1432 |
| 1433 @override |
| 1434 FieldElement get fieldElement { |
| 1435 if (_fieldElement == null) { |
| 1436 _fieldElement = _decoder.getElement(Key.FIELD); |
| 1437 } |
| 1438 return _fieldElement; |
| 1439 } |
| 1440 |
| 1441 @override |
| 1442 accept(ElementVisitor visitor, arg) { |
| 1443 return visitor.visitFieldParameterElement(this, arg); |
| 1444 } |
| 1445 |
| 1446 @override |
| 1447 ElementKind get kind => ElementKind.INITIALIZING_FORMAL; |
| 1448 |
| 1449 } |
| OLD | NEW |