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

Side by Side Diff: pkg/analyzer/lib/src/summary/summarize_elements.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 serialization.elements; 5 library serialization.elements;
6 6
7 import 'package:analyzer/dart/element/element.dart'; 7 import 'package:analyzer/dart/element/element.dart';
8 import 'package:analyzer/dart/element/type.dart'; 8 import 'package:analyzer/dart/element/type.dart';
9 import 'package:analyzer/src/dart/element/type.dart'; 9 import 'package:analyzer/src/dart/element/type.dart';
10 import 'package:analyzer/src/generated/resolver.dart'; 10 import 'package:analyzer/src/generated/resolver.dart';
11 import 'package:analyzer/src/generated/utilities_dart.dart'; 11 import 'package:analyzer/src/generated/utilities_dart.dart';
12 import 'package:analyzer/src/summary/format.dart'; 12 import 'package:analyzer/src/summary/format.dart';
13 import 'package:analyzer/src/summary/name_filter.dart'; 13 import 'package:analyzer/src/summary/name_filter.dart';
14 14
15 /** 15 /**
16 * Serialize all the elements in [lib] to a summary using [ctx] as the context 16 * Serialize all the elements in [lib] to a summary using [ctx] as the context
17 * for building the summary, and using [typeProvider] to find built-in types. 17 * for building the summary, and using [typeProvider] to find built-in types.
18 */ 18 */
19 LibrarySerializationResult serializeLibrary( 19 LibrarySerializationResult serializeLibrary(
20 LibraryElement lib, TypeProvider typeProvider) { 20 LibraryElement lib, TypeProvider typeProvider) {
21 var serializer = new _LibrarySerializer(lib, typeProvider); 21 var serializer = new _LibrarySerializer(lib, typeProvider);
22 PrelinkedLibraryBuilder prelinked = serializer.serializeLibrary(); 22 LinkedLibraryBuilder linked = serializer.serializeLibrary();
23 return new LibrarySerializationResult( 23 return new LibrarySerializationResult(
24 prelinked, serializer.unlinkedUnits, serializer.unitUris); 24 linked, serializer.unlinkedUnits, serializer.unitUris);
25 } 25 }
26 26
27 /** 27 /**
28 * Data structure holding the result of serializing a [LibraryElement]. 28 * Data structure holding the result of serializing a [LibraryElement].
29 */ 29 */
30 class LibrarySerializationResult { 30 class LibrarySerializationResult {
31 /** 31 /**
32 * Pre-linked information the given library. 32 * Linked information the given library.
33 */ 33 */
34 final PrelinkedLibraryBuilder prelinked; 34 final LinkedLibraryBuilder linked;
35 35
36 /** 36 /**
37 * Unlinked information for the compilation units constituting the library. 37 * Unlinked information for the compilation units constituting the library.
38 * The zeroth entry in the list is the defining compilation unit; the 38 * The zeroth entry in the list is the defining compilation unit; the
39 * remaining entries are the parts, in the order listed in the defining 39 * remaining entries are the parts, in the order listed in the defining
40 * compilation unit's part declarations. 40 * compilation unit's part declarations.
41 */ 41 */
42 final List<UnlinkedUnitBuilder> unlinkedUnits; 42 final List<UnlinkedUnitBuilder> unlinkedUnits;
43 43
44 /** 44 /**
45 * Absolute URI of each compilation unit appearing in the library. 45 * Absolute URI of each compilation unit appearing in the library.
46 */ 46 */
47 final List<String> unitUris; 47 final List<String> unitUris;
48 48
49 LibrarySerializationResult(this.prelinked, this.unlinkedUnits, this.unitUris); 49 LibrarySerializationResult(this.linked, this.unlinkedUnits, this.unitUris);
50 } 50 }
51 51
52 /** 52 /**
53 * Instances of this class keep track of intermediate state during 53 * Instances of this class keep track of intermediate state during
54 * serialization of a single library.` 54 * serialization of a single library.`
55 */ 55 */
56 class _LibrarySerializer { 56 class _LibrarySerializer {
57 /** 57 /**
58 * The library to be serialized. 58 * The library to be serialized.
59 */ 59 */
60 final LibraryElement libraryElement; 60 final LibraryElement libraryElement;
61 61
62 /** 62 /**
63 * The type provider. This is used to locate the library for `dart:core`. 63 * The type provider. This is used to locate the library for `dart:core`.
64 */ 64 */
65 final TypeProvider typeProvider; 65 final TypeProvider typeProvider;
66 66
67 /** 67 /**
68 * List of objects which should be written to [PrelinkedLibrary.units]. 68 * List of objects which should be written to [LinkedLibrary.units].
69 */ 69 */
70 final List<PrelinkedUnitBuilder> prelinkedUnits = <PrelinkedUnitBuilder>[]; 70 final List<LinkedUnitBuilder> linkedUnits = <LinkedUnitBuilder>[];
71 71
72 /** 72 /**
73 * List of unlinked units corresponding to the pre-linked units in 73 * List of unlinked units corresponding to the linked units in
74 * [prelinkedUnits], 74 * [linkedUnits],
75 */ 75 */
76 final List<UnlinkedUnitBuilder> unlinkedUnits = <UnlinkedUnitBuilder>[]; 76 final List<UnlinkedUnitBuilder> unlinkedUnits = <UnlinkedUnitBuilder>[];
77 77
78 /** 78 /**
79 * List of absolute URIs of the compilation units in the library. 79 * List of absolute URIs of the compilation units in the library.
80 */ 80 */
81 final List<String> unitUris = <String>[]; 81 final List<String> unitUris = <String>[];
82 82
83 /** 83 /**
84 * Map from [LibraryElement] to the index of the entry in the "dependency 84 * Map from [LibraryElement] to the index of the entry in the "dependency
85 * table" that refers to it. 85 * table" that refers to it.
86 */ 86 */
87 final Map<LibraryElement, int> dependencyMap = <LibraryElement, int>{}; 87 final Map<LibraryElement, int> dependencyMap = <LibraryElement, int>{};
88 88
89 /** 89 /**
90 * The "dependency table". This is the list of objects which should be 90 * The "dependency table". This is the list of objects which should be
91 * written to [PrelinkedLibrary.dependencies]. 91 * written to [LinkedLibrary.dependencies].
92 */ 92 */
93 final List<PrelinkedDependencyBuilder> dependencies = 93 final List<LinkedDependencyBuilder> dependencies =
94 <PrelinkedDependencyBuilder>[]; 94 <LinkedDependencyBuilder>[];
95 95
96 /** 96 /**
97 * The prelinked portion of the "imports table". This is the list of ints 97 * The linked portion of the "imports table". This is the list of ints
98 * which should be written to [PrelinkedLibrary.imports]. 98 * which should be written to [LinkedLibrary.imports].
99 */ 99 */
100 final List<int> prelinkedImports = <int>[]; 100 final List<int> linkedImports = <int>[];
101 101
102 /** 102 /**
103 * Map from [Element] to the index of the entry in the "references table" 103 * Map from [Element] to the index of the entry in the "references table"
104 * that refers to it. 104 * that refers to it.
105 */ 105 */
106 final Map<Element, int> referenceMap = <Element, int>{}; 106 final Map<Element, int> referenceMap = <Element, int>{};
107 107
108 /** 108 /**
109 * The unlinked portion of the "references table". This is the list of 109 * The unlinked portion of the "references table". This is the list of
110 * objects which should be written to [UnlinkedUnit.references]. 110 * objects which should be written to [UnlinkedUnit.references].
111 */ 111 */
112 List<UnlinkedReferenceBuilder> unlinkedReferences; 112 List<UnlinkedReferenceBuilder> unlinkedReferences;
113 113
114 /** 114 /**
115 * The prelinked portion of the "references table". This is the list of 115 * The linked portion of the "references table". This is the list of
116 * objects which should be written to [PrelinkedUnit.references]. 116 * objects which should be written to [LinkedUnit.references].
117 */ 117 */
118 List<PrelinkedReferenceBuilder> prelinkedReferences; 118 List<LinkedReferenceBuilder> linkedReferences;
119 119
120 //final Map<String, int> prefixIndices = <String, int>{}; 120 //final Map<String, int> prefixIndices = <String, int>{};
121 121
122 /** 122 /**
123 * Index into the "references table" representing an unresolved reference, if 123 * Index into the "references table" representing an unresolved reference, if
124 * such an index exists. `null` if no such entry has been made in the 124 * such an index exists. `null` if no such entry has been made in the
125 * references table yet. 125 * references table yet.
126 */ 126 */
127 int unresolvedReferenceIndex = null; 127 int unresolvedReferenceIndex = null;
128 128
129 /** 129 /**
130 * Set of libraries which have been seen so far while visiting the transitive 130 * Set of libraries which have been seen so far while visiting the transitive
131 * closure of exports. 131 * closure of exports.
132 */ 132 */
133 final Set<LibraryElement> librariesAddedToTransitiveExportClosure = 133 final Set<LibraryElement> librariesAddedToTransitiveExportClosure =
134 new Set<LibraryElement>(); 134 new Set<LibraryElement>();
135 135
136 /** 136 /**
137 * Map from imported element to the prefix which may be used to refer to that 137 * Map from imported element to the prefix which may be used to refer to that
138 * element; elements for which no prefix is needed are absent from this map. 138 * element; elements for which no prefix is needed are absent from this map.
139 */ 139 */
140 final Map<Element, PrefixElement> prefixMap = <Element, PrefixElement>{}; 140 final Map<Element, PrefixElement> prefixMap = <Element, PrefixElement>{};
141 141
142 _LibrarySerializer(this.libraryElement, this.typeProvider) { 142 _LibrarySerializer(this.libraryElement, this.typeProvider) {
143 dependencies.add(new PrelinkedDependencyBuilder()); 143 dependencies.add(new LinkedDependencyBuilder());
144 dependencyMap[libraryElement] = 0; 144 dependencyMap[libraryElement] = 0;
145 } 145 }
146 146
147 /** 147 /**
148 * Retrieve the library element for `dart:core`. 148 * Retrieve the library element for `dart:core`.
149 */ 149 */
150 LibraryElement get coreLibrary => typeProvider.objectType.element.library; 150 LibraryElement get coreLibrary => typeProvider.objectType.element.library;
151 151
152 /** 152 /**
153 * Add all classes, enums, typedefs, executables, and top level variables 153 * Add all classes, enums, typedefs, executables, and top level variables
154 * from the given compilation unit [element] to the library summary. 154 * from the given compilation unit [element] to the library summary.
155 * [unitNum] indicates the ordinal position of this compilation unit in the 155 * [unitNum] indicates the ordinal position of this compilation unit in the
156 * library. 156 * library.
157 */ 157 */
158 void addCompilationUnitElements(CompilationUnitElement element, int unitNum) { 158 void addCompilationUnitElements(CompilationUnitElement element, int unitNum) {
159 UnlinkedUnitBuilder b = new UnlinkedUnitBuilder(); 159 UnlinkedUnitBuilder b = new UnlinkedUnitBuilder();
160 referenceMap.clear(); 160 referenceMap.clear();
161 unlinkedReferences = <UnlinkedReferenceBuilder>[ 161 unlinkedReferences = <UnlinkedReferenceBuilder>[
162 new UnlinkedReferenceBuilder() 162 new UnlinkedReferenceBuilder()
163 ]; 163 ];
164 prelinkedReferences = <PrelinkedReferenceBuilder>[ 164 linkedReferences = <LinkedReferenceBuilder>[
165 new PrelinkedReferenceBuilder(kind: PrelinkedReferenceKind.classOrEnum) 165 new LinkedReferenceBuilder(kind: ReferenceKind.classOrEnum)
166 ]; 166 ];
167 List<UnlinkedPublicNameBuilder> names = <UnlinkedPublicNameBuilder>[]; 167 List<UnlinkedPublicNameBuilder> names = <UnlinkedPublicNameBuilder>[];
168 for (PropertyAccessorElement accessor in element.accessors) { 168 for (PropertyAccessorElement accessor in element.accessors) {
169 if (accessor.isPublic) { 169 if (accessor.isPublic) {
170 names.add(new UnlinkedPublicNameBuilder( 170 names.add(new UnlinkedPublicNameBuilder(
171 kind: PrelinkedReferenceKind.topLevelPropertyAccessor, 171 kind: ReferenceKind.topLevelPropertyAccessor,
172 name: accessor.name, 172 name: accessor.name,
173 numTypeParameters: accessor.typeParameters.length)); 173 numTypeParameters: accessor.typeParameters.length));
174 } 174 }
175 } 175 }
176 for (ClassElement cls in element.types) { 176 for (ClassElement cls in element.types) {
177 if (cls.isPublic) { 177 if (cls.isPublic) {
178 names.add(new UnlinkedPublicNameBuilder( 178 names.add(new UnlinkedPublicNameBuilder(
179 kind: PrelinkedReferenceKind.classOrEnum, 179 kind: ReferenceKind.classOrEnum,
180 name: cls.name, 180 name: cls.name,
181 numTypeParameters: cls.typeParameters.length)); 181 numTypeParameters: cls.typeParameters.length));
182 } 182 }
183 } 183 }
184 for (ClassElement enm in element.enums) { 184 for (ClassElement enm in element.enums) {
185 if (enm.isPublic) { 185 if (enm.isPublic) {
186 names.add(new UnlinkedPublicNameBuilder( 186 names.add(new UnlinkedPublicNameBuilder(
187 kind: PrelinkedReferenceKind.classOrEnum, name: enm.name)); 187 kind: ReferenceKind.classOrEnum, name: enm.name));
188 } 188 }
189 } 189 }
190 for (FunctionElement function in element.functions) { 190 for (FunctionElement function in element.functions) {
191 if (function.isPublic) { 191 if (function.isPublic) {
192 names.add(new UnlinkedPublicNameBuilder( 192 names.add(new UnlinkedPublicNameBuilder(
193 kind: PrelinkedReferenceKind.topLevelFunction, 193 kind: ReferenceKind.topLevelFunction,
194 name: function.name, 194 name: function.name,
195 numTypeParameters: function.typeParameters.length)); 195 numTypeParameters: function.typeParameters.length));
196 } 196 }
197 } 197 }
198 for (FunctionTypeAliasElement typedef in element.functionTypeAliases) { 198 for (FunctionTypeAliasElement typedef in element.functionTypeAliases) {
199 if (typedef.isPublic) { 199 if (typedef.isPublic) {
200 names.add(new UnlinkedPublicNameBuilder( 200 names.add(new UnlinkedPublicNameBuilder(
201 kind: PrelinkedReferenceKind.typedef, 201 kind: ReferenceKind.typedef,
202 name: typedef.name, 202 name: typedef.name,
203 numTypeParameters: typedef.typeParameters.length)); 203 numTypeParameters: typedef.typeParameters.length));
204 } 204 }
205 } 205 }
206 if (unitNum == 0) { 206 if (unitNum == 0) {
207 if (libraryElement.name.isNotEmpty) { 207 if (libraryElement.name.isNotEmpty) {
208 b.libraryName = libraryElement.name; 208 b.libraryName = libraryElement.name;
209 b.libraryNameOffset = libraryElement.nameOffset; 209 b.libraryNameOffset = libraryElement.nameOffset;
210 b.libraryNameLength = libraryElement.nameLength; 210 b.libraryNameLength = libraryElement.nameLength;
211 b.libraryDocumentationComment = serializeDocumentation(libraryElement); 211 b.libraryDocumentationComment = serializeDocumentation(libraryElement);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 PropertyInducingElement variable = accessor.variable; 248 PropertyInducingElement variable = accessor.variable;
249 if (variable != null) { 249 if (variable != null) {
250 assert(!variable.isSynthetic); 250 assert(!variable.isSynthetic);
251 variables.add(serializeVariable(variable)); 251 variables.add(serializeVariable(variable));
252 } 252 }
253 } 253 }
254 } 254 }
255 b.variables = variables; 255 b.variables = variables;
256 b.references = unlinkedReferences; 256 b.references = unlinkedReferences;
257 unlinkedUnits.add(b); 257 unlinkedUnits.add(b);
258 prelinkedUnits 258 linkedUnits.add(new LinkedUnitBuilder(references: linkedReferences));
259 .add(new PrelinkedUnitBuilder(references: prelinkedReferences));
260 unitUris.add(element.source.uri.toString()); 259 unitUris.add(element.source.uri.toString());
261 unlinkedReferences = null; 260 unlinkedReferences = null;
262 prelinkedReferences = null; 261 linkedReferences = null;
263 } 262 }
264 263
265 /** 264 /**
266 * Add [exportedLibrary] (and the transitive closure of all libraries it 265 * Add [exportedLibrary] (and the transitive closure of all libraries it
267 * exports) to the dependency table ([PrelinkedLibrary.dependencies]). 266 * exports) to the dependency table ([LinkedLibrary.dependencies]).
268 */ 267 */
269 void addTransitiveExportClosure(LibraryElement exportedLibrary) { 268 void addTransitiveExportClosure(LibraryElement exportedLibrary) {
270 if (librariesAddedToTransitiveExportClosure.add(exportedLibrary)) { 269 if (librariesAddedToTransitiveExportClosure.add(exportedLibrary)) {
271 serializeDependency(exportedLibrary); 270 serializeDependency(exportedLibrary);
272 for (LibraryElement transitiveExport 271 for (LibraryElement transitiveExport
273 in exportedLibrary.exportedLibraries) { 272 in exportedLibrary.exportedLibraries) {
274 addTransitiveExportClosure(transitiveExport); 273 addTransitiveExportClosure(transitiveExport);
275 } 274 }
276 } 275 }
277 } 276 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 if (combinator is ShowElementCombinator) { 379 if (combinator is ShowElementCombinator) {
381 b.shows = combinator.shownNames; 380 b.shows = combinator.shownNames;
382 } else if (combinator is HideElementCombinator) { 381 } else if (combinator is HideElementCombinator) {
383 b.hides = combinator.hiddenNames; 382 b.hides = combinator.hiddenNames;
384 } 383 }
385 return b; 384 return b;
386 } 385 }
387 386
388 /** 387 /**
389 * Return the index of the entry in the dependency table 388 * Return the index of the entry in the dependency table
390 * ([PrelinkedLibrary.dependencies]) for the given [dependentLibrary]. A new 389 * ([LinkedLibrary.dependencies]) for the given [dependentLibrary]. A new
391 * entry is added to the table if necessary to satisfy the request. 390 * entry is added to the table if necessary to satisfy the request.
392 */ 391 */
393 int serializeDependency(LibraryElement dependentLibrary) { 392 int serializeDependency(LibraryElement dependentLibrary) {
394 return dependencyMap.putIfAbsent(dependentLibrary, () { 393 return dependencyMap.putIfAbsent(dependentLibrary, () {
395 int index = dependencies.length; 394 int index = dependencies.length;
396 List<String> parts = dependentLibrary.parts 395 List<String> parts = dependentLibrary.parts
397 .map((CompilationUnitElement e) => e.source.uri.toString()) 396 .map((CompilationUnitElement e) => e.source.uri.toString())
398 .toList(); 397 .toList();
399 dependencies.add(new PrelinkedDependencyBuilder( 398 dependencies.add(new LinkedDependencyBuilder(
400 uri: dependentLibrary.source.uri.toString(), parts: parts)); 399 uri: dependentLibrary.source.uri.toString(), parts: parts));
401 return index; 400 return index;
402 }); 401 });
403 } 402 }
404 403
405 /** 404 /**
406 * Serialize documentation from the given [element], creating an 405 * Serialize documentation from the given [element], creating an
407 * [UnlinkedDocumentationComment]. 406 * [UnlinkedDocumentationComment].
408 * 407 *
409 * If [element] has no documentation, `null` is returned. 408 * If [element] has no documentation, `null` is returned.
410 */ 409 */
411 UnlinkedDocumentationCommentBuilder serializeDocumentation(Element element) { 410 UnlinkedDocumentationCommentBuilder serializeDocumentation(Element element) {
412 if (element.documentationComment == null) { 411 if (element.documentationComment == null) {
413 return null; 412 return null;
414 } 413 }
415 return new UnlinkedDocumentationCommentBuilder( 414 return new UnlinkedDocumentationCommentBuilder(
416 text: element.documentationComment, 415 text: element.documentationComment,
417 offset: element.docRange.offset, 416 offset: element.docRange.offset,
418 length: element.docRange.length); 417 length: element.docRange.length);
419 } 418 }
420 419
421 /** 420 /**
422 * Return the index of the entry in the references table 421 * Return the index of the entry in the references table
423 * ([UnlinkedLibrary.references] and [PrelinkedLibrary.references]) 422 * ([UnlinkedLibrary.references] and [LinkedLibrary.references])
424 * representing the pseudo-type `dynamic`. 423 * representing the pseudo-type `dynamic`.
425 */ 424 */
426 int serializeDynamicReference() => 0; 425 int serializeDynamicReference() => 0;
427 426
428 /** 427 /**
429 * Serialize the given [enumElement], creating an [UnlinkedEnum]. 428 * Serialize the given [enumElement], creating an [UnlinkedEnum].
430 */ 429 */
431 UnlinkedEnumBuilder serializeEnum(ClassElement enumElement) { 430 UnlinkedEnumBuilder serializeEnum(ClassElement enumElement) {
432 UnlinkedEnumBuilder b = new UnlinkedEnumBuilder(); 431 UnlinkedEnumBuilder b = new UnlinkedEnumBuilder();
433 b.name = enumElement.name; 432 b.name = enumElement.name;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 ExportElement exportElement) { 503 ExportElement exportElement) {
505 addTransitiveExportClosure(exportElement.exportedLibrary); 504 addTransitiveExportClosure(exportElement.exportedLibrary);
506 UnlinkedExportPublicBuilder b = new UnlinkedExportPublicBuilder(); 505 UnlinkedExportPublicBuilder b = new UnlinkedExportPublicBuilder();
507 b.uri = exportElement.uri; 506 b.uri = exportElement.uri;
508 b.combinators = exportElement.combinators.map(serializeCombinator).toList(); 507 b.combinators = exportElement.combinators.map(serializeCombinator).toList();
509 return b; 508 return b;
510 } 509 }
511 510
512 /** 511 /**
513 * Serialize the given [importElement] yielding an [UnlinkedImportBuilder]. 512 * Serialize the given [importElement] yielding an [UnlinkedImportBuilder].
514 * Also, add pre-linked information about it to the [prelinkedImports] list. 513 * Also, add linked information about it to the [linkedImports] list.
515 */ 514 */
516 UnlinkedImportBuilder serializeImport(ImportElement importElement) { 515 UnlinkedImportBuilder serializeImport(ImportElement importElement) {
517 UnlinkedImportBuilder b = new UnlinkedImportBuilder(); 516 UnlinkedImportBuilder b = new UnlinkedImportBuilder();
518 b.isDeferred = importElement.isDeferred; 517 b.isDeferred = importElement.isDeferred;
519 b.offset = importElement.nameOffset; 518 b.offset = importElement.nameOffset;
520 b.combinators = importElement.combinators.map(serializeCombinator).toList(); 519 b.combinators = importElement.combinators.map(serializeCombinator).toList();
521 if (importElement.prefix != null) { 520 if (importElement.prefix != null) {
522 b.prefixReference = serializePrefix(importElement.prefix); 521 b.prefixReference = serializePrefix(importElement.prefix);
523 b.prefixOffset = importElement.prefix.nameOffset; 522 b.prefixOffset = importElement.prefix.nameOffset;
524 } 523 }
525 if (importElement.isSynthetic) { 524 if (importElement.isSynthetic) {
526 b.isImplicit = true; 525 b.isImplicit = true;
527 } else { 526 } else {
528 b.uri = importElement.uri; 527 b.uri = importElement.uri;
529 b.uriOffset = importElement.uriOffset; 528 b.uriOffset = importElement.uriOffset;
530 b.uriEnd = importElement.uriEnd; 529 b.uriEnd = importElement.uriEnd;
531 } 530 }
532 addTransitiveExportClosure(importElement.importedLibrary); 531 addTransitiveExportClosure(importElement.importedLibrary);
533 prelinkedImports.add(serializeDependency(importElement.importedLibrary)); 532 linkedImports.add(serializeDependency(importElement.importedLibrary));
534 return b; 533 return b;
535 } 534 }
536 535
537 /** 536 /**
538 * Serialize the whole library element into a [PrelinkedLibrary]. Should be 537 * Serialize the whole library element into a [LinkedLibrary]. Should be
539 * called exactly once for each instance of [_LibrarySerializer]. 538 * called exactly once for each instance of [_LibrarySerializer].
540 * 539 *
541 * The unlinked compilation units are stored in [unlinkedUnits], and their 540 * The unlinked compilation units are stored in [unlinkedUnits], and their
542 * absolute URIs are stored in [unitUris]. 541 * absolute URIs are stored in [unitUris].
543 */ 542 */
544 PrelinkedLibraryBuilder serializeLibrary() { 543 LinkedLibraryBuilder serializeLibrary() {
545 computePrefixMap(); 544 computePrefixMap();
546 PrelinkedLibraryBuilder pb = new PrelinkedLibraryBuilder(); 545 LinkedLibraryBuilder pb = new LinkedLibraryBuilder();
547 addCompilationUnitElements(libraryElement.definingCompilationUnit, 0); 546 addCompilationUnitElements(libraryElement.definingCompilationUnit, 0);
548 for (int i = 0; i < libraryElement.parts.length; i++) { 547 for (int i = 0; i < libraryElement.parts.length; i++) {
549 addCompilationUnitElements(libraryElement.parts[i], i + 1); 548 addCompilationUnitElements(libraryElement.parts[i], i + 1);
550 } 549 }
551 pb.units = prelinkedUnits; 550 pb.units = linkedUnits;
552 pb.dependencies = dependencies; 551 pb.dependencies = dependencies;
553 pb.importDependencies = prelinkedImports; 552 pb.importDependencies = linkedImports;
554 List<String> exportedNames = 553 List<String> exportedNames =
555 libraryElement.exportNamespace.definedNames.keys.toList(); 554 libraryElement.exportNamespace.definedNames.keys.toList();
556 exportedNames.sort(); 555 exportedNames.sort();
557 List<PrelinkedExportNameBuilder> exportNames = 556 List<LinkedExportNameBuilder> exportNames = <LinkedExportNameBuilder>[];
558 <PrelinkedExportNameBuilder>[];
559 for (String name in exportedNames) { 557 for (String name in exportedNames) {
560 if (libraryElement.publicNamespace.definedNames.containsKey(name)) { 558 if (libraryElement.publicNamespace.definedNames.containsKey(name)) {
561 continue; 559 continue;
562 } 560 }
563 Element element = libraryElement.exportNamespace.get(name); 561 Element element = libraryElement.exportNamespace.get(name);
564 LibraryElement dependentLibrary = element.library; 562 LibraryElement dependentLibrary = element.library;
565 CompilationUnitElement unitElement = 563 CompilationUnitElement unitElement =
566 element.getAncestor((Element e) => e is CompilationUnitElement); 564 element.getAncestor((Element e) => e is CompilationUnitElement);
567 int unit = dependentLibrary.units.indexOf(unitElement); 565 int unit = dependentLibrary.units.indexOf(unitElement);
568 assert(unit != -1); 566 assert(unit != -1);
569 PrelinkedReferenceKind kind; 567 ReferenceKind kind;
570 if (element is PropertyAccessorElement) { 568 if (element is PropertyAccessorElement) {
571 kind = PrelinkedReferenceKind.topLevelPropertyAccessor; 569 kind = ReferenceKind.topLevelPropertyAccessor;
572 } else if (element is FunctionTypeAliasElement) { 570 } else if (element is FunctionTypeAliasElement) {
573 kind = PrelinkedReferenceKind.typedef; 571 kind = ReferenceKind.typedef;
574 } else if (element is ClassElement) { 572 } else if (element is ClassElement) {
575 kind = PrelinkedReferenceKind.classOrEnum; 573 kind = ReferenceKind.classOrEnum;
576 } else if (element is FunctionElement) { 574 } else if (element is FunctionElement) {
577 kind = PrelinkedReferenceKind.topLevelFunction; 575 kind = ReferenceKind.topLevelFunction;
578 } else { 576 } else {
579 throw new Exception('Unexpected element kind: ${element.runtimeType}'); 577 throw new Exception('Unexpected element kind: ${element.runtimeType}');
580 } 578 }
581 exportNames.add(new PrelinkedExportNameBuilder( 579 exportNames.add(new LinkedExportNameBuilder(
582 name: name, 580 name: name,
583 dependency: serializeDependency(dependentLibrary), 581 dependency: serializeDependency(dependentLibrary),
584 unit: unit, 582 unit: unit,
585 kind: kind)); 583 kind: kind));
586 } 584 }
587 pb.exportNames = exportNames; 585 pb.exportNames = exportNames;
588 return pb; 586 return pb;
589 } 587 }
590 588
591 /** 589 /**
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 b.hasImplicitType = parameter.hasImplicitType; 621 b.hasImplicitType = parameter.hasImplicitType;
624 } 622 }
625 return b; 623 return b;
626 } 624 }
627 625
628 /** 626 /**
629 * Serialize the given [prefix] into an index into the references table. 627 * Serialize the given [prefix] into an index into the references table.
630 */ 628 */
631 int serializePrefix(PrefixElement element) { 629 int serializePrefix(PrefixElement element) {
632 return referenceMap.putIfAbsent(element, () { 630 return referenceMap.putIfAbsent(element, () {
633 assert(unlinkedReferences.length == prelinkedReferences.length); 631 assert(unlinkedReferences.length == linkedReferences.length);
634 int index = unlinkedReferences.length; 632 int index = unlinkedReferences.length;
635 unlinkedReferences.add(new UnlinkedReferenceBuilder(name: element.name)); 633 unlinkedReferences.add(new UnlinkedReferenceBuilder(name: element.name));
636 prelinkedReferences.add( 634 linkedReferences
637 new PrelinkedReferenceBuilder(kind: PrelinkedReferenceKind.prefix)); 635 .add(new LinkedReferenceBuilder(kind: ReferenceKind.prefix));
638 return index; 636 return index;
639 }); 637 });
640 } 638 }
641 639
642 /** 640 /**
643 * Serialize the given [typedefElement], creating an [UnlinkedTypedef]. 641 * Serialize the given [typedefElement], creating an [UnlinkedTypedef].
644 */ 642 */
645 UnlinkedTypedefBuilder serializeTypedef( 643 UnlinkedTypedefBuilder serializeTypedef(
646 FunctionTypeAliasElement typedefElement) { 644 FunctionTypeAliasElement typedefElement) {
647 UnlinkedTypedefBuilder b = new UnlinkedTypedefBuilder(); 645 UnlinkedTypedefBuilder b = new UnlinkedTypedefBuilder();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 LibraryElement dependentLibrary = element.library; 682 LibraryElement dependentLibrary = element.library;
685 if (dependentLibrary == null) { 683 if (dependentLibrary == null) {
686 assert(type.isDynamic); 684 assert(type.isDynamic);
687 if (type is UndefinedTypeImpl) { 685 if (type is UndefinedTypeImpl) {
688 b.reference = serializeUnresolvedReference(); 686 b.reference = serializeUnresolvedReference();
689 } else { 687 } else {
690 b.reference = serializeDynamicReference(); 688 b.reference = serializeDynamicReference();
691 } 689 }
692 } else { 690 } else {
693 b.reference = referenceMap.putIfAbsent(element, () { 691 b.reference = referenceMap.putIfAbsent(element, () {
694 assert(unlinkedReferences.length == prelinkedReferences.length); 692 assert(unlinkedReferences.length == linkedReferences.length);
695 CompilationUnitElement unitElement = 693 CompilationUnitElement unitElement =
696 element.getAncestor((Element e) => e is CompilationUnitElement); 694 element.getAncestor((Element e) => e is CompilationUnitElement);
697 int unit = dependentLibrary.units.indexOf(unitElement); 695 int unit = dependentLibrary.units.indexOf(unitElement);
698 assert(unit != -1); 696 assert(unit != -1);
699 int numTypeParameters = 0; 697 int numTypeParameters = 0;
700 if (element is TypeParameterizedElement) { 698 if (element is TypeParameterizedElement) {
701 numTypeParameters = element.typeParameters.length; 699 numTypeParameters = element.typeParameters.length;
702 } 700 }
703 // Figure out a prefix that may be used to refer to the given type. 701 // Figure out a prefix that may be used to refer to the given type.
704 // TODO(paulberry): to avoid subtle relinking inconsistencies we 702 // TODO(paulberry): to avoid subtle relinking inconsistencies we
705 // should use the actual prefix from the AST (a given type may be 703 // should use the actual prefix from the AST (a given type may be
706 // reachable via multiple prefixes), but sadly, this information is 704 // reachable via multiple prefixes), but sadly, this information is
707 // not recorded in the element model. 705 // not recorded in the element model.
708 int prefixReference = 0; 706 int prefixReference = 0;
709 PrefixElement prefix = prefixMap[element]; 707 PrefixElement prefix = prefixMap[element];
710 if (prefix != null) { 708 if (prefix != null) {
711 prefixReference = serializePrefix(prefix); 709 prefixReference = serializePrefix(prefix);
712 } 710 }
713 int index = unlinkedReferences.length; 711 int index = unlinkedReferences.length;
714 unlinkedReferences.add(new UnlinkedReferenceBuilder( 712 unlinkedReferences.add(new UnlinkedReferenceBuilder(
715 name: element.name, prefixReference: prefixReference)); 713 name: element.name, prefixReference: prefixReference));
716 prelinkedReferences.add(new PrelinkedReferenceBuilder( 714 linkedReferences.add(new LinkedReferenceBuilder(
717 dependency: serializeDependency(dependentLibrary), 715 dependency: serializeDependency(dependentLibrary),
718 kind: element is FunctionTypeAliasElement 716 kind: element is FunctionTypeAliasElement
719 ? PrelinkedReferenceKind.typedef 717 ? ReferenceKind.typedef
720 : PrelinkedReferenceKind.classOrEnum, 718 : ReferenceKind.classOrEnum,
721 unit: unit, 719 unit: unit,
722 numTypeParameters: numTypeParameters)); 720 numTypeParameters: numTypeParameters));
723 return index; 721 return index;
724 }); 722 });
725 } 723 }
726 List<DartType> typeArguments; 724 List<DartType> typeArguments;
727 if (type is InterfaceType) { 725 if (type is InterfaceType) {
728 typeArguments = type.typeArguments; 726 typeArguments = type.typeArguments;
729 } else if (type is FunctionType) { 727 } else if (type is FunctionType) {
730 typeArguments = type.typeArguments; 728 typeArguments = type.typeArguments;
731 } 729 }
732 if (typeArguments != null && 730 if (typeArguments != null &&
733 typeArguments.any((DartType argument) => !argument.isDynamic)) { 731 typeArguments.any((DartType argument) => !argument.isDynamic)) {
734 b.typeArguments = typeArguments 732 b.typeArguments = typeArguments
735 .map((DartType t) => serializeTypeRef(t, context)) 733 .map((DartType t) => serializeTypeRef(t, context))
736 .toList(); 734 .toList();
737 } 735 }
738 } 736 }
739 return b; 737 return b;
740 } 738 }
741 739
742 /** 740 /**
743 * Return the index of the entry in the references table 741 * Return the index of the entry in the references table
744 * ([UnlinkedLibrary.references] and [PrelinkedLibrary.references]) used for 742 * ([UnlinkedLibrary.references] and [LinkedLibrary.references]) used for
745 * unresolved references. A new entry is added to the table if necessary to 743 * unresolved references. A new entry is added to the table if necessary to
746 * satisfy the request. 744 * satisfy the request.
747 */ 745 */
748 int serializeUnresolvedReference() { 746 int serializeUnresolvedReference() {
749 // TODO(paulberry): in order for relinking to work, we need to record the 747 // TODO(paulberry): in order for relinking to work, we need to record the
750 // name and prefix of the unresolved symbol. This is not (yet) encoded in 748 // name and prefix of the unresolved symbol. This is not (yet) encoded in
751 // the element model. For the moment we use a name that can't possibly 749 // the element model. For the moment we use a name that can't possibly
752 // ever exist. 750 // ever exist.
753 if (unresolvedReferenceIndex == null) { 751 if (unresolvedReferenceIndex == null) {
754 assert(unlinkedReferences.length == prelinkedReferences.length); 752 assert(unlinkedReferences.length == linkedReferences.length);
755 unresolvedReferenceIndex = unlinkedReferences.length; 753 unresolvedReferenceIndex = unlinkedReferences.length;
756 unlinkedReferences 754 unlinkedReferences
757 .add(new UnlinkedReferenceBuilder(name: '*unresolved*')); 755 .add(new UnlinkedReferenceBuilder(name: '*unresolved*'));
758 prelinkedReferences.add(new PrelinkedReferenceBuilder( 756 linkedReferences
759 kind: PrelinkedReferenceKind.unresolved)); 757 .add(new LinkedReferenceBuilder(kind: ReferenceKind.unresolved));
760 } 758 }
761 return unresolvedReferenceIndex; 759 return unresolvedReferenceIndex;
762 } 760 }
763 761
764 /** 762 /**
765 * Serialize the given [variable], creating an [UnlinkedVariable]. 763 * Serialize the given [variable], creating an [UnlinkedVariable].
766 */ 764 */
767 UnlinkedVariableBuilder serializeVariable(PropertyInducingElement variable) { 765 UnlinkedVariableBuilder serializeVariable(PropertyInducingElement variable) {
768 UnlinkedVariableBuilder b = new UnlinkedVariableBuilder(); 766 UnlinkedVariableBuilder b = new UnlinkedVariableBuilder();
769 b.name = variable.name; 767 b.name = variable.name;
770 b.nameOffset = variable.nameOffset; 768 b.nameOffset = variable.nameOffset;
771 b.type = serializeTypeRef(variable.type, variable); 769 b.type = serializeTypeRef(variable.type, variable);
772 b.isStatic = variable.isStatic && variable.enclosingElement is ClassElement; 770 b.isStatic = variable.isStatic && variable.enclosingElement is ClassElement;
773 b.isFinal = variable.isFinal; 771 b.isFinal = variable.isFinal;
774 b.isConst = variable.isConst; 772 b.isConst = variable.isConst;
775 b.hasImplicitType = variable.hasImplicitType; 773 b.hasImplicitType = variable.hasImplicitType;
776 b.documentationComment = serializeDocumentation(variable); 774 b.documentationComment = serializeDocumentation(variable);
777 return b; 775 return b;
778 } 776 }
779 } 777 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/summary/resynthesize.dart ('k') | pkg/analyzer/lib/src/summary/summary_sdk.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698