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

Side by Side Diff: pkg/analyzer/lib/src/summary/resynthesize.dart

Issue 1584313005: Downplay the distinction between linked and prelinked summaries. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 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 library summary_resynthesizer; 5 library summary_resynthesizer;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/analyzer.dart'; 9 import 'package:analyzer/analyzer.dart';
10 import 'package:analyzer/src/generated/element.dart'; 10 import 'package:analyzer/src/generated/element.dart';
11 import 'package:analyzer/src/generated/element_handle.dart'; 11 import 'package:analyzer/src/generated/element_handle.dart';
12 import 'package:analyzer/src/generated/engine.dart'; 12 import 'package:analyzer/src/generated/engine.dart';
13 import 'package:analyzer/src/generated/resolver.dart'; 13 import 'package:analyzer/src/generated/resolver.dart';
14 import 'package:analyzer/src/generated/source_io.dart'; 14 import 'package:analyzer/src/generated/source_io.dart';
15 import 'package:analyzer/src/summary/format.dart'; 15 import 'package:analyzer/src/summary/format.dart';
16 16
17 /** 17 /**
18 * Callback used by [SummaryResynthesizer] to obtain the prelinked summary for 18 * Callback used by [SummaryResynthesizer] to obtain the linked summary for
19 * a given URI. 19 * a given URI.
20 */ 20 */
21 typedef PrelinkedLibrary GetPrelinkedSummaryCallback(String uri); 21 typedef LinkedLibrary GetLinkedSummaryCallback(String uri);
22 22
23 /** 23 /**
24 * Callback used by [SummaryResynthesizer] to obtain the unlinked summary for a 24 * Callback used by [SummaryResynthesizer] to obtain the unlinked summary for a
25 * given URI. 25 * given URI.
26 */ 26 */
27 typedef UnlinkedUnit GetUnlinkedSummaryCallback(String uri); 27 typedef UnlinkedUnit GetUnlinkedSummaryCallback(String uri);
28 28
29 /** 29 /**
30 * Implementation of [ElementResynthesizer] used when resynthesizing an element 30 * Implementation of [ElementResynthesizer] used when resynthesizing an element
31 * model from summaries. 31 * model from summaries.
32 */ 32 */
33 class SummaryResynthesizer extends ElementResynthesizer { 33 class SummaryResynthesizer extends ElementResynthesizer {
34 /** 34 /**
35 * Callback used to obtain the prelinked summary for a given URI. 35 * Callback used to obtain the linked summary for a given URI.
36 */ 36 */
37 final GetPrelinkedSummaryCallback getPrelinkedSummary; 37 final GetLinkedSummaryCallback getLinkedSummary;
38 38
39 /** 39 /**
40 * Callback used to obtain the unlinked summary for a given URI. 40 * Callback used to obtain the unlinked summary for a given URI.
41 */ 41 */
42 final GetUnlinkedSummaryCallback getUnlinkedSummary; 42 final GetUnlinkedSummaryCallback getUnlinkedSummary;
43 43
44 /** 44 /**
45 * Source factory used to convert URIs to [Source] objects. 45 * Source factory used to convert URIs to [Source] objects.
46 */ 46 */
47 final SourceFactory sourceFactory; 47 final SourceFactory sourceFactory;
(...skipping 18 matching lines...) Expand all
66 <String, Map<String, Map<String, Element>>>{}; 66 <String, Map<String, Map<String, Element>>>{};
67 67
68 /** 68 /**
69 * Map of libraries which have been resynthesized from summaries. The map 69 * Map of libraries which have been resynthesized from summaries. The map
70 * key is the library URI. 70 * key is the library URI.
71 */ 71 */
72 final Map<String, LibraryElement> _resynthesizedLibraries = 72 final Map<String, LibraryElement> _resynthesizedLibraries =
73 <String, LibraryElement>{}; 73 <String, LibraryElement>{};
74 74
75 SummaryResynthesizer(AnalysisContext context, this.typeProvider, 75 SummaryResynthesizer(AnalysisContext context, this.typeProvider,
76 this.getPrelinkedSummary, this.getUnlinkedSummary, this.sourceFactory) 76 this.getLinkedSummary, this.getUnlinkedSummary, this.sourceFactory)
77 : super(context); 77 : super(context);
78 78
79 /** 79 /**
80 * Number of libraries that have been resynthesized so far. 80 * Number of libraries that have been resynthesized so far.
81 */ 81 */
82 int get resynthesisCount => _resynthesizedLibraries.length; 82 int get resynthesisCount => _resynthesizedLibraries.length;
83 83
84 @override 84 @override
85 Element getElement(ElementLocation location) { 85 Element getElement(ElementLocation location) {
86 if (location.components.length == 1) { 86 if (location.components.length == 1) {
(...skipping 20 matching lines...) Expand all
107 throw new UnimplementedError(location.toString()); 107 throw new UnimplementedError(location.toString());
108 } 108 }
109 } 109 }
110 110
111 /** 111 /**
112 * Get the [LibraryElement] for the given [uri], resynthesizing it if it 112 * Get the [LibraryElement] for the given [uri], resynthesizing it if it
113 * hasn't been resynthesized already. 113 * hasn't been resynthesized already.
114 */ 114 */
115 LibraryElement getLibraryElement(String uri) { 115 LibraryElement getLibraryElement(String uri) {
116 return _resynthesizedLibraries.putIfAbsent(uri, () { 116 return _resynthesizedLibraries.putIfAbsent(uri, () {
117 PrelinkedLibrary serializedLibrary = getPrelinkedSummary(uri); 117 LinkedLibrary serializedLibrary = getLinkedSummary(uri);
118 List<UnlinkedUnit> serializedUnits = <UnlinkedUnit>[ 118 List<UnlinkedUnit> serializedUnits = <UnlinkedUnit>[
119 getUnlinkedSummary(uri) 119 getUnlinkedSummary(uri)
120 ]; 120 ];
121 Source librarySource = _getSource(uri); 121 Source librarySource = _getSource(uri);
122 for (String part in serializedUnits[0].publicNamespace.parts) { 122 for (String part in serializedUnits[0].publicNamespace.parts) {
123 Source partSource = sourceFactory.resolveUri(librarySource, part); 123 Source partSource = sourceFactory.resolveUri(librarySource, part);
124 String partAbsUri = partSource.uri.toString(); 124 String partAbsUri = partSource.uri.toString();
125 serializedUnits.add(getUnlinkedSummary(partAbsUri)); 125 serializedUnits.add(getUnlinkedSummary(partAbsUri));
126 } 126 }
127 _LibraryResynthesizer libraryResynthesizer = new _LibraryResynthesizer( 127 _LibraryResynthesizer libraryResynthesizer = new _LibraryResynthesizer(
(...skipping 16 matching lines...) Expand all
144 * An instance of [_LibraryResynthesizer] is responsible for resynthesizing the 144 * An instance of [_LibraryResynthesizer] is responsible for resynthesizing the
145 * elements in a single library from that library's summary. 145 * elements in a single library from that library's summary.
146 */ 146 */
147 class _LibraryResynthesizer { 147 class _LibraryResynthesizer {
148 /** 148 /**
149 * The [SummaryResynthesizer] which is being used to obtain summaries. 149 * The [SummaryResynthesizer] which is being used to obtain summaries.
150 */ 150 */
151 final SummaryResynthesizer summaryResynthesizer; 151 final SummaryResynthesizer summaryResynthesizer;
152 152
153 /** 153 /**
154 * Prelinked summary of the library to be resynthesized. 154 * Linked summary of the library to be resynthesized.
155 */ 155 */
156 final PrelinkedLibrary prelinkedLibrary; 156 final LinkedLibrary linkedLibrary;
157 157
158 /** 158 /**
159 * Unlinked compilation units constituting the library to be resynthesized. 159 * Unlinked compilation units constituting the library to be resynthesized.
160 */ 160 */
161 final List<UnlinkedUnit> unlinkedUnits; 161 final List<UnlinkedUnit> unlinkedUnits;
162 162
163 /** 163 /**
164 * [Source] object for the library to be resynthesized. 164 * [Source] object for the library to be resynthesized.
165 */ 165 */
166 final Source librarySource; 166 final Source librarySource;
(...skipping 10 matching lines...) Expand all
177 List<ClassElementImpl> delayedObjectSubclasses = <ClassElementImpl>[]; 177 List<ClassElementImpl> delayedObjectSubclasses = <ClassElementImpl>[];
178 178
179 /** 179 /**
180 * [ElementHolder] into which resynthesized elements should be placed. This 180 * [ElementHolder] into which resynthesized elements should be placed. This
181 * object is recreated afresh for each unit in the library, and is used to 181 * object is recreated afresh for each unit in the library, and is used to
182 * populate the [CompilationUnitElement]. 182 * populate the [CompilationUnitElement].
183 */ 183 */
184 ElementHolder unitHolder; 184 ElementHolder unitHolder;
185 185
186 /** 186 /**
187 * The [PrelinkedUnit] from which elements are currently being resynthesized. 187 * The [LinkedUnit] from which elements are currently being resynthesized.
188 */ 188 */
189 PrelinkedUnit prelinkedUnit; 189 LinkedUnit linkedUnit;
190 190
191 /** 191 /**
192 * The [UnlinkedUnit] from which elements are currently being resynthesized. 192 * The [UnlinkedUnit] from which elements are currently being resynthesized.
193 */ 193 */
194 UnlinkedUnit unlinkedUnit; 194 UnlinkedUnit unlinkedUnit;
195 195
196 /** 196 /**
197 * Map of top level elements that have been resynthesized so far. The first 197 * Map of top level elements that have been resynthesized so far. The first
198 * key is the URI of the compilation unit; the second is the name of the top 198 * key is the URI of the compilation unit; the second is the name of the top
199 * level element. 199 * level element.
200 */ 200 */
201 final Map<String, Map<String, Element>> resummarizedElements = 201 final Map<String, Map<String, Element>> resummarizedElements =
202 <String, Map<String, Element>>{}; 202 <String, Map<String, Element>>{};
203 203
204 /** 204 /**
205 * Type parameters for the generic class, typedef, or executable currently 205 * Type parameters for the generic class, typedef, or executable currently
206 * being resynthesized, if any. If multiple entities with type parameters 206 * being resynthesized, if any. If multiple entities with type parameters
207 * are nested (e.g. a generic executable inside a generic class), this is the 207 * are nested (e.g. a generic executable inside a generic class), this is the
208 * concatenation of all type parameters from all declarations currently in 208 * concatenation of all type parameters from all declarations currently in
209 * force, with the outermost declaration appearing first. If there are no 209 * force, with the outermost declaration appearing first. If there are no
210 * type parameters, or we are not currently resynthesizing a class, typedef, 210 * type parameters, or we are not currently resynthesizing a class, typedef,
211 * or executable, then this is an empty list. 211 * or executable, then this is an empty list.
212 */ 212 */
213 List<TypeParameterElement> currentTypeParameters = <TypeParameterElement>[]; 213 List<TypeParameterElement> currentTypeParameters = <TypeParameterElement>[];
214 214
215 _LibraryResynthesizer(this.summaryResynthesizer, this.prelinkedLibrary, 215 _LibraryResynthesizer(this.summaryResynthesizer, this.linkedLibrary,
216 this.unlinkedUnits, this.librarySource) { 216 this.unlinkedUnits, this.librarySource) {
217 isCoreLibrary = librarySource.uri.toString() == 'dart:core'; 217 isCoreLibrary = librarySource.uri.toString() == 'dart:core';
218 } 218 }
219 219
220 /** 220 /**
221 * Return a list of type arguments corresponding to [currentTypeParameters]. 221 * Return a list of type arguments corresponding to [currentTypeParameters].
222 */ 222 */
223 List<TypeParameterType> get currentTypeArguments => currentTypeParameters 223 List<TypeParameterType> get currentTypeArguments => currentTypeParameters
224 ?.map((TypeParameterElement param) => param.type) 224 ?.map((TypeParameterElement param) => param.type)
225 ?.toList(); 225 ?.toList();
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 serializedExportPublic.combinators.map(buildCombinator).toList(); 521 serializedExportPublic.combinators.map(buildCombinator).toList();
522 exportElement.uriOffset = serializedExportNonPublic.uriOffset; 522 exportElement.uriOffset = serializedExportNonPublic.uriOffset;
523 exportElement.uriEnd = serializedExportNonPublic.uriEnd; 523 exportElement.uriEnd = serializedExportNonPublic.uriEnd;
524 return exportElement; 524 return exportElement;
525 } 525 }
526 526
527 /** 527 /**
528 * Build an [ElementHandle] referring to the entity referred to by the given 528 * Build an [ElementHandle] referring to the entity referred to by the given
529 * [exportName]. 529 * [exportName].
530 */ 530 */
531 ElementHandle buildExportName(PrelinkedExportName exportName) { 531 ElementHandle buildExportName(LinkedExportName exportName) {
532 String name = exportName.name; 532 String name = exportName.name;
533 if (exportName.kind == PrelinkedReferenceKind.topLevelPropertyAccessor && 533 if (exportName.kind == ReferenceKind.topLevelPropertyAccessor &&
534 !name.endsWith('=')) { 534 !name.endsWith('=')) {
535 name += '?'; 535 name += '?';
536 } 536 }
537 ElementLocationImpl location = getReferencedLocation( 537 ElementLocationImpl location = getReferencedLocation(
538 prelinkedLibrary.dependencies[exportName.dependency], 538 linkedLibrary.dependencies[exportName.dependency],
539 exportName.unit, 539 exportName.unit,
540 name); 540 name);
541 switch (exportName.kind) { 541 switch (exportName.kind) {
542 case PrelinkedReferenceKind.classOrEnum: 542 case ReferenceKind.classOrEnum:
543 return new ClassElementHandle(summaryResynthesizer, location); 543 return new ClassElementHandle(summaryResynthesizer, location);
544 case PrelinkedReferenceKind.typedef: 544 case ReferenceKind.typedef:
545 return new FunctionTypeAliasElementHandle( 545 return new FunctionTypeAliasElementHandle(
546 summaryResynthesizer, location); 546 summaryResynthesizer, location);
547 case PrelinkedReferenceKind.topLevelFunction: 547 case ReferenceKind.topLevelFunction:
548 return new FunctionElementHandle(summaryResynthesizer, location); 548 return new FunctionElementHandle(summaryResynthesizer, location);
549 case PrelinkedReferenceKind.topLevelPropertyAccessor: 549 case ReferenceKind.topLevelPropertyAccessor:
550 return new PropertyAccessorElementHandle( 550 return new PropertyAccessorElementHandle(
551 summaryResynthesizer, location); 551 summaryResynthesizer, location);
552 case PrelinkedReferenceKind.prefix: 552 case ReferenceKind.prefix:
553 case PrelinkedReferenceKind.unresolved: 553 case ReferenceKind.unresolved:
554 // Should never happen. Exported names never refer to import prefixes, 554 // Should never happen. Exported names never refer to import prefixes,
555 // and they always refer to defined entities. 555 // and they always refer to defined entities.
556 throw new StateError('Unexpected export name kind: ${exportName.kind}'); 556 throw new StateError('Unexpected export name kind: ${exportName.kind}');
557 } 557 }
558 } 558 }
559 559
560 /** 560 /**
561 * Build the export namespace for the library by aggregating together its 561 * Build the export namespace for the library by aggregating together its
562 * [publicNamespace] and [exportNames]. 562 * [publicNamespace] and [exportNames].
563 */ 563 */
564 Namespace buildExportNamespace( 564 Namespace buildExportNamespace(
565 Namespace publicNamespace, List<PrelinkedExportName> exportNames) { 565 Namespace publicNamespace, List<LinkedExportName> exportNames) {
566 HashMap<String, Element> definedNames = new HashMap<String, Element>(); 566 HashMap<String, Element> definedNames = new HashMap<String, Element>();
567 // Start by populating all the public names from [publicNamespace]. 567 // Start by populating all the public names from [publicNamespace].
568 publicNamespace.definedNames.forEach((String name, Element element) { 568 publicNamespace.definedNames.forEach((String name, Element element) {
569 definedNames[name] = element; 569 definedNames[name] = element;
570 }); 570 });
571 // Add all the names from [exportNames]. 571 // Add all the names from [exportNames].
572 for (PrelinkedExportName exportName in exportNames) { 572 for (LinkedExportName exportName in exportNames) {
573 definedNames.putIfAbsent( 573 definedNames.putIfAbsent(
574 exportName.name, () => buildExportName(exportName)); 574 exportName.name, () => buildExportName(exportName));
575 } 575 }
576 return new Namespace(definedNames); 576 return new Namespace(definedNames);
577 } 577 }
578 578
579 /** 579 /**
580 * Resynthesize a [FieldElement]. 580 * Resynthesize a [FieldElement].
581 */ 581 */
582 FieldElement buildField(UnlinkedVariable serializedField) { 582 FieldElement buildField(UnlinkedVariable serializedField) {
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 /** 670 /**
671 * Resynthesize an [ImportElement]. 671 * Resynthesize an [ImportElement].
672 */ 672 */
673 ImportElement buildImport(UnlinkedImport serializedImport, int dependency) { 673 ImportElement buildImport(UnlinkedImport serializedImport, int dependency) {
674 bool isSynthetic = serializedImport.isImplicit; 674 bool isSynthetic = serializedImport.isImplicit;
675 // TODO(paulberry): it seems problematic for the offset to be 0 for 675 // TODO(paulberry): it seems problematic for the offset to be 0 for
676 // non-synthetic imports, since it is used to disambiguate location. 676 // non-synthetic imports, since it is used to disambiguate location.
677 ImportElementImpl importElement = 677 ImportElementImpl importElement =
678 new ImportElementImpl(isSynthetic ? -1 : serializedImport.offset); 678 new ImportElementImpl(isSynthetic ? -1 : serializedImport.offset);
679 String absoluteUri = summaryResynthesizer.sourceFactory 679 String absoluteUri = summaryResynthesizer.sourceFactory
680 .resolveUri( 680 .resolveUri(librarySource, linkedLibrary.dependencies[dependency].uri)
681 librarySource, prelinkedLibrary.dependencies[dependency].uri)
682 .uri 681 .uri
683 .toString(); 682 .toString();
684 importElement.importedLibrary = new LibraryElementHandle( 683 importElement.importedLibrary = new LibraryElementHandle(
685 summaryResynthesizer, 684 summaryResynthesizer,
686 new ElementLocationImpl.con3(<String>[absoluteUri])); 685 new ElementLocationImpl.con3(<String>[absoluteUri]));
687 if (isSynthetic) { 686 if (isSynthetic) {
688 importElement.synthetic = true; 687 importElement.synthetic = true;
689 } else { 688 } else {
690 importElement.uri = serializedImport.uri; 689 importElement.uri = serializedImport.uri;
691 importElement.uriOffset = serializedImport.uriOffset; 690 importElement.uriOffset = serializedImport.uriOffset;
(...skipping 25 matching lines...) Expand all
717 buildDocumentation( 716 buildDocumentation(
718 libraryElement, unlinkedUnits[0].libraryDocumentationComment); 717 libraryElement, unlinkedUnits[0].libraryDocumentationComment);
719 CompilationUnitElementImpl definingCompilationUnit = 718 CompilationUnitElementImpl definingCompilationUnit =
720 new CompilationUnitElementImpl(librarySource.shortName); 719 new CompilationUnitElementImpl(librarySource.shortName);
721 libraryElement.definingCompilationUnit = definingCompilationUnit; 720 libraryElement.definingCompilationUnit = definingCompilationUnit;
722 definingCompilationUnit.source = librarySource; 721 definingCompilationUnit.source = librarySource;
723 definingCompilationUnit.librarySource = librarySource; 722 definingCompilationUnit.librarySource = librarySource;
724 List<CompilationUnitElement> parts = <CompilationUnitElement>[]; 723 List<CompilationUnitElement> parts = <CompilationUnitElement>[];
725 UnlinkedUnit unlinkedDefiningUnit = unlinkedUnits[0]; 724 UnlinkedUnit unlinkedDefiningUnit = unlinkedUnits[0];
726 assert(unlinkedDefiningUnit.publicNamespace.parts.length + 1 == 725 assert(unlinkedDefiningUnit.publicNamespace.parts.length + 1 ==
727 prelinkedLibrary.units.length); 726 linkedLibrary.units.length);
728 for (int i = 1; i < prelinkedLibrary.units.length; i++) { 727 for (int i = 1; i < linkedLibrary.units.length; i++) {
729 CompilationUnitElementImpl part = buildPart( 728 CompilationUnitElementImpl part = buildPart(
730 unlinkedDefiningUnit.publicNamespace.parts[i - 1], 729 unlinkedDefiningUnit.publicNamespace.parts[i - 1],
731 unlinkedDefiningUnit.parts[i - 1], 730 unlinkedDefiningUnit.parts[i - 1],
732 unlinkedUnits[i]); 731 unlinkedUnits[i]);
733 parts.add(part); 732 parts.add(part);
734 } 733 }
735 libraryElement.parts = parts; 734 libraryElement.parts = parts;
736 List<ImportElement> imports = <ImportElement>[]; 735 List<ImportElement> imports = <ImportElement>[];
737 for (int i = 0; i < unlinkedDefiningUnit.imports.length; i++) { 736 for (int i = 0; i < unlinkedDefiningUnit.imports.length; i++) {
738 imports.add(buildImport(unlinkedDefiningUnit.imports[i], 737 imports.add(buildImport(unlinkedDefiningUnit.imports[i],
739 prelinkedLibrary.importDependencies[i])); 738 linkedLibrary.importDependencies[i]));
740 } 739 }
741 libraryElement.imports = imports; 740 libraryElement.imports = imports;
742 List<ExportElement> exports = <ExportElement>[]; 741 List<ExportElement> exports = <ExportElement>[];
743 assert(unlinkedDefiningUnit.exports.length == 742 assert(unlinkedDefiningUnit.exports.length ==
744 unlinkedDefiningUnit.publicNamespace.exports.length); 743 unlinkedDefiningUnit.publicNamespace.exports.length);
745 for (int i = 0; i < unlinkedDefiningUnit.exports.length; i++) { 744 for (int i = 0; i < unlinkedDefiningUnit.exports.length; i++) {
746 exports.add(buildExport(unlinkedDefiningUnit.publicNamespace.exports[i], 745 exports.add(buildExport(unlinkedDefiningUnit.publicNamespace.exports[i],
747 unlinkedDefiningUnit.exports[i])); 746 unlinkedDefiningUnit.exports[i]));
748 } 747 }
749 libraryElement.exports = exports; 748 libraryElement.exports = exports;
750 populateUnit(definingCompilationUnit, 0); 749 populateUnit(definingCompilationUnit, 0);
751 for (int i = 0; i < parts.length; i++) { 750 for (int i = 0; i < parts.length; i++) {
752 populateUnit(parts[i], i + 1); 751 populateUnit(parts[i], i + 1);
753 } 752 }
754 BuildLibraryElementUtils.patchTopLevelAccessors(libraryElement); 753 BuildLibraryElementUtils.patchTopLevelAccessors(libraryElement);
755 // Update delayed Object class references. 754 // Update delayed Object class references.
756 if (isCoreLibrary) { 755 if (isCoreLibrary) {
757 ClassElement objectElement = libraryElement.getType('Object'); 756 ClassElement objectElement = libraryElement.getType('Object');
758 assert(objectElement != null); 757 assert(objectElement != null);
759 for (ClassElementImpl classElement in delayedObjectSubclasses) { 758 for (ClassElementImpl classElement in delayedObjectSubclasses) {
760 classElement.supertype = objectElement.type; 759 classElement.supertype = objectElement.type;
761 } 760 }
762 } 761 }
763 // Compute namespaces. 762 // Compute namespaces.
764 libraryElement.publicNamespace = 763 libraryElement.publicNamespace =
765 new NamespaceBuilder().createPublicNamespaceForLibrary(libraryElement); 764 new NamespaceBuilder().createPublicNamespaceForLibrary(libraryElement);
766 libraryElement.exportNamespace = buildExportNamespace( 765 libraryElement.exportNamespace = buildExportNamespace(
767 libraryElement.publicNamespace, prelinkedLibrary.exportNames); 766 libraryElement.publicNamespace, linkedLibrary.exportNames);
768 // Find the entry point. Note: we can't use element.isEntryPoint because 767 // Find the entry point. Note: we can't use element.isEntryPoint because
769 // that will trigger resynthesis of exported libraries. 768 // that will trigger resynthesis of exported libraries.
770 Element entryPoint = 769 Element entryPoint =
771 libraryElement.exportNamespace.get(FunctionElement.MAIN_FUNCTION_NAME); 770 libraryElement.exportNamespace.get(FunctionElement.MAIN_FUNCTION_NAME);
772 if (entryPoint is FunctionElement) { 771 if (entryPoint is FunctionElement) {
773 libraryElement.entryPoint = entryPoint; 772 libraryElement.entryPoint = entryPoint;
774 } 773 }
775 // Create the synthetic element for `loadLibrary`. 774 // Create the synthetic element for `loadLibrary`.
776 libraryElement.createLoadLibraryFunction(summaryResynthesizer.typeProvider); 775 libraryElement.createLoadLibraryFunction(summaryResynthesizer.typeProvider);
777 // Done. 776 // Done.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 // TODO(paulberry): make this work for generic methods. 845 // TODO(paulberry): make this work for generic methods.
847 return currentTypeParameters[ 846 return currentTypeParameters[
848 currentTypeParameters.length - type.paramReference].type; 847 currentTypeParameters.length - type.paramReference].type;
849 } else { 848 } else {
850 // TODO(paulberry): handle references to things other than classes (note: 849 // TODO(paulberry): handle references to things other than classes (note:
851 // this should only occur in the case of erroneous code). 850 // this should only occur in the case of erroneous code).
852 // TODO(paulberry): test reference to something inside a part. 851 // TODO(paulberry): test reference to something inside a part.
853 // TODO(paulberry): test reference to something inside a part of the 852 // TODO(paulberry): test reference to something inside a part of the
854 // current lib. 853 // current lib.
855 UnlinkedReference reference = unlinkedUnit.references[type.reference]; 854 UnlinkedReference reference = unlinkedUnit.references[type.reference];
856 PrelinkedReference referenceResolution = 855 LinkedReference referenceResolution =
857 prelinkedUnit.references[type.reference]; 856 linkedUnit.references[type.reference];
858 ElementLocationImpl location; 857 ElementLocationImpl location;
859 if (referenceResolution.dependency != 0) { 858 if (referenceResolution.dependency != 0) {
860 location = getReferencedLocation( 859 location = getReferencedLocation(
861 prelinkedLibrary.dependencies[referenceResolution.dependency], 860 linkedLibrary.dependencies[referenceResolution.dependency],
862 referenceResolution.unit, 861 referenceResolution.unit,
863 reference.name); 862 reference.name);
864 } else if (referenceResolution.kind == 863 } else if (referenceResolution.kind == ReferenceKind.unresolved) {
865 PrelinkedReferenceKind.unresolved) {
866 return summaryResynthesizer.typeProvider.undefinedType; 864 return summaryResynthesizer.typeProvider.undefinedType;
867 } else if (reference.name.isEmpty) { 865 } else if (reference.name.isEmpty) {
868 return summaryResynthesizer.typeProvider.dynamicType; 866 return summaryResynthesizer.typeProvider.dynamicType;
869 } else { 867 } else {
870 String referencedLibraryUri = librarySource.uri.toString(); 868 String referencedLibraryUri = librarySource.uri.toString();
871 String partUri; 869 String partUri;
872 if (referenceResolution.unit != 0) { 870 if (referenceResolution.unit != 0) {
873 String uri = unlinkedUnits[0].publicNamespace.parts[ 871 String uri = unlinkedUnits[0].publicNamespace.parts[
874 referenceResolution.unit - 1]; 872 referenceResolution.unit - 1];
875 Source partSource = 873 Source partSource =
(...skipping 10 matching lines...) Expand all
886 typeArguments = <DartType>[]; 884 typeArguments = <DartType>[];
887 for (int i = 0; i < referenceResolution.numTypeParameters; i++) { 885 for (int i = 0; i < referenceResolution.numTypeParameters; i++) {
888 if (i < type.typeArguments.length) { 886 if (i < type.typeArguments.length) {
889 typeArguments.add(buildType(type.typeArguments[i])); 887 typeArguments.add(buildType(type.typeArguments[i]));
890 } else { 888 } else {
891 typeArguments.add(summaryResynthesizer.typeProvider.dynamicType); 889 typeArguments.add(summaryResynthesizer.typeProvider.dynamicType);
892 } 890 }
893 } 891 }
894 } 892 }
895 switch (referenceResolution.kind) { 893 switch (referenceResolution.kind) {
896 case PrelinkedReferenceKind.classOrEnum: 894 case ReferenceKind.classOrEnum:
897 return new InterfaceTypeImpl.elementWithNameAndArgs( 895 return new InterfaceTypeImpl.elementWithNameAndArgs(
898 new ClassElementHandle(summaryResynthesizer, location), 896 new ClassElementHandle(summaryResynthesizer, location),
899 reference.name, 897 reference.name,
900 typeArguments); 898 typeArguments);
901 case PrelinkedReferenceKind.typedef: 899 case ReferenceKind.typedef:
902 return new FunctionTypeImpl.elementWithNameAndArgs( 900 return new FunctionTypeImpl.elementWithNameAndArgs(
903 new FunctionTypeAliasElementHandle( 901 new FunctionTypeAliasElementHandle(
904 summaryResynthesizer, location), 902 summaryResynthesizer, location),
905 reference.name, 903 reference.name,
906 typeArguments, 904 typeArguments,
907 typeArguments.isNotEmpty); 905 typeArguments.isNotEmpty);
908 default: 906 default:
909 // TODO(paulberry): figure out how to handle this case (which should 907 // TODO(paulberry): figure out how to handle this case (which should
910 // only occur in the event of erroneous code). 908 // only occur in the event of erroneous code).
911 throw new UnimplementedError(); 909 throw new UnimplementedError();
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1005 if (serializedTypeParameter.bound != null) { 1003 if (serializedTypeParameter.bound != null) {
1006 typeParameterElement.bound = buildType(serializedTypeParameter.bound); 1004 typeParameterElement.bound = buildType(serializedTypeParameter.bound);
1007 } 1005 }
1008 } 1006 }
1009 1007
1010 /** 1008 /**
1011 * Build an [ElementLocationImpl] for the entity in the given [unit] of the 1009 * Build an [ElementLocationImpl] for the entity in the given [unit] of the
1012 * given [dependency], having the given [name]. 1010 * given [dependency], having the given [name].
1013 */ 1011 */
1014 ElementLocationImpl getReferencedLocation( 1012 ElementLocationImpl getReferencedLocation(
1015 PrelinkedDependency dependency, int unit, String name) { 1013 LinkedDependency dependency, int unit, String name) {
1016 Source referencedLibrarySource = summaryResynthesizer.sourceFactory 1014 Source referencedLibrarySource = summaryResynthesizer.sourceFactory
1017 .resolveUri(librarySource, dependency.uri); 1015 .resolveUri(librarySource, dependency.uri);
1018 String referencedLibraryUri = referencedLibrarySource.uri.toString(); 1016 String referencedLibraryUri = referencedLibrarySource.uri.toString();
1019 // TODO(paulberry): consider changing Location format so that this is 1017 // TODO(paulberry): consider changing Location format so that this is
1020 // not necessary (2nd string in location should just be the unit 1018 // not necessary (2nd string in location should just be the unit
1021 // number). 1019 // number).
1022 String partUri; 1020 String partUri;
1023 if (unit != 0) { 1021 if (unit != 0) {
1024 UnlinkedUnit referencedLibraryDefiningUnit = 1022 UnlinkedUnit referencedLibraryDefiningUnit =
1025 summaryResynthesizer.getUnlinkedSummary(referencedLibraryUri); 1023 summaryResynthesizer.getUnlinkedSummary(referencedLibraryUri);
1026 String uri = 1024 String uri =
1027 referencedLibraryDefiningUnit.publicNamespace.parts[unit - 1]; 1025 referencedLibraryDefiningUnit.publicNamespace.parts[unit - 1];
1028 Source partSource = summaryResynthesizer.sourceFactory 1026 Source partSource = summaryResynthesizer.sourceFactory
1029 .resolveUri(referencedLibrarySource, uri); 1027 .resolveUri(referencedLibrarySource, uri);
1030 partUri = partSource.uri.toString(); 1028 partUri = partSource.uri.toString();
1031 } else { 1029 } else {
1032 partUri = referencedLibraryUri; 1030 partUri = referencedLibraryUri;
1033 } 1031 }
1034 return new ElementLocationImpl.con3( 1032 return new ElementLocationImpl.con3(
1035 <String>[referencedLibraryUri, partUri, name]); 1033 <String>[referencedLibraryUri, partUri, name]);
1036 } 1034 }
1037 1035
1038 /** 1036 /**
1039 * Populate a [CompilationUnitElement] by deserializing all the elements 1037 * Populate a [CompilationUnitElement] by deserializing all the elements
1040 * contained in it. 1038 * contained in it.
1041 */ 1039 */
1042 void populateUnit(CompilationUnitElementImpl unit, int unitNum) { 1040 void populateUnit(CompilationUnitElementImpl unit, int unitNum) {
1043 prelinkedUnit = prelinkedLibrary.units[unitNum]; 1041 linkedUnit = linkedLibrary.units[unitNum];
1044 unlinkedUnit = unlinkedUnits[unitNum]; 1042 unlinkedUnit = unlinkedUnits[unitNum];
1045 unitHolder = new ElementHolder(); 1043 unitHolder = new ElementHolder();
1046 unlinkedUnit.classes.forEach(buildClass); 1044 unlinkedUnit.classes.forEach(buildClass);
1047 unlinkedUnit.enums.forEach(buildEnum); 1045 unlinkedUnit.enums.forEach(buildEnum);
1048 unlinkedUnit.executables.forEach(buildExecutable); 1046 unlinkedUnit.executables.forEach(buildExecutable);
1049 unlinkedUnit.typedefs.forEach(buildTypedef); 1047 unlinkedUnit.typedefs.forEach(buildTypedef);
1050 unlinkedUnit.variables.forEach(buildVariable); 1048 unlinkedUnit.variables.forEach(buildVariable);
1051 String absoluteUri = unit.source.uri.toString(); 1049 String absoluteUri = unit.source.uri.toString();
1052 unit.accessors = unitHolder.accessors; 1050 unit.accessors = unitHolder.accessors;
1053 unit.enums = unitHolder.enums; 1051 unit.enums = unitHolder.enums;
(...skipping 18 matching lines...) Expand all
1072 elementMap[typeAlias.name] = typeAlias; 1070 elementMap[typeAlias.name] = typeAlias;
1073 } 1071 }
1074 for (FunctionElement function in unit.functions) { 1072 for (FunctionElement function in unit.functions) {
1075 elementMap[function.name] = function; 1073 elementMap[function.name] = function;
1076 } 1074 }
1077 for (PropertyAccessorElementImpl accessor in unit.accessors) { 1075 for (PropertyAccessorElementImpl accessor in unit.accessors) {
1078 elementMap[accessor.identifier] = accessor; 1076 elementMap[accessor.identifier] = accessor;
1079 } 1077 }
1080 resummarizedElements[absoluteUri] = elementMap; 1078 resummarizedElements[absoluteUri] = elementMap;
1081 unitHolder = null; 1079 unitHolder = null;
1082 prelinkedUnit = null; 1080 linkedUnit = null;
1083 unlinkedUnit = null; 1081 unlinkedUnit = null;
1084 } 1082 }
1085 } 1083 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/summary/public_namespace_computer.dart ('k') | pkg/analyzer/lib/src/summary/summarize_elements.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698