Skip to content

Commit c7510c4

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Put 'implemented' and 'superImplemented' into library manifest and requirements.
Change-Id: I3248f6f69192c08bb6deec07b4e8736414805cb4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448230 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 0a1e03d commit c7510c4

File tree

8 files changed

+6197
-598
lines changed

8 files changed

+6197
-598
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 = 541;
109+
static const int DATA_VERSION = 542;
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/inheritance_manager3.dart

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -207,30 +207,55 @@ class InheritanceManager3 {
207207
element as InterfaceElementImpl; // TODO(scheglov): remove cast
208208

209209
var interface = _getInterface(element);
210+
211+
InternalExecutableElement? result;
210212
if (forSuper) {
211213
if (element is ExtensionTypeElementImpl) {
212-
return null;
213-
}
214-
var superImplemented = interface.superImplemented;
215-
if (forMixinIndex >= 0) {
216-
return superImplemented[forMixinIndex][name];
217-
}
218-
if (superImplemented.isNotEmpty) {
219-
return superImplemented.last[name];
214+
result = null;
220215
} else {
221-
assert(element.name == 'Object');
222-
return null;
216+
var superImplemented = interface.superImplemented;
217+
if (forMixinIndex >= 0) {
218+
result = superImplemented[forMixinIndex][name];
219+
} else if (superImplemented.isNotEmpty) {
220+
result = superImplemented.last[name];
221+
} else {
222+
assert(element.name == 'Object');
223+
result = null;
224+
}
223225
}
226+
} else if (concrete) {
227+
result = interface.implemented[name];
228+
} else {
229+
result = interface.map[name];
224230
}
225-
if (concrete) {
226-
return interface.implemented[name];
227-
}
228231

229-
var result = interface.map[name];
232+
// if (forSuper) {
233+
// if (element is ExtensionTypeElementImpl) {
234+
// return null;
235+
// }
236+
// var superImplemented = interface.superImplemented;
237+
// if (forMixinIndex >= 0) {
238+
// return superImplemented[forMixinIndex][name];
239+
// }
240+
// if (superImplemented.isNotEmpty) {
241+
// return superImplemented.last[name];
242+
// } else {
243+
// assert(element.name == 'Object');
244+
// return null;
245+
// }
246+
// }
247+
// if (concrete) {
248+
// return interface.implemented[name];
249+
// }
250+
// var result = interface.map[name];
251+
230252
globalResultRequirements?.record_interface_getMember(
231253
element: element,
232254
nameObj: name,
233255
methodElement: result,
256+
concrete: concrete,
257+
forSuper: forSuper,
258+
forMixinIndex: forMixinIndex,
234259
);
235260
return result;
236261
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,7 @@ class LibraryManifestBuilder {
876876
item.interface.beforeUpdating();
877877

878878
var interface = element.inheritanceManager.getInterface(element);
879+
879880
for (var entry in interface.map.entries) {
880881
var executable = entry.value.baseElement;
881882

@@ -915,6 +916,27 @@ class LibraryManifestBuilder {
915916
item.interface.map[lookupName] = id;
916917
}
917918

919+
for (var entry in interface.implemented.entries) {
920+
var executable = entry.value.baseElement;
921+
var lookupName = executable.lookupName?.asLookupName;
922+
if (lookupName != null && !lookupName.isPrivate) {
923+
var id = _getInterfaceElementMemberId(executable);
924+
item.interface.implemented[lookupName] = id;
925+
}
926+
}
927+
928+
for (var superImplemented in interface.superImplemented) {
929+
var layer = <LookupName, ManifestItemId>{};
930+
for (var entry in superImplemented.entries) {
931+
var executable = entry.value.baseElement;
932+
var lookupName = executable.lookupName?.asLookupName;
933+
if (lookupName != null && !lookupName.isPrivate) {
934+
layer[lookupName] = _getInterfaceElementMemberId(executable);
935+
}
936+
}
937+
item.interface.superImplemented.add(layer);
938+
}
939+
918940
item.interface.afterUpdate();
919941
}
920942

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

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -986,10 +986,22 @@ sealed class InterfaceItem<E extends InterfaceElementImpl>
986986
required this.interface,
987987
});
988988

989+
ManifestItemId? getImplementedMethodId(LookupName name) {
990+
return interface.implemented[name];
991+
}
992+
989993
ManifestItemId? getInterfaceMethodId(LookupName name) {
990994
return interface.map[name];
991995
}
992996

997+
ManifestItemId? getSuperImplementedMethodId(int index, LookupName name) {
998+
if (index < interface.superImplemented.length) {
999+
return interface.superImplemented[index][name];
1000+
} else {
1001+
return null;
1002+
}
1003+
}
1004+
9931005
/// Intentionally omits [hasNonFinalField], which is tracked as a separate
9941006
/// requirement.
9951007
@override
@@ -1141,10 +1153,14 @@ class ManifestInterface {
11411153

11421154
/// The map of names to their IDs in the interface.
11431155
Map<LookupName, ManifestItemId> map;
1156+
Map<LookupName, ManifestItemId> implemented;
1157+
List<Map<LookupName, ManifestItemId>> superImplemented;
11441158

11451159
/// We move [map] into here during building the manifest, so that we can
11461160
/// compare after building, and decide if [id] should be updated.
11471161
Map<LookupName, ManifestItemId> mapPrevious = {};
1162+
Map<LookupName, ManifestItemId> implementedPrevious = {};
1163+
List<Map<LookupName, ManifestItemId>> superImplementedPrevious = [];
11481164

11491165
/// Key: IDs of method declarations.
11501166
/// Value: ID assigned last time.
@@ -1158,13 +1174,17 @@ class ManifestInterface {
11581174
ManifestInterface({
11591175
required this.id,
11601176
required this.map,
1177+
required this.implemented,
1178+
required this.superImplemented,
11611179
required this.combinedIds,
11621180
});
11631181

11641182
factory ManifestInterface.empty() {
11651183
return ManifestInterface(
11661184
id: ManifestItemId.generate(),
11671185
map: {},
1186+
implemented: {},
1187+
superImplemented: [],
11681188
combinedIds: {},
11691189
);
11701190
}
@@ -1173,6 +1193,10 @@ class ManifestInterface {
11731193
return ManifestInterface(
11741194
id: ManifestItemId.read(reader),
11751195
map: reader.readLookupNameToIdMap(),
1196+
implemented: reader.readLookupNameToIdMap(),
1197+
superImplemented: reader.readTypedList(() {
1198+
return reader.readLookupNameToIdMap();
1199+
}),
11761200
combinedIds: reader.readMap(
11771201
readKey: () => ManifestItemIdList.read(reader),
11781202
readValue: () => ManifestItemId.read(reader),
@@ -1182,10 +1206,17 @@ class ManifestInterface {
11821206

11831207
void afterUpdate() {
11841208
const mapEquality = MapEquality<LookupName, ManifestItemId>();
1185-
if (!mapEquality.equals(map, mapPrevious)) {
1209+
const listEquality = ListEquality<Map<LookupName, ManifestItemId>>(
1210+
MapEquality<LookupName, ManifestItemId>(),
1211+
);
1212+
if (!mapEquality.equals(map, mapPrevious) ||
1213+
!mapEquality.equals(implemented, implementedPrevious) ||
1214+
!listEquality.equals(superImplemented, superImplementedPrevious)) {
11861215
id = ManifestItemId.generate();
11871216
}
11881217
mapPrevious = {};
1218+
implementedPrevious = {};
1219+
superImplementedPrevious = [];
11891220

11901221
combinedIdsTemp = {};
11911222
}
@@ -1194,13 +1225,21 @@ class ManifestInterface {
11941225
mapPrevious = map;
11951226
map = {};
11961227

1228+
implementedPrevious = implemented;
1229+
implemented = {};
1230+
1231+
superImplementedPrevious = superImplemented;
1232+
superImplemented = [];
1233+
11971234
combinedIdsTemp = combinedIds;
11981235
combinedIds = {};
11991236
}
12001237

12011238
void write(BufferedSink sink) {
12021239
id.write(sink);
12031240
map.write(sink);
1241+
implemented.write(sink);
1242+
sink.writeList(superImplemented, (map) => map.write(sink));
12041243
sink.writeMap(
12051244
combinedIds,
12061245
writeKey: (key) => key.write(sink),

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

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,30 @@ final class ExportLibraryMissing extends ExportFailure {
8484
}
8585
}
8686

87+
class ImplementedMethodIdMismatch extends RequirementFailure {
88+
final Uri libraryUri;
89+
final LookupName interfaceName;
90+
final LookupName methodName;
91+
final ManifestItemId? expectedId;
92+
final ManifestItemId? actualId;
93+
94+
ImplementedMethodIdMismatch({
95+
required this.libraryUri,
96+
required this.interfaceName,
97+
required this.methodName,
98+
required this.expectedId,
99+
required this.actualId,
100+
});
101+
102+
@override
103+
String toString() {
104+
return 'ImplementedMethodIdMismatch(libraryUri: $libraryUri, '
105+
'interfaceName: ${interfaceName.asString}, '
106+
'methodName: ${methodName.asString}, '
107+
'expectedId: $expectedId, actualId: $actualId)';
108+
}
109+
}
110+
87111
class InstanceChildrenIdsMismatch extends RequirementFailure {
88112
final Uri libraryUri;
89113
final LookupName instanceName;
@@ -274,6 +298,33 @@ final class OpaqueApiUseFailure extends RequirementFailure {
274298

275299
sealed class RequirementFailure {}
276300

301+
class SuperImplementedMethodIdMismatch extends RequirementFailure {
302+
final Uri libraryUri;
303+
final LookupName interfaceName;
304+
final int superIndex;
305+
final LookupName methodName;
306+
final ManifestItemId? expectedId;
307+
final ManifestItemId? actualId;
308+
309+
SuperImplementedMethodIdMismatch({
310+
required this.libraryUri,
311+
required this.interfaceName,
312+
required this.superIndex,
313+
required this.methodName,
314+
required this.expectedId,
315+
required this.actualId,
316+
});
317+
318+
@override
319+
String toString() {
320+
return 'SuperImplementedMethodIdMismatch(libraryUri: $libraryUri, '
321+
'interfaceName: ${interfaceName.asString}, '
322+
'superIndex: $superIndex, '
323+
'methodName: ${methodName.asString}, '
324+
'expectedId: $expectedId, actualId: $actualId)';
325+
}
326+
}
327+
277328
sealed class TopLevelFailure extends RequirementFailure {
278329
final Uri libraryUri;
279330
final LookupName name;

0 commit comments

Comments
 (0)