Skip to content

Commit 0e08c8e

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Tracking for 'LibraryElementImpl.exportedReferences' and 'isFromDeprecatedExport'.
Change-Id: I66c304832c2eb1a05402b2eb2630b7dca1a790c9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449382 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 6f4a9bd commit 0e08c8e

File tree

9 files changed

+1916
-25
lines changed

9 files changed

+1916
-25
lines changed

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ testFineAfterLibraryAnalyzerHook;
106106
// TODO(scheglov): Clean up the list of implicitly analyzed files.
107107
class AnalysisDriver {
108108
/// The version of data format, should be incremented on every format change.
109-
static const int DATA_VERSION = 553;
109+
static const int DATA_VERSION = 554;
110110

111111
/// The number of exception contexts allowed to write. Once this field is
112112
/// zero, we stop writing any new exception contexts in this process.

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5905,6 +5905,7 @@ class LibraryElementImpl extends ElementImpl
59055905
@override
59065906
late TypeSystemImpl typeSystem;
59075907

5908+
@trackedInternal
59085909
late List<ExportedReference> exportedReferences;
59095910

59105911
/// The union of names for all searchable elements in this library.
@@ -6603,6 +6604,7 @@ class LibraryElementImpl extends ElementImpl
66036604
}
66046605

66056606
/// Return `true` if [reference] comes only from deprecated exports.
6607+
@trackedInternal
66066608
bool isFromDeprecatedExport(ExportedReference reference) {
66076609
if (reference is ExportedReferenceExported) {
66086610
for (var location in reference.locations) {

pkg/analyzer/lib/src/fine/library_manifest.dart

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:analyzer/src/fine/lookup_name.dart';
1313
import 'package:analyzer/src/fine/manifest_context.dart';
1414
import 'package:analyzer/src/fine/manifest_id.dart';
1515
import 'package:analyzer/src/fine/manifest_item.dart';
16+
import 'package:analyzer/src/summary2/export.dart';
1617
import 'package:analyzer/src/summary2/linked_element_factory.dart';
1718
import 'package:analyzer/src/util/performance/operation_performance.dart';
1819
import 'package:analyzer/src/utilities/extensions/collection.dart';
@@ -24,6 +25,9 @@ class LibraryManifest {
2425
/// This does not include names that are declared in this library.
2526
final Map<LookupName, ManifestItemId> reExportMap;
2627

28+
/// The names that re-exported exclusively via deprecated exports.
29+
final Set<LookupName> reExportDeprecatedOnly;
30+
2731
final Map<LookupName, ClassItem> declaredClasses;
2832
final Map<LookupName, EnumItem> declaredEnums;
2933
final Map<LookupName, ExtensionItem> declaredExtensions;
@@ -40,6 +44,7 @@ class LibraryManifest {
4044

4145
LibraryManifest({
4246
required this.reExportMap,
47+
required this.reExportDeprecatedOnly,
4348
required this.declaredClasses,
4449
required this.declaredEnums,
4550
required this.declaredExtensions,
@@ -56,6 +61,7 @@ class LibraryManifest {
5661
factory LibraryManifest.read(SummaryDataReader reader) {
5762
return LibraryManifest(
5863
reExportMap: reader.readLookupNameToIdMap(),
64+
reExportDeprecatedOnly: reader.readLookupNameSet(),
5965
declaredClasses: reader.readLookupNameMap(
6066
readValue: () => ClassItem.read(reader),
6167
),
@@ -132,6 +138,7 @@ class LibraryManifest {
132138

133139
void write(BufferedSink sink) {
134140
reExportMap.write(sink);
141+
reExportDeprecatedOnly.write(sink);
135142
declaredClasses.write(sink);
136143
declaredEnums.write(sink);
137144
declaredExtensions.write(sink);
@@ -600,18 +607,22 @@ class LibraryManifestBuilder {
600607
var libraryUri = libraryElement.uri;
601608
var manifest = newManifests[libraryUri]!;
602609

603-
for (var entry in libraryElement.exportNamespace.definedNames2.entries) {
604-
var name = entry.key.asLookupName;
605-
var element = entry.value;
606-
607-
// Skip elements that exist in nowhere.
608-
var elementLibrary = element.library as LibraryElementImpl?;
609-
if (elementLibrary == null) {
610+
for (var exported in libraryElement.exportedReferences) {
611+
// We want only re-exports, skip declared.
612+
if (exported is! ExportedReferenceExported) {
610613
continue;
611614
}
612615

613-
// Skip if the element is declared in this library.
614-
if (identical(elementLibrary, libraryElement)) {
616+
var reference = exported.reference;
617+
var lookupName = reference.isSetter
618+
? '${reference.name}='.asLookupName
619+
: reference.name.asLookupName;
620+
621+
var element = elementFactory.elementOfReference3(reference);
622+
623+
// Skip elements that exist in nowhere.
624+
var elementLibrary = element.library;
625+
if (elementLibrary == null) {
615626
continue;
616627
}
617628

@@ -621,8 +632,12 @@ class LibraryManifestBuilder {
621632

622633
// We use the manifest of the library that declares this element.
623634
// So, the element must be declared in the manifest.
624-
var id = elementLibraryManifest.getDeclaredId(name)!;
625-
manifest.reExportMap[name] = id;
635+
var id = elementLibraryManifest.getDeclaredId(lookupName)!;
636+
manifest.reExportMap[lookupName] = id;
637+
638+
if (libraryElement.isFromDeprecatedExport(exported)) {
639+
manifest.reExportDeprecatedOnly.add(lookupName);
640+
}
626641
}
627642
}
628643
}
@@ -831,6 +846,7 @@ class LibraryManifestBuilder {
831846

832847
var newManifest = LibraryManifest(
833848
reExportMap: {},
849+
reExportDeprecatedOnly: <LookupName>{},
834850
declaredClasses: newClassItems,
835851
declaredEnums: newEnumItems,
836852
declaredExtensions: newExtensionItems,
@@ -1047,6 +1063,7 @@ class LibraryManifestBuilder {
10471063
return inputManifests[uri] ??
10481064
LibraryManifest(
10491065
reExportMap: {},
1066+
reExportDeprecatedOnly: <LookupName>{},
10501067
declaredClasses: {},
10511068
declaredEnums: {},
10521069
declaredExtensions: {},

pkg/analyzer/lib/src/fine/requirement_failure.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,26 @@ final class OpaqueApiUseFailure extends RequirementFailure {
317317
}
318318
}
319319

320+
class ReExportDeprecatedOnlyMismatch extends RequirementFailure {
321+
final Uri libraryUri;
322+
final LookupName name;
323+
final bool expected;
324+
final bool actual;
325+
326+
ReExportDeprecatedOnlyMismatch({
327+
required this.libraryUri,
328+
required this.name,
329+
required this.expected,
330+
required this.actual,
331+
});
332+
333+
@override
334+
String toString() {
335+
return 'ReExportDeprecatedOnlyMismatch(libraryUri: $libraryUri, '
336+
'name: ${name.asString}, expected: $expected, actual: $actual)';
337+
}
338+
}
339+
320340
sealed class RequirementFailure {}
321341

322342
class SuperImplementedMethodIdMismatch extends RequirementFailure {

pkg/analyzer/lib/src/fine/requirements.dart

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,9 @@ class LibraryRequirements {
374374
/// TopName => ID
375375
final Map<LookupName, ManifestItemId?> exportedTopLevels;
376376

377+
/// Names that must be in [LibraryManifest.reExportDeprecatedOnly].
378+
final Map<LookupName, bool> reExportDeprecatedOnly;
379+
377380
/// TopName => InstanceItemRequirements
378381
final Map<LookupName, InstanceItemRequirements> instances;
379382

@@ -420,6 +423,7 @@ class LibraryRequirements {
420423
required this.requestedDeclaredVariables,
421424
required this.requestedDeclaredGetters,
422425
required this.requestedDeclaredSetters,
426+
required this.reExportDeprecatedOnly,
423427
required this.allDeclaredClasses,
424428
required this.allDeclaredEnums,
425429
required this.allDeclaredExtensions,
@@ -448,6 +452,7 @@ class LibraryRequirements {
448452
requestedDeclaredVariables: {},
449453
requestedDeclaredGetters: {},
450454
requestedDeclaredSetters: {},
455+
reExportDeprecatedOnly: {},
451456
allDeclaredClasses: null,
452457
allDeclaredEnums: null,
453458
allDeclaredExtensions: null,
@@ -483,6 +488,10 @@ class LibraryRequirements {
483488
requestedDeclaredVariables: reader.readNameToOptionalIdMap(),
484489
requestedDeclaredGetters: reader.readNameToOptionalIdMap(),
485490
requestedDeclaredSetters: reader.readNameToOptionalIdMap(),
491+
reExportDeprecatedOnly: reader.readMap(
492+
readKey: () => LookupName.read(reader),
493+
readValue: () => reader.readBool(),
494+
),
486495
allDeclaredClasses: ManifestItemIdList.readOptional(reader),
487496
allDeclaredEnums: ManifestItemIdList.readOptional(reader),
488497
allDeclaredExtensions: ManifestItemIdList.readOptional(reader),
@@ -524,6 +533,12 @@ class LibraryRequirements {
524533
sink.writeNameToIdMap(requestedDeclaredGetters);
525534
sink.writeNameToIdMap(requestedDeclaredSetters);
526535

536+
sink.writeMap(
537+
reExportDeprecatedOnly,
538+
writeKey: (name) => name.write(sink),
539+
writeValue: (value) => sink.writeBool(value),
540+
);
541+
527542
allDeclaredClasses.writeOptional(sink);
528543
allDeclaredEnums.writeOptional(sink);
529544
allDeclaredExtensions.writeOptional(sink);
@@ -686,6 +701,20 @@ class RequirementsManifest {
686701
}
687702
}
688703

704+
for (var entry in libraryRequirements.reExportDeprecatedOnly.entries) {
705+
var name = entry.key;
706+
var expected = entry.value;
707+
var actual = libraryManifest.reExportDeprecatedOnly.contains(name);
708+
if (expected != actual) {
709+
return ReExportDeprecatedOnlyMismatch(
710+
libraryUri: libraryUri,
711+
name: name,
712+
expected: expected,
713+
actual: actual,
714+
);
715+
}
716+
}
717+
689718
for (var entry in libraryRequirements.requestedDeclaredClasses.entries) {
690719
var name = entry.key;
691720
var expectedId = entry.value;
@@ -1284,12 +1313,27 @@ class RequirementsManifest {
12841313
required List<LibraryElementImpl> importedLibraries,
12851314
required String id,
12861315
}) {
1287-
var lookupName = id.asLookupName;
1316+
assert(!id.endsWith('='));
1317+
var getterLookupName = id.asLookupName;
1318+
var setterLookupName = '$id='.asLookupName;
1319+
12881320
for (var importedLibrary in importedLibraries) {
12891321
if (importedLibrary.manifest case var manifest?) {
12901322
var libraryRequirements = _getLibraryRequirements(importedLibrary);
1291-
var nameToId = libraryRequirements.exportedTopLevels;
1292-
nameToId[lookupName] = manifest.getExportedId(lookupName);
1323+
1324+
var getterId = manifest.getExportedId(getterLookupName);
1325+
libraryRequirements.exportedTopLevels[getterLookupName] = getterId;
1326+
if (getterId != null) {
1327+
libraryRequirements.reExportDeprecatedOnly[getterLookupName] =
1328+
manifest.reExportDeprecatedOnly.contains(getterLookupName);
1329+
}
1330+
1331+
var setterId = manifest.getExportedId(setterLookupName);
1332+
libraryRequirements.exportedTopLevels[setterLookupName] = setterId;
1333+
if (setterId != null) {
1334+
libraryRequirements.reExportDeprecatedOnly[setterLookupName] =
1335+
manifest.reExportDeprecatedOnly.contains(setterLookupName);
1336+
}
12931337
}
12941338
}
12951339
}

pkg/analyzer/lib/src/summary2/bundle_writer.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -303,15 +303,14 @@ class BundleWriter {
303303
void _writeExportedReferences(List<ExportedReference> elements) {
304304
_sink.writeList(elements, (exported) {
305305
var index = _references._indexOfReference(exported.reference);
306-
if (exported is ExportedReferenceDeclared) {
307-
_sink.writeByte(0);
308-
_sink.writeUint30(index);
309-
} else if (exported is ExportedReferenceExported) {
310-
_sink.writeByte(1);
311-
_sink.writeUint30(index);
312-
_sink.writeList(exported.locations, _writeExportLocation);
313-
} else {
314-
throw UnimplementedError('(${exported.runtimeType}) $exported');
306+
switch (exported) {
307+
case ExportedReferenceDeclared():
308+
_sink.writeByte(0);
309+
_sink.writeUint30(index);
310+
case ExportedReferenceExported():
311+
_sink.writeByte(1);
312+
_sink.writeUint30(index);
313+
_sink.writeList(exported.locations, _writeExportLocation);
315314
}
316315
});
317316
}

pkg/analyzer/lib/src/summary2/export.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class Export {
2727
}
2828
}
2929

30-
class ExportedReference {
30+
sealed class ExportedReference {
3131
final Reference reference;
3232

3333
ExportedReference({required this.reference});

0 commit comments

Comments
 (0)