| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// Implementation of the element model used for deserialiation. | 5 /// Implementation of the element model used for deserialiation. |
| 6 /// | 6 /// |
| 7 /// These classes are created by [ElementDeserializer] triggered by the | 7 /// These classes are created by [ElementDeserializer] triggered by the |
| 8 /// [Deserializer]. | 8 /// [Deserializer]. |
| 9 | 9 |
| 10 library dart2js.serialization.modelz; | 10 library dart2js.serialization.modelz; |
| 11 | 11 |
| 12 import 'serialization.dart'; | 12 import 'serialization.dart'; |
| 13 import 'keys.dart'; | 13 import 'keys.dart'; |
| 14 import '../compiler.dart' | 14 import '../compiler.dart' |
| 15 show Compiler; | 15 show Compiler; |
| 16 import '../constants/constructors.dart'; | 16 import '../constants/constructors.dart'; |
| 17 import '../constants/expressions.dart'; | 17 import '../constants/expressions.dart'; |
| 18 import '../diagnostics/source_span.dart' | 18 import '../diagnostics/source_span.dart' |
| 19 show SourceSpan; | 19 show SourceSpan; |
| 20 import '../dart_types.dart'; | 20 import '../dart_types.dart'; |
| 21 import '../diagnostics/diagnostic_listener.dart'; | 21 import '../diagnostics/diagnostic_listener.dart'; |
| 22 import '../elements/elements.dart'; | 22 import '../elements/elements.dart'; |
| 23 import '../elements/modelx.dart' show | 23 import '../elements/modelx.dart' show |
| 24 FunctionSignatureX; | 24 FunctionSignatureX; |
| 25 import '../elements/common.dart'; | 25 import '../elements/common.dart'; |
| 26 import '../elements/visitor.dart'; | 26 import '../elements/visitor.dart'; |
| 27 import '../io/source_file.dart'; | 27 import '../io/source_file.dart'; |
| 28 import '../ordered_typeset.dart'; | 28 import '../ordered_typeset.dart'; |
| 29 import '../resolution/class_members.dart' as class_members; | 29 import '../resolution/class_members.dart' as class_members; |
| 30 import '../resolution/enum_creator.dart' show | |
| 31 AstBuilder; | |
| 32 import '../resolution/tree_elements.dart' show | 30 import '../resolution/tree_elements.dart' show |
| 33 TreeElements; | 31 TreeElements; |
| 34 import '../resolution/scope.dart' show | 32 import '../resolution/scope.dart' show |
| 35 Scope; | 33 Scope; |
| 36 import '../script.dart'; | 34 import '../script.dart'; |
| 37 import '../serialization/constant_serialization.dart'; | 35 import '../serialization/constant_serialization.dart'; |
| 38 import '../tokens/precedence_constants.dart' as Precedence show | |
| 39 SEMICOLON_INFO; | |
| 40 import '../tokens/token.dart' show | 36 import '../tokens/token.dart' show |
| 41 Token; | 37 Token; |
| 42 import '../tree/tree.dart'; | 38 import '../tree/tree.dart'; |
| 43 import '../util/util.dart' show | 39 import '../util/util.dart' show |
| 44 Link, | 40 Link, |
| 45 LinkBuilder; | 41 LinkBuilder; |
| 46 | 42 |
| 47 /// Compute a [Link] from an [Iterable]. | 43 /// Compute a [Link] from an [Iterable]. |
| 48 Link toLink(Iterable iterable) { | 44 Link toLink(Iterable iterable) { |
| 49 LinkBuilder builder = new LinkBuilder(); | 45 LinkBuilder builder = new LinkBuilder(); |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 } | 364 } |
| 369 | 365 |
| 370 class LibraryElementZ extends DeserializedElementZ | 366 class LibraryElementZ extends DeserializedElementZ |
| 371 with AnalyzableElementMixin, | 367 with AnalyzableElementMixin, |
| 372 ContainerMixin, | 368 ContainerMixin, |
| 373 LibraryElementCommon | 369 LibraryElementCommon |
| 374 implements LibraryElement { | 370 implements LibraryElement { |
| 375 Uri _canonicalUri; | 371 Uri _canonicalUri; |
| 376 CompilationUnitElement _entryCompilationUnit; | 372 CompilationUnitElement _entryCompilationUnit; |
| 377 Link<CompilationUnitElement> _compilationUnits; | 373 Link<CompilationUnitElement> _compilationUnits; |
| 378 Link<Element> _exports; | 374 List<ImportElement> _imports; |
| 375 List<ExportElement> _exports; |
| 379 ListedContainer _exportsMap; | 376 ListedContainer _exportsMap; |
| 380 ListedContainer _importsMap; | 377 ListedContainer _importsMap; |
| 381 Map<LibraryTag, LibraryElement> _libraryDependencies; | 378 Map<LibraryTag, LibraryElement> _libraryDependencies; |
| 382 | 379 |
| 383 LibraryElementZ(ObjectDecoder decoder) | 380 LibraryElementZ(ObjectDecoder decoder) |
| 384 : super(decoder); | 381 : super(decoder); |
| 385 | 382 |
| 386 @override | 383 @override |
| 387 ElementKind get kind => ElementKind.LIBRARY; | 384 ElementKind get kind => ElementKind.LIBRARY; |
| 388 | 385 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 419 @override | 416 @override |
| 420 Link<CompilationUnitElement> get compilationUnits { | 417 Link<CompilationUnitElement> get compilationUnits { |
| 421 if (_compilationUnits == null) { | 418 if (_compilationUnits == null) { |
| 422 _compilationUnits = | 419 _compilationUnits = |
| 423 toLink(_decoder.getElements(Key.COMPILATION_UNITS)); | 420 toLink(_decoder.getElements(Key.COMPILATION_UNITS)); |
| 424 } | 421 } |
| 425 return _compilationUnits; | 422 return _compilationUnits; |
| 426 } | 423 } |
| 427 | 424 |
| 428 @override | 425 @override |
| 429 bool hasLibraryName() { | 426 bool get hasLibraryName { |
| 430 return getLibraryName() != ''; | 427 return libraryName != ''; |
| 431 } | 428 } |
| 432 | 429 |
| 433 @override | 430 @override |
| 434 String getLibraryName() { | 431 String get libraryName { |
| 435 return _decoder.getString(Key.LIBRARY_NAME); | 432 return _decoder.getString(Key.LIBRARY_NAME); |
| 436 } | 433 } |
| 437 | 434 |
| 438 @override | 435 @override |
| 439 bool get exportsHandled => true; | 436 bool get exportsHandled => true; |
| 440 | 437 |
| 441 void _ensureExports() { | 438 void _ensureExports() { |
| 442 if (_exports == null) { | 439 if (_exportsMap == null) { |
| 443 _exportsMap = new ListedContainer(_decoder.getElements(Key.EXPORTS)); | 440 _exportsMap = new ListedContainer(_decoder.getElements(Key.EXPORT_SCOPE)); |
| 444 _exports = toLink(_exportsMap.values); | |
| 445 } | 441 } |
| 446 } | 442 } |
| 447 | 443 |
| 448 Link<Element> get exports { | |
| 449 _ensureExports(); | |
| 450 return _exports; | |
| 451 } | |
| 452 | |
| 453 @override | 444 @override |
| 454 void forEachExport(f(Element element)) { | 445 void forEachExport(f(Element element)) { |
| 455 exports.forEach(f); | 446 _ensureExports(); |
| 447 _exportsMap.forEach(f); |
| 456 } | 448 } |
| 457 | 449 |
| 458 @override | 450 @override |
| 459 Element find(String elementName) { | 451 Element find(String elementName) { |
| 460 Element element = localLookup(elementName); | 452 Element element = localLookup(elementName); |
| 461 if (element == null) { | 453 if (element == null) { |
| 462 _ensureImports(); | 454 _ensureImports(); |
| 463 element = _importsMap.lookup(elementName); | 455 element = _importsMap.lookup(elementName); |
| 464 } | 456 } |
| 465 return element; | 457 return element; |
| 466 } | 458 } |
| 467 | 459 |
| 468 @override | 460 @override |
| 469 Element findLocal(String elementName) { | 461 Element findLocal(String elementName) { |
| 470 return localLookup(elementName); | 462 return localLookup(elementName); |
| 471 } | 463 } |
| 472 | 464 |
| 473 void _ensureLibraryDependencies() { | |
| 474 if (_libraryDependencies == null) { | |
| 475 _libraryDependencies = <LibraryTag, LibraryElement>{}; | |
| 476 ListDecoder tags = _decoder.getList(Key.TAGS); | |
| 477 AstBuilder builder = new AstBuilder(0); | |
| 478 for (int i = 0; i < tags.length; i++) { | |
| 479 ObjectDecoder dependency = tags.getObject(i); | |
| 480 String kind = dependency.getString(Key.KIND); | |
| 481 LibraryElement library = dependency.getElement(Key.LIBRARY); | |
| 482 // TODO(johnniwinther): Add `ImportElement` and `ExportElement` to the | |
| 483 // element model to avoid hacking up nodes. | |
| 484 if (kind == 'import') { | |
| 485 Import tag = new Import( | |
| 486 builder.keywordToken('import'), | |
| 487 builder.literalString(library.canonicalUri.toString()) | |
| 488 ..getEndToken().next = | |
| 489 builder.symbolToken(Precedence.SEMICOLON_INFO), | |
| 490 null, // prefix | |
| 491 null, // combinators | |
| 492 null, // metadata | |
| 493 isDeferred: false); | |
| 494 _libraryDependencies[tag] = library; | |
| 495 } else if (kind == 'export') { | |
| 496 Export tag = new Export( | |
| 497 builder.keywordToken('export'), | |
| 498 builder.literalString(library.canonicalUri.toString()) | |
| 499 ..getEndToken().next = | |
| 500 builder.symbolToken(Precedence.SEMICOLON_INFO), | |
| 501 null, // combinators | |
| 502 null); // metadata | |
| 503 _libraryDependencies[tag] = library; | |
| 504 } | |
| 505 } | |
| 506 } | |
| 507 } | |
| 508 | |
| 509 @override | |
| 510 Iterable<LibraryTag> get tags { | |
| 511 _ensureLibraryDependencies(); | |
| 512 return _libraryDependencies.keys; | |
| 513 } | |
| 514 | |
| 515 LibraryElement getLibraryFromTag(LibraryDependency tag) { | |
| 516 _ensureLibraryDependencies(); | |
| 517 return _libraryDependencies[tag]; | |
| 518 } | |
| 519 | |
| 520 @override | 465 @override |
| 521 bool get canUseNative => false; | 466 bool get canUseNative => false; |
| 522 | 467 |
| 523 @override | 468 @override |
| 524 Element findExported(String elementName) => _unsupported('findExported'); | 469 Element findExported(String elementName) => _unsupported('findExported'); |
| 525 | 470 |
| 526 void _ensureImports() { | 471 void _ensureImports() { |
| 527 if (_importsMap == null) { | 472 if (_importsMap == null) { |
| 528 _importsMap = new ListedContainer(_decoder.getElements(Key.IMPORTS)); | 473 _importsMap = new ListedContainer(_decoder.getElements(Key.IMPORT_SCOPE)); |
| 529 } | 474 } |
| 530 } | 475 } |
| 531 | 476 |
| 532 @override | 477 @override |
| 533 void forEachImport(f(Element element)) { | 478 void forEachImport(f(Element element)) { |
| 534 _ensureImports(); | 479 _ensureImports(); |
| 535 _importsMap.forEach(f); | 480 _importsMap.forEach(f); |
| 536 } | 481 } |
| 537 | 482 |
| 538 @override | 483 @override |
| 539 Link<Import> getImportsFor(Element element) => _unsupported('getImportsFor'); | 484 Iterable<ImportElement> getImportsFor(Element element) { |
| 540 | 485 return _unsupported('getImportsFor'); |
| 541 @override | 486 } |
| 542 LibraryName get libraryTag => _unsupported('libraryTag'); | |
| 543 | 487 |
| 544 String toString() { | 488 String toString() { |
| 545 return 'Zlibrary(${canonicalUri})'; | 489 return 'Zlibrary(${canonicalUri})'; |
| 546 } | 490 } |
| 491 |
| 492 @override |
| 493 Iterable<ExportElement> get exports { |
| 494 if (_exports == null) { |
| 495 _exports = _decoder.getElements(Key.EXPORTS, isOptional: true); |
| 496 } |
| 497 return _exports; |
| 498 } |
| 499 |
| 500 @override |
| 501 Iterable<ImportElement> get imports { |
| 502 if (_imports == null) { |
| 503 _imports = _decoder.getElements(Key.IMPORTS, isOptional: true); |
| 504 } |
| 505 return _imports; |
| 506 } |
| 547 } | 507 } |
| 548 | 508 |
| 549 class ScriptZ implements Script { | 509 class ScriptZ implements Script { |
| 550 final Uri resourceUri; | 510 final Uri resourceUri; |
| 551 | 511 |
| 552 ScriptZ(this.resourceUri); | 512 ScriptZ(this.resourceUri); |
| 553 | 513 |
| 554 @override | 514 @override |
| 555 Script copyWithFile(SourceFile file) { | 515 Script copyWithFile(SourceFile file) { |
| 556 throw new UnsupportedError('ScriptZ.copyWithFile'); | 516 throw new UnsupportedError('ScriptZ.copyWithFile'); |
| (...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1449 @override | 1409 @override |
| 1450 ElementKind get kind => ElementKind.PARAMETER; | 1410 ElementKind get kind => ElementKind.PARAMETER; |
| 1451 | 1411 |
| 1452 @override | 1412 @override |
| 1453 LibraryElement get library => executableContext.library; | 1413 LibraryElement get library => executableContext.library; |
| 1454 | 1414 |
| 1455 @override | 1415 @override |
| 1456 MemberElement get memberContext => executableContext.memberContext; | 1416 MemberElement get memberContext => executableContext.memberContext; |
| 1457 } | 1417 } |
| 1458 | 1418 |
| 1459 | |
| 1460 class InitializingFormalElementZ extends ParameterElementZ | 1419 class InitializingFormalElementZ extends ParameterElementZ |
| 1461 implements InitializingFormalElement { | 1420 implements InitializingFormalElement { |
| 1462 FieldElement _fieldElement; | 1421 FieldElement _fieldElement; |
| 1463 | 1422 |
| 1464 InitializingFormalElementZ(ObjectDecoder decoder) | 1423 InitializingFormalElementZ(ObjectDecoder decoder) |
| 1465 : super(decoder); | 1424 : super(decoder); |
| 1466 | 1425 |
| 1467 @override | 1426 @override |
| 1468 FieldElement get fieldElement { | 1427 FieldElement get fieldElement { |
| 1469 if (_fieldElement == null) { | 1428 if (_fieldElement == null) { |
| 1470 _fieldElement = _decoder.getElement(Key.FIELD); | 1429 _fieldElement = _decoder.getElement(Key.FIELD); |
| 1471 } | 1430 } |
| 1472 return _fieldElement; | 1431 return _fieldElement; |
| 1473 } | 1432 } |
| 1474 | 1433 |
| 1475 @override | 1434 @override |
| 1476 accept(ElementVisitor visitor, arg) { | 1435 accept(ElementVisitor visitor, arg) { |
| 1477 return visitor.visitFieldParameterElement(this, arg); | 1436 return visitor.visitFieldParameterElement(this, arg); |
| 1478 } | 1437 } |
| 1479 | 1438 |
| 1480 @override | 1439 @override |
| 1481 ElementKind get kind => ElementKind.INITIALIZING_FORMAL; | 1440 ElementKind get kind => ElementKind.INITIALIZING_FORMAL; |
| 1441 } |
| 1482 | 1442 |
| 1443 class ImportElementZ extends DeserializedElementZ |
| 1444 with LibraryMemberMixin implements ImportElement { |
| 1445 bool _isDeferred; |
| 1446 PrefixElement _prefix; |
| 1447 LibraryElement _importedLibrary; |
| 1448 Uri _uri; |
| 1449 |
| 1450 ImportElementZ(ObjectDecoder decoder) |
| 1451 : super(decoder); |
| 1452 |
| 1453 @override |
| 1454 String get name => ''; |
| 1455 |
| 1456 @override |
| 1457 accept(ElementVisitor visitor, arg) => visitor.visitImportElement(this, arg); |
| 1458 |
| 1459 @override |
| 1460 ElementKind get kind => ElementKind.IMPORT; |
| 1461 |
| 1462 @override |
| 1463 LibraryElement get importedLibrary { |
| 1464 if (_importedLibrary == null) { |
| 1465 _importedLibrary = _decoder.getElement(Key.LIBRARY_DEPENDENCY); |
| 1466 } |
| 1467 return _importedLibrary; |
| 1468 } |
| 1469 |
| 1470 void _ensurePrefixResolved() { |
| 1471 if (_isDeferred == null) { |
| 1472 _isDeferred = _decoder.getBool(Key.IS_DEFERRED); |
| 1473 _prefix = _decoder.getElement(Key.PREFIX, isOptional: true); |
| 1474 } |
| 1475 } |
| 1476 |
| 1477 @override |
| 1478 bool get isDeferred { |
| 1479 _ensurePrefixResolved(); |
| 1480 return _isDeferred; |
| 1481 } |
| 1482 |
| 1483 @override |
| 1484 PrefixElement get prefix { |
| 1485 _ensurePrefixResolved(); |
| 1486 return _prefix; |
| 1487 } |
| 1488 |
| 1489 @override |
| 1490 Uri get uri { |
| 1491 if (_uri == null) { |
| 1492 _uri = _decoder.getUri(Key.URI); |
| 1493 } |
| 1494 return _uri; |
| 1495 } |
| 1496 |
| 1497 @override |
| 1498 Import get node => _unsupported('node'); |
| 1499 |
| 1500 String toString() => 'Z$kind($uri)'; |
| 1501 } |
| 1502 |
| 1503 class ExportElementZ extends DeserializedElementZ |
| 1504 with LibraryMemberMixin implements ExportElement { |
| 1505 LibraryElement _exportedLibrary; |
| 1506 Uri _uri; |
| 1507 |
| 1508 ExportElementZ(ObjectDecoder decoder) |
| 1509 : super(decoder); |
| 1510 |
| 1511 @override |
| 1512 String get name => ''; |
| 1513 |
| 1514 @override |
| 1515 accept(ElementVisitor visitor, arg) => visitor.visitExportElement(this, arg); |
| 1516 |
| 1517 @override |
| 1518 ElementKind get kind => ElementKind.EXPORT; |
| 1519 |
| 1520 @override |
| 1521 LibraryElement get exportedLibrary { |
| 1522 if (_exportedLibrary == null) { |
| 1523 _exportedLibrary = _decoder.getElement(Key.LIBRARY_DEPENDENCY); |
| 1524 } |
| 1525 return _exportedLibrary; |
| 1526 } |
| 1527 |
| 1528 @override |
| 1529 Uri get uri { |
| 1530 if (_uri == null) { |
| 1531 _uri = _decoder.getUri(Key.URI); |
| 1532 } |
| 1533 return _uri; |
| 1534 } |
| 1535 |
| 1536 @override |
| 1537 Export get node => _unsupported('node'); |
| 1538 |
| 1539 String toString() => 'Z$kind($uri)'; |
| 1540 } |
| 1541 |
| 1542 class PrefixElementZ extends DeserializedElementZ |
| 1543 with LibraryMemberMixin implements PrefixElement { |
| 1544 bool _isDeferred; |
| 1545 ImportElement _deferredImport; |
| 1546 |
| 1547 PrefixElementZ(ObjectDecoder decoder) |
| 1548 : super(decoder); |
| 1549 |
| 1550 @override |
| 1551 accept(ElementVisitor visitor, arg) => visitor.visitPrefixElement(this, arg); |
| 1552 |
| 1553 void _ensureDeferred() { |
| 1554 if (_isDeferred == null) { |
| 1555 _isDeferred = _decoder.getBool(Key.IS_DEFERRED); |
| 1556 _deferredImport = _decoder.getElement(Key.IMPORT, isOptional: true); |
| 1557 } |
| 1558 } |
| 1559 |
| 1560 @override |
| 1561 ImportElement get deferredImport { |
| 1562 _ensureDeferred(); |
| 1563 return _deferredImport; |
| 1564 } |
| 1565 |
| 1566 @override |
| 1567 bool get isDeferred { |
| 1568 _ensureDeferred(); |
| 1569 return _isDeferred; |
| 1570 } |
| 1571 |
| 1572 @override |
| 1573 ElementKind get kind => ElementKind.PREFIX; |
| 1574 |
| 1575 @override |
| 1576 Element lookupLocalMember(String memberName) { |
| 1577 return _unsupported('lookupLocalMember'); |
| 1578 } |
| 1483 } | 1579 } |
| OLD | NEW |