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