Skip to content

Commit 211209b

Browse files
scheglovCommit Queue
authored and
Commit Queue
committed
Fine. Track combined signatures, to support top-merges.
Change-Id: Ia8aad87209f304f03a993db7883eb7c988c2fdf0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/424920 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent be90b4d commit 211209b

File tree

6 files changed

+732
-6
lines changed

6 files changed

+732
-6
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ class InheritanceManager3 {
8080
/// Cached instance interfaces for [InterfaceFragmentImpl].
8181
final Map<InterfaceFragmentImpl, Interface> _interfaces = {};
8282

83+
/// Tracks signatures from superinterfaces that were combined.
84+
/// It is used to track dependencies in manifests.
85+
final Map<InterfaceFragmentImpl, Map<Name, List<ExecutableElement2OrMember>>>
86+
_combinedSignatures = {};
87+
8388
/// The set of classes that are currently being processed, used to detect
8489
/// self-referencing cycles.
8590
final Set<InterfaceFragmentImpl> _processingClasses = {};
@@ -124,6 +129,9 @@ class InheritanceManager3 {
124129
return null;
125130
}
126131

132+
(_combinedSignatures[targetClass] ??= {})[name] =
133+
candidates.map((e) => e.asElement2).toList();
134+
127135
if (doTopMerge) {
128136
var typeSystem = targetClass.library.typeSystem;
129137
return _topMerge(typeSystem, targetClass, validOverrides);
@@ -786,6 +794,7 @@ class InheritanceManager3 {
786794
superImplemented: superImplemented,
787795
superImplemented2: superImplemented2,
788796
conflicts: conflicts.toFixedList(),
797+
combinedSignatures: _combinedSignatures.remove(fragment) ?? {},
789798
);
790799
}
791800

@@ -985,6 +994,7 @@ class InheritanceManager3 {
985994
superImplemented: const [],
986995
superImplemented2: const [],
987996
conflicts: conflicts.toFixedList(),
997+
combinedSignatures: _combinedSignatures.remove(fragment) ?? {},
988998
);
989999
}
9901000

@@ -1057,6 +1067,7 @@ class InheritanceManager3 {
10571067
superImplemented2: [superInterface2],
10581068
conflicts:
10591069
<Conflict>[...superConflicts, ...interfaceConflicts].toFixedList(),
1070+
combinedSignatures: _combinedSignatures.remove(fragment) ?? {},
10601071
);
10611072
}
10621073

@@ -1277,6 +1288,7 @@ class Interface {
12771288
superImplemented: const [{}],
12781289
superImplemented2: const [{}],
12791290
conflicts: const [],
1291+
combinedSignatures: const {},
12801292
);
12811293

12821294
/// The map of names to their signature in the interface.
@@ -1327,6 +1339,10 @@ class Interface {
13271339
/// members of the class.
13281340
final List<Conflict> conflicts;
13291341

1342+
/// Tracks signatures from superinterfaces that were combined.
1343+
/// It is used to track dependencies in manifests.
1344+
final Map<Name, List<ExecutableElement2OrMember>> combinedSignatures;
1345+
13301346
/// The map of names to the most specific signatures from the mixins,
13311347
/// superclasses, or interfaces.
13321348
Map<Name, ExecutableElementOrMember>? inheritedMap;
@@ -1344,6 +1360,7 @@ class Interface {
13441360
required this.superImplemented,
13451361
required this.superImplemented2,
13461362
required this.conflicts,
1363+
required this.combinedSignatures,
13471364
});
13481365

13491366
/// The map of declared names to their signatures.

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ class LibraryManifestBuilder {
137137
typeParameters,
138138
) {
139139
classItem.declaredMembers.clear();
140-
classItem.interface.clear();
141140
_addInterfaceElementExecutables(
142141
encodingContext: encodingContext,
143142
instanceElement: element,
@@ -374,7 +373,6 @@ class LibraryManifestBuilder {
374373
typeParameters,
375374
) {
376375
mixinItem.declaredMembers.clear();
377-
mixinItem.interface.clear();
378376
_addInterfaceElementExecutables(
379377
encodingContext: encodingContext,
380378
instanceElement: element,
@@ -575,6 +573,7 @@ class LibraryManifestBuilder {
575573

576574
// Must be created already.
577575
var item = declaredItems[element] as InterfaceItem;
576+
item.interface.beforeUpdating();
578577

579578
var interface = element.inheritanceManager.getInterface2(element);
580579
for (var entry in interface.map2.entries) {
@@ -591,9 +590,34 @@ class LibraryManifestBuilder {
591590
continue;
592591
}
593592

593+
var combinedCandidates = interface.combinedSignatures[entry.key];
594+
if (combinedCandidates != null) {
595+
var candidateElements =
596+
combinedCandidates
597+
.map((candidate) => candidate.baseElement)
598+
.toSet()
599+
.toList();
600+
if (candidateElements.length == 1) {
601+
executable = candidateElements[0];
602+
} else {
603+
var candidateIds =
604+
candidateElements.map((candidate) {
605+
return _getInterfaceElementMemberId(candidate);
606+
}).toList();
607+
var idList = ManifestItemIdList(candidateIds);
608+
var id = item.interface.combinedIdsTemp[idList];
609+
id ??= ManifestItemId.generate();
610+
item.interface.map[lookupName] = id;
611+
item.interface.combinedIds[idList] = id;
612+
continue;
613+
}
614+
}
615+
594616
var id = _getInterfaceElementMemberId(executable);
595617
item.interface.map[lookupName] = id;
596618
}
619+
620+
item.interface.afterUpdate();
597621
}
598622

599623
void _fillInterfaceElementsInterface() {

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:math';
66

77
import 'package:analyzer/src/summary2/data_reader.dart';
88
import 'package:analyzer/src/summary2/data_writer.dart';
9+
import 'package:collection/collection.dart';
910

1011
/// The globally unique identifier.
1112
///
@@ -51,11 +52,46 @@ class ManifestItemId {
5152
sink.writeUInt32(randomBits);
5253
}
5354

55+
static List<ManifestItemId> readList(SummaryDataReader reader) {
56+
return reader.readTypedList(() => ManifestItemId.read(reader));
57+
}
58+
5459
static ManifestItemId? readOptional(SummaryDataReader reader) {
5560
return reader.readOptionalObject(() => ManifestItemId.read(reader));
5661
}
5762
}
5863

64+
class ManifestItemIdList {
65+
final List<ManifestItemId> ids;
66+
67+
ManifestItemIdList(this.ids);
68+
69+
factory ManifestItemIdList.read(SummaryDataReader reader) {
70+
return ManifestItemIdList(ManifestItemId.readList(reader));
71+
}
72+
73+
@override
74+
int get hashCode {
75+
return const ListEquality<ManifestItemId>().hash(ids);
76+
}
77+
78+
@override
79+
bool operator ==(Object other) {
80+
if (identical(this, other)) return true;
81+
return other is ManifestItemIdList &&
82+
const ListEquality<ManifestItemId>().equals(other.ids, ids);
83+
}
84+
85+
@override
86+
String toString() {
87+
return '[${ids.join(', ')}]';
88+
}
89+
90+
void write(BufferedSink sink) {
91+
sink.writeList(ids, (id) => id.write(sink));
92+
}
93+
}
94+
5995
extension ManifestItemIdExtension on ManifestItemId? {
6096
void writeOptional(BufferedSink sink) {
6197
sink.writeOptionalObject(this, (id) {

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

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,22 +493,48 @@ class ManifestInterface {
493493
/// The map of names to their IDs in the interface.
494494
final Map<LookupName, ManifestItemId> map;
495495

496-
ManifestInterface({required this.map});
496+
/// Key: IDs of method declarations.
497+
/// Value: ID assigned last time.
498+
/// When the same signatures merge, the result is the same.
499+
Map<ManifestItemIdList, ManifestItemId> combinedIds = {};
500+
501+
/// We move [combinedIds] into here during building the manifest, so that
502+
/// we can fill [combinedIds] with new entries.
503+
Map<ManifestItemIdList, ManifestItemId> combinedIdsTemp = {};
504+
505+
ManifestInterface({required this.map, required this.combinedIds});
497506

498507
factory ManifestInterface.empty() {
499-
return ManifestInterface(map: {});
508+
return ManifestInterface(map: {}, combinedIds: {});
500509
}
501510

502511
factory ManifestInterface.read(SummaryDataReader reader) {
503-
return ManifestInterface(map: LookupNameIdMapExtension.read(reader));
512+
return ManifestInterface(
513+
map: LookupNameIdMapExtension.read(reader),
514+
combinedIds: reader.readMap(
515+
readKey: () => ManifestItemIdList.read(reader),
516+
readValue: () => ManifestItemId.read(reader),
517+
),
518+
);
504519
}
505520

506-
void clear() {
521+
void afterUpdate() {
522+
combinedIdsTemp = {};
523+
}
524+
525+
void beforeUpdating() {
507526
map.clear();
527+
combinedIdsTemp = combinedIds;
528+
combinedIds = {};
508529
}
509530

510531
void write(BufferedSink sink) {
511532
map.write(sink);
533+
sink.writeMap(
534+
combinedIds,
535+
writeKey: (key) => key.write(sink),
536+
writeValue: (id) => id.write(sink),
537+
);
512538
}
513539
}
514540

0 commit comments

Comments
 (0)