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