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

Side by Side Diff: pkg/compiler/lib/src/serialization/modelz.dart

Issue 1335983004: Add ImportElement and ExportElement (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 _ensurePrefix() {
karlklose 2015/09/15 06:35:56 Maybe call this _ensurePrefixResolved.
Johnni Winther 2015/09/15 07:50:06 Done.
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 _ensurePrefix();
1480 return _isDeferred;
1481 }
1482
1483 @override
1484 PrefixElement get prefix {
1485 _ensurePrefix();
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698