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

Side by Side Diff: pkg/analyzer/lib/src/summary/prelink.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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 import 'package:analyzer/src/summary/format.dart'; 5 import 'package:analyzer/src/summary/format.dart';
6 import 'package:analyzer/src/summary/name_filter.dart'; 6 import 'package:analyzer/src/summary/name_filter.dart';
7 7
8 /** 8 /**
9 * Create a [PrelinkedLibraryBuilder] corresponding to the given 9 * Create a [LinkedLibraryBuilder] corresponding to the given
10 * [definingUnit], which should be the defining compilation unit for a library. 10 * [definingUnit], which should be the defining compilation unit for a library.
11 * Compilation units referenced by the defining compilation unit via `part` 11 * Compilation units referenced by the defining compilation unit via `part`
12 * declarations will be retrieved using [getPart]. Public namespaces for 12 * declarations will be retrieved using [getPart]. Public namespaces for
13 * libraries referenced by the defining compilation unit via `import` 13 * libraries referenced by the defining compilation unit via `import`
14 * declarations (and files reachable from them via `part` and `export` 14 * declarations (and files reachable from them via `part` and `export`
15 * declarations) will be retrieved using [getImport]. 15 * declarations) will be retrieved using [getImport].
16 */ 16 */
17 PrelinkedLibraryBuilder prelink(UnlinkedUnit definingUnit, 17 LinkedLibraryBuilder prelink(UnlinkedUnit definingUnit, GetPartCallback getPart,
18 GetPartCallback getPart, GetImportCallback getImport) { 18 GetImportCallback getImport) {
19 return new _Prelinker(definingUnit, getPart, getImport).prelink(); 19 return new _Prelinker(definingUnit, getPart, getImport).prelink();
20 } 20 }
21 21
22 /** 22 /**
23 * Type of the callback used by the prelinker to obtain public namespace 23 * Type of the callback used by the prelinker to obtain public namespace
24 * information about libraries imported by the library to be prelinked (and 24 * information about libraries imported by the library to be prelinked (and
25 * the transitive closure of parts and exports reachable from those libraries). 25 * the transitive closure of parts and exports reachable from those libraries).
26 * [relativeUri] should be interpreted relative to the defining compilation 26 * [relativeUri] should be interpreted relative to the defining compilation
27 * unit of the library being prelinked. 27 * unit of the library being prelinked.
28 * 28 *
(...skipping 17 matching lines...) Expand all
46 */ 46 */
47 class _Meaning { 47 class _Meaning {
48 /** 48 /**
49 * Which unit in the dependent library contains the declared entity. 49 * Which unit in the dependent library contains the declared entity.
50 */ 50 */
51 final int unit; 51 final int unit;
52 52
53 /** 53 /**
54 * The kind of entity being referred to. 54 * The kind of entity being referred to.
55 */ 55 */
56 final PrelinkedReferenceKind kind; 56 final ReferenceKind kind;
57 57
58 /** 58 /**
59 * Which of the dependencies of the library being prelinked contains the 59 * Which of the dependencies of the library being prelinked contains the
60 * declared entity. 60 * declared entity.
61 */ 61 */
62 final int dependency; 62 final int dependency;
63 63
64 /** 64 /**
65 * If the entity being referred to is generic, the number of type parameters 65 * If the entity being referred to is generic, the number of type parameters
66 * it accepts. Otherwise zero. 66 * it accepts. Otherwise zero.
67 */ 67 */
68 final int numTypeParameters; 68 final int numTypeParameters;
69 69
70 _Meaning(this.unit, this.kind, this.dependency, this.numTypeParameters); 70 _Meaning(this.unit, this.kind, this.dependency, this.numTypeParameters);
71 71
72 /** 72 /**
73 * Encode this [_Meaning] as a [PrelinkedExportName], using the given [name]. 73 * Encode this [_Meaning] as a [LinkedExportName], using the given [name].
74 */ 74 */
75 PrelinkedExportName encodeExportName(String name) { 75 LinkedExportName encodeExportName(String name) {
76 return new PrelinkedExportNameBuilder( 76 return new LinkedExportNameBuilder(
77 name: name, dependency: dependency, unit: unit, kind: kind); 77 name: name, dependency: dependency, unit: unit, kind: kind);
78 } 78 }
79 79
80 /** 80 /**
81 * Encode this [_Meaning] as a [PrelinkedReference]. 81 * Encode this [_Meaning] as a [LinkedReference].
82 */ 82 */
83 PrelinkedReferenceBuilder encodeReference() { 83 LinkedReferenceBuilder encodeReference() {
84 return new PrelinkedReferenceBuilder( 84 return new LinkedReferenceBuilder(
85 unit: unit, 85 unit: unit,
86 kind: kind, 86 kind: kind,
87 dependency: dependency, 87 dependency: dependency,
88 numTypeParameters: numTypeParameters); 88 numTypeParameters: numTypeParameters);
89 } 89 }
90 } 90 }
91 91
92 /** 92 /**
93 * A [_Meaning] representing a prefix introduced by an import directive. 93 * A [_Meaning] representing a prefix introduced by an import directive.
94 */ 94 */
95 class _PrefixMeaning extends _Meaning { 95 class _PrefixMeaning extends _Meaning {
96 final Map<String, _Meaning> namespace = <String, _Meaning>{}; 96 final Map<String, _Meaning> namespace = <String, _Meaning>{};
97 97
98 _PrefixMeaning() : super(0, PrelinkedReferenceKind.prefix, 0, 0); 98 _PrefixMeaning() : super(0, ReferenceKind.prefix, 0, 0);
99 } 99 }
100 100
101 /** 101 /**
102 * Helper class containing temporary data structures needed to prelink a single 102 * Helper class containing temporary data structures needed to prelink a single
103 * library. 103 * library.
104 * 104 *
105 * Note: throughout this class, a `null` value for a relative URI represents 105 * Note: throughout this class, a `null` value for a relative URI represents
106 * the defining compilation unit of the library being prelinked. 106 * the defining compilation unit of the library being prelinked.
107 */ 107 */
108 class _Prelinker { 108 class _Prelinker {
109 final UnlinkedUnit definingUnit; 109 final UnlinkedUnit definingUnit;
110 final GetPartCallback getPart; 110 final GetPartCallback getPart;
111 final GetImportCallback getImport; 111 final GetImportCallback getImport;
112 112
113 /** 113 /**
114 * Cache of values returned by [getImport]. 114 * Cache of values returned by [getImport].
115 */ 115 */
116 final Map<String, UnlinkedPublicNamespace> importCache = 116 final Map<String, UnlinkedPublicNamespace> importCache =
117 <String, UnlinkedPublicNamespace>{}; 117 <String, UnlinkedPublicNamespace>{};
118 118
119 /** 119 /**
120 * Cache of values returned by [getPart]. 120 * Cache of values returned by [getPart].
121 */ 121 */
122 final Map<String, UnlinkedUnit> partCache = <String, UnlinkedUnit>{}; 122 final Map<String, UnlinkedUnit> partCache = <String, UnlinkedUnit>{};
123 123
124 /** 124 /**
125 * Names defined inside the library being prelinked. 125 * Names defined inside the library being prelinked.
126 */ 126 */
127 final Map<String, _Meaning> privateNamespace = <String, _Meaning>{ 127 final Map<String, _Meaning> privateNamespace = <String, _Meaning>{
128 '': new _Meaning(0, PrelinkedReferenceKind.classOrEnum, 0, 0) 128 '': new _Meaning(0, ReferenceKind.classOrEnum, 0, 0)
129 }; 129 };
130 130
131 /** 131 /**
132 * List of dependencies of the library being prelinked. This will be output 132 * List of dependencies of the library being prelinked. This will be output
133 * to [PrelinkedLibrary.dependencies]. 133 * to [LinkedLibrary.dependencies].
134 */ 134 */
135 final List<PrelinkedDependencyBuilder> dependencies = 135 final List<LinkedDependencyBuilder> dependencies = <LinkedDependencyBuilder>[
136 <PrelinkedDependencyBuilder>[new PrelinkedDependencyBuilder()]; 136 new LinkedDependencyBuilder()
137 ];
137 138
138 /** 139 /**
139 * Map from the relative URI of a dependent library to the index of the 140 * Map from the relative URI of a dependent library to the index of the
140 * corresponding entry in [dependencies]. 141 * corresponding entry in [dependencies].
141 */ 142 */
142 final Map<String, int> uriToDependency = <String, int>{null: 0}; 143 final Map<String, int> uriToDependency = <String, int>{null: 0};
143 144
144 /** 145 /**
145 * List of public namespaces corresponding to each entry in [dependencies]. 146 * List of public namespaces corresponding to each entry in [dependencies].
146 */ 147 */
(...skipping 11 matching lines...) Expand all
158 * information from all of its parts. 159 * information from all of its parts.
159 */ 160 */
160 Map<String, _Meaning> aggregatePublicNamespace(String relativeUri) { 161 Map<String, _Meaning> aggregatePublicNamespace(String relativeUri) {
161 if (uriToDependency.containsKey(relativeUri)) { 162 if (uriToDependency.containsKey(relativeUri)) {
162 return dependencyToPublicNamespace[uriToDependency[relativeUri]]; 163 return dependencyToPublicNamespace[uriToDependency[relativeUri]];
163 } 164 }
164 assert(dependencies.length == dependencyToPublicNamespace.length); 165 assert(dependencies.length == dependencyToPublicNamespace.length);
165 int dependency = dependencies.length; 166 int dependency = dependencies.length;
166 uriToDependency[relativeUri] = dependency; 167 uriToDependency[relativeUri] = dependency;
167 List<String> unitUris = getUnitUris(relativeUri); 168 List<String> unitUris = getUnitUris(relativeUri);
168 PrelinkedDependencyBuilder prelinkedDependency = 169 LinkedDependencyBuilder linkedDependency = new LinkedDependencyBuilder(
169 new PrelinkedDependencyBuilder( 170 uri: relativeUri, parts: unitUris.sublist(1));
170 uri: relativeUri, parts: unitUris.sublist(1)); 171 dependencies.add(linkedDependency);
171 dependencies.add(prelinkedDependency);
172 172
173 Map<String, _Meaning> aggregated = <String, _Meaning>{}; 173 Map<String, _Meaning> aggregated = <String, _Meaning>{};
174 174
175 for (int unitNum = 0; unitNum < unitUris.length; unitNum++) { 175 for (int unitNum = 0; unitNum < unitUris.length; unitNum++) {
176 String unitUri = unitUris[unitNum]; 176 String unitUri = unitUris[unitNum];
177 UnlinkedPublicNamespace importedNamespace = getImportCached(unitUri); 177 UnlinkedPublicNamespace importedNamespace = getImportCached(unitUri);
178 if (importedNamespace == null) { 178 if (importedNamespace == null) {
179 continue; 179 continue;
180 } 180 }
181 for (UnlinkedPublicName name in importedNamespace.names) { 181 for (UnlinkedPublicName name in importedNamespace.names) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 231
232 /** 232 /**
233 * Extract all the names defined in [unit] (which is the [unitNum]th unit in 233 * Extract all the names defined in [unit] (which is the [unitNum]th unit in
234 * the library being prelinked) and store them in [privateNamespace]. 234 * the library being prelinked) and store them in [privateNamespace].
235 * Excludes names introduced by `import` statements. 235 * Excludes names introduced by `import` statements.
236 */ 236 */
237 void extractPrivateNames(UnlinkedUnit unit, int unitNum) { 237 void extractPrivateNames(UnlinkedUnit unit, int unitNum) {
238 for (UnlinkedClass cls in unit.classes) { 238 for (UnlinkedClass cls in unit.classes) {
239 privateNamespace.putIfAbsent( 239 privateNamespace.putIfAbsent(
240 cls.name, 240 cls.name,
241 () => new _Meaning(unitNum, PrelinkedReferenceKind.classOrEnum, 0, 241 () => new _Meaning(unitNum, ReferenceKind.classOrEnum, 0,
242 cls.typeParameters.length)); 242 cls.typeParameters.length));
243 } 243 }
244 for (UnlinkedEnum enm in unit.enums) { 244 for (UnlinkedEnum enm in unit.enums) {
245 privateNamespace.putIfAbsent( 245 privateNamespace.putIfAbsent(enm.name,
246 enm.name, 246 () => new _Meaning(unitNum, ReferenceKind.classOrEnum, 0, 0));
247 () =>
248 new _Meaning(unitNum, PrelinkedReferenceKind.classOrEnum, 0, 0));
249 } 247 }
250 for (UnlinkedExecutable executable in unit.executables) { 248 for (UnlinkedExecutable executable in unit.executables) {
251 privateNamespace.putIfAbsent( 249 privateNamespace.putIfAbsent(
252 executable.name, 250 executable.name,
253 () => new _Meaning( 251 () => new _Meaning(
254 unitNum, 252 unitNum,
255 executable.kind == UnlinkedExecutableKind.functionOrMethod 253 executable.kind == UnlinkedExecutableKind.functionOrMethod
256 ? PrelinkedReferenceKind.topLevelFunction 254 ? ReferenceKind.topLevelFunction
257 : PrelinkedReferenceKind.topLevelPropertyAccessor, 255 : ReferenceKind.topLevelPropertyAccessor,
258 0, 256 0,
259 executable.typeParameters.length)); 257 executable.typeParameters.length));
260 } 258 }
261 for (UnlinkedTypedef typedef in unit.typedefs) { 259 for (UnlinkedTypedef typedef in unit.typedefs) {
262 privateNamespace.putIfAbsent( 260 privateNamespace.putIfAbsent(
263 typedef.name, 261 typedef.name,
264 () => new _Meaning(unitNum, PrelinkedReferenceKind.typedef, 0, 262 () => new _Meaning(unitNum, ReferenceKind.typedef, 0,
265 typedef.typeParameters.length)); 263 typedef.typeParameters.length));
266 } 264 }
267 for (UnlinkedVariable variable in unit.variables) { 265 for (UnlinkedVariable variable in unit.variables) {
268 privateNamespace.putIfAbsent( 266 privateNamespace.putIfAbsent(
269 variable.name, 267 variable.name,
270 () => new _Meaning( 268 () => new _Meaning(
271 unitNum, PrelinkedReferenceKind.topLevelPropertyAccessor, 0, 0)); 269 unitNum, ReferenceKind.topLevelPropertyAccessor, 0, 0));
272 if (!(variable.isConst || variable.isFinal)) { 270 if (!(variable.isConst || variable.isFinal)) {
273 privateNamespace.putIfAbsent( 271 privateNamespace.putIfAbsent(
274 variable.name + '=', 272 variable.name + '=',
275 () => new _Meaning(unitNum, 273 () => new _Meaning(
276 PrelinkedReferenceKind.topLevelPropertyAccessor, 0, 0)); 274 unitNum, ReferenceKind.topLevelPropertyAccessor, 0, 0));
277 } 275 }
278 } 276 }
279 } 277 }
280 278
281 /** 279 /**
282 * Filter the export namespace for the library whose URI is reachable from 280 * Filter the export namespace for the library whose URI is reachable from
283 * [definingUnit] via [relativeUri], retaining only those names accepted by 281 * [definingUnit] via [relativeUri], retaining only those names accepted by
284 * [combinators], and store the resulting names in [result]. Names that 282 * [combinators], and store the resulting names in [result]. Names that
285 * already exist in [result] are not overwritten. 283 * already exist in [result] are not overwritten.
286 */ 284 */
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 targetNamespace = prefixMeaning.namespace; 344 targetNamespace = prefixMeaning.namespace;
347 } 345 }
348 } else { 346 } else {
349 targetNamespace = privateNamespace; 347 targetNamespace = privateNamespace;
350 } 348 }
351 filterExportNamespace(uri, import.combinators, targetNamespace); 349 filterExportNamespace(uri, import.combinators, targetNamespace);
352 return uriToDependency[uri]; 350 return uriToDependency[uri];
353 } 351 }
354 352
355 /** 353 /**
356 * Produce a [PrelinkedUnit] for the given [unit], by resolving every one of 354 * Produce a [LinkedUnit] for the given [unit], by resolving every one of
357 * its references. 355 * its references.
358 */ 356 */
359 PrelinkedUnitBuilder linkUnit(UnlinkedUnit unit) { 357 LinkedUnitBuilder linkUnit(UnlinkedUnit unit) {
360 if (unit == null) { 358 if (unit == null) {
361 return new PrelinkedUnitBuilder(); 359 return new LinkedUnitBuilder();
362 } 360 }
363 Map<int, Map<String, _Meaning>> prefixNamespaces = 361 Map<int, Map<String, _Meaning>> prefixNamespaces =
364 <int, Map<String, _Meaning>>{}; 362 <int, Map<String, _Meaning>>{};
365 List<PrelinkedReferenceBuilder> references = <PrelinkedReferenceBuilder>[]; 363 List<LinkedReferenceBuilder> references = <LinkedReferenceBuilder>[];
366 for (int i = 0; i < unit.references.length; i++) { 364 for (int i = 0; i < unit.references.length; i++) {
367 UnlinkedReference reference = unit.references[i]; 365 UnlinkedReference reference = unit.references[i];
368 Map<String, _Meaning> namespace; 366 Map<String, _Meaning> namespace;
369 if (reference.prefixReference != 0) { 367 if (reference.prefixReference != 0) {
370 // Prefix references must always point backward. 368 // Prefix references must always point backward.
371 assert(reference.prefixReference < i); 369 assert(reference.prefixReference < i);
372 namespace = prefixNamespaces[reference.prefixReference]; 370 namespace = prefixNamespaces[reference.prefixReference];
373 // Prefix references must always point to proper prefixes. 371 // Prefix references must always point to proper prefixes.
374 assert(namespace != null); 372 assert(namespace != null);
375 } else { 373 } else {
376 namespace = privateNamespace; 374 namespace = privateNamespace;
377 } 375 }
378 _Meaning meaning = namespace[reference.name]; 376 _Meaning meaning = namespace[reference.name];
379 if (meaning != null) { 377 if (meaning != null) {
380 if (meaning is _PrefixMeaning) { 378 if (meaning is _PrefixMeaning) {
381 prefixNamespaces[i] = meaning.namespace; 379 prefixNamespaces[i] = meaning.namespace;
382 } 380 }
383 references.add(meaning.encodeReference()); 381 references.add(meaning.encodeReference());
384 } else { 382 } else {
385 references.add(new PrelinkedReferenceBuilder( 383 references
386 kind: PrelinkedReferenceKind.unresolved)); 384 .add(new LinkedReferenceBuilder(kind: ReferenceKind.unresolved));
387 } 385 }
388 } 386 }
389 return new PrelinkedUnitBuilder(references: references); 387 return new LinkedUnitBuilder(references: references);
390 } 388 }
391 389
392 /** 390 /**
393 * Form the [PrelinkedLibrary] for the [definingUnit] that was passed to the 391 * Form the [LinkedLibrary] for the [definingUnit] that was passed to the
394 * constructor. 392 * constructor.
395 */ 393 */
396 PrelinkedLibraryBuilder prelink() { 394 LinkedLibraryBuilder prelink() {
397 // Gather up the unlinked summaries for all the compilation units in the 395 // Gather up the unlinked summaries for all the compilation units in the
398 // library. 396 // library.
399 List<UnlinkedUnit> units = getUnitUris(null).map(getPartCached).toList(); 397 List<UnlinkedUnit> units = getUnitUris(null).map(getPartCached).toList();
400 398
401 // Create the private namespace for the library by gathering all the names 399 // Create the private namespace for the library by gathering all the names
402 // defined in its compilation units. 400 // defined in its compilation units.
403 for (int unitNum = 0; unitNum < units.length; unitNum++) { 401 for (int unitNum = 0; unitNum < units.length; unitNum++) {
404 UnlinkedUnit unit = units[unitNum]; 402 UnlinkedUnit unit = units[unitNum];
405 if (unit != null) { 403 if (unit != null) {
406 extractPrivateNames(unit, unitNum); 404 extractPrivateNames(unit, unitNum);
407 } 405 }
408 } 406 }
409 407
410 // Fill in exported names. This must be done before filling in prefixes 408 // Fill in exported names. This must be done before filling in prefixes
411 // defined in import declarations, because prefixes shouldn't shadow 409 // defined in import declarations, because prefixes shouldn't shadow
412 // exports. 410 // exports.
413 List<PrelinkedExportNameBuilder> exportNames = 411 List<LinkedExportNameBuilder> exportNames = <LinkedExportNameBuilder>[];
414 <PrelinkedExportNameBuilder>[];
415 computeExportNamespace(null).forEach((String name, _Meaning meaning) { 412 computeExportNamespace(null).forEach((String name, _Meaning meaning) {
416 if (!privateNamespace.containsKey(name)) { 413 if (!privateNamespace.containsKey(name)) {
417 exportNames.add(meaning.encodeExportName(name)); 414 exportNames.add(meaning.encodeExportName(name));
418 } 415 }
419 }); 416 });
420 417
421 // Fill in prefixes defined in import declarations. 418 // Fill in prefixes defined in import declarations.
422 for (UnlinkedImport import in units[0].imports) { 419 for (UnlinkedImport import in units[0].imports) {
423 if (import.prefixReference != 0) { 420 if (import.prefixReference != 0) {
424 privateNamespace.putIfAbsent( 421 privateNamespace.putIfAbsent(
425 units[0].references[import.prefixReference].name, 422 units[0].references[import.prefixReference].name,
426 () => new _PrefixMeaning()); 423 () => new _PrefixMeaning());
427 } 424 }
428 } 425 }
429 426
430 // Fill in imported names. 427 // Fill in imported names.
431 List<int> importDependencies = 428 List<int> importDependencies =
432 definingUnit.imports.map(handleImport).toList(); 429 definingUnit.imports.map(handleImport).toList();
433 430
434 // Link each compilation unit. 431 // Link each compilation unit.
435 List<PrelinkedUnitBuilder> linkedUnits = units.map(linkUnit).toList(); 432 List<LinkedUnitBuilder> linkedUnits = units.map(linkUnit).toList();
436 433
437 return new PrelinkedLibraryBuilder( 434 return new LinkedLibraryBuilder(
438 units: linkedUnits, 435 units: linkedUnits,
439 dependencies: dependencies, 436 dependencies: dependencies,
440 importDependencies: importDependencies, 437 importDependencies: importDependencies,
441 exportNames: exportNames); 438 exportNames: exportNames);
442 } 439 }
443 440
444 /** 441 /**
445 * Resolve [relativeUri] relative to [sourceUri]. Works correctly if 442 * Resolve [relativeUri] relative to [sourceUri]. Works correctly if
446 * [sourceUri] is also relative. 443 * [sourceUri] is also relative.
447 */ 444 */
448 String resolveUri(String sourceUri, String relativeUri) { 445 String resolveUri(String sourceUri, String relativeUri) {
449 if (sourceUri == null) { 446 if (sourceUri == null) {
450 return relativeUri; 447 return relativeUri;
451 } else { 448 } else {
452 return Uri.parse(sourceUri).resolve(relativeUri).toString(); 449 return Uri.parse(sourceUri).resolve(relativeUri).toString();
453 } 450 }
454 } 451 }
455 } 452 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/summary/format.dart ('k') | pkg/analyzer/lib/src/summary/public_namespace_computer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698