Skip to content

Commit b4042b2

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Separate requirements on methods and constructors.
Change-Id: I26416f691e66ca4ed62a6cbb299acc1f2a8682ee Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/423762 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 26d1f3d commit b4042b2

File tree

5 files changed

+119
-58
lines changed

5 files changed

+119
-58
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ final class ManifestElement {
164164
sink.writeUri(libraryUri);
165165
sink.writeStringUtf8(topLevelName);
166166
sink.writeOptionalStringUtf8(memberName);
167-
sink.writeOptionalObject(id, (it) => it.write(sink));
167+
id.writeOptional(sink);
168168
}
169169

170170
static ManifestElement encode(EncodeContext context, Element2 element) {

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,16 @@ class ManifestItemId {
5050
sink.writeUInt32(timestamp);
5151
sink.writeUInt32(randomBits);
5252
}
53+
54+
static ManifestItemId? readOptional(SummaryDataReader reader) {
55+
return reader.readOptionalObject(() => ManifestItemId.read(reader));
56+
}
57+
}
58+
59+
extension ManifestItemIdExtension on ManifestItemId? {
60+
void writeOptional(BufferedSink sink) {
61+
sink.writeOptionalObject(this, (id) {
62+
id.write(sink);
63+
});
64+
}
5365
}

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

Lines changed: 84 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,41 @@ final class ExportRequirementShowCombinator
185185
}
186186
}
187187

188+
/// Includes all requirements from class-like items: classes, enums,
189+
/// extensions (NB), extension types, mixins.
190+
class InterfaceRequirements {
191+
final Map<LookupName, ManifestItemId?> constructors;
192+
193+
/// These are "methods" in wide meaning: methods, getters, setters.
194+
final Map<LookupName, ManifestItemId?> methods;
195+
196+
InterfaceRequirements({required this.constructors, required this.methods});
197+
198+
factory InterfaceRequirements.empty() {
199+
return InterfaceRequirements(constructors: {}, methods: {});
200+
}
201+
202+
factory InterfaceRequirements.read(SummaryDataReader reader) {
203+
return InterfaceRequirements(
204+
constructors: reader.readNameToIdMap(),
205+
methods: reader.readNameToIdMap(),
206+
);
207+
}
208+
209+
void write(BufferedSink sink) {
210+
sink.writeNameToIdMap(constructors);
211+
sink.writeNameToIdMap(methods);
212+
}
213+
}
214+
188215
class RequirementsManifest {
189216
/// LibraryUri => TopName => ID
190217
final Map<Uri, Map<LookupName, ManifestItemId?>> topLevels = {};
191218

192-
/// LibraryUri => TopName => MemberName => ID
193-
final Map<Uri, Map<LookupName, Map<LookupName, ManifestItemId?>>>
194-
interfaceMembers = {};
219+
/// LibraryUri => TopName => InterfaceRequirements
220+
///
221+
/// These are "methods" in wide meaning: methods, getters, setters.
222+
final Map<Uri, Map<LookupName, InterfaceRequirements>> interfaces = {};
195223

196224
final List<ExportRequirement> exportRequirements = [];
197225

@@ -200,28 +228,20 @@ class RequirementsManifest {
200228
factory RequirementsManifest.read(SummaryDataReader reader) {
201229
var result = RequirementsManifest();
202230

203-
Map<LookupName, ManifestItemId?> readNameToIdMap() {
204-
return reader.readMap(
205-
readKey: () => LookupName.read(reader),
206-
readValue:
207-
() => reader.readOptionalObject(() => ManifestItemId.read(reader)),
208-
);
209-
}
210-
211231
result.topLevels.addAll(
212232
reader.readMap(
213233
readKey: () => reader.readUri(),
214-
readValue: readNameToIdMap,
234+
readValue: () => reader.readNameToIdMap(),
215235
),
216236
);
217237

218-
result.interfaceMembers.addAll(
238+
result.interfaces.addAll(
219239
reader.readMap(
220240
readKey: () => reader.readUri(),
221241
readValue: () {
222242
return reader.readMap(
223243
readKey: () => LookupName.read(reader),
224-
readValue: readNameToIdMap,
244+
readValue: () => InterfaceRequirements.read(reader),
225245
);
226246
},
227247
),
@@ -276,7 +296,7 @@ class RequirementsManifest {
276296
}
277297
}
278298

279-
for (var libraryEntry in interfaceMembers.entries) {
299+
for (var libraryEntry in interfaces.entries) {
280300
var libraryUri = libraryEntry.key;
281301

282302
var libraryElement = elementFactory.libraryOfUri(libraryUri);
@@ -295,10 +315,25 @@ class RequirementsManifest {
295315
);
296316
}
297317

298-
for (var memberEntry in interfaceEntry.value.entries) {
299-
var memberName = memberEntry.key;
318+
for (var methodEntry in interfaceEntry.value.constructors.entries) {
319+
var memberName = methodEntry.key;
300320
var memberId = interfaceItem.getMemberId(memberName);
301-
var expectedId = memberEntry.value;
321+
var expectedId = methodEntry.value;
322+
if (expectedId != memberId) {
323+
return InstanceMemberIdMismatch(
324+
libraryUri: libraryUri,
325+
interfaceName: interfaceName,
326+
memberName: memberName,
327+
expectedId: expectedId,
328+
actualId: memberId,
329+
);
330+
}
331+
}
332+
333+
for (var methodEntry in interfaceEntry.value.methods.entries) {
334+
var memberName = methodEntry.key;
335+
var memberId = interfaceItem.getMemberId(memberName);
336+
var expectedId = methodEntry.value;
302337
if (expectedId != memberId) {
303338
return InstanceMemberIdMismatch(
304339
libraryUri: libraryUri,
@@ -342,16 +377,17 @@ class RequirementsManifest {
342377
// SAFETY: we don't export elements without name.
343378
interfaceName!;
344379

345-
var interfacesMap = interfaceMembers[libraryElement.uri] ??= {};
380+
var interfacesMap = interfaces[libraryElement.uri] ??= {};
346381
var interfaceItem = manifest.items[interfaceName];
347382

348383
// SAFETY: every interface element must be in the manifest.
349384
interfaceItem as InterfaceItem;
350385

351386
var memberName = name.asLookupName;
352387
var memberId = interfaceItem.getMemberId(memberName);
353-
var interfaceMap = interfacesMap[interfaceName] ??= {};
354-
interfaceMap[memberName] = memberId;
388+
var interface =
389+
interfacesMap[interfaceName] ??= InterfaceRequirements.empty();
390+
interface.constructors[memberName] = memberId;
355391
}
356392

357393
/// This method is invoked by [InheritanceManager3] to notify the collector
@@ -379,16 +415,17 @@ class RequirementsManifest {
379415
// SAFETY: we don't export elements without name.
380416
interfaceName!;
381417

382-
var interfacesMap = interfaceMembers[libraryElement.uri] ??= {};
418+
var interfacesMap = interfaces[libraryElement.uri] ??= {};
383419
var interfaceItem = manifest.items[interfaceName];
384420

385421
// SAFETY: every interface element must be in the manifest.
386422
interfaceItem as InterfaceItem;
387423

388424
var memberName = nameObj.name.asLookupName;
389425
var memberId = interfaceItem.getMemberId(memberName);
390-
var interfaceMap = interfacesMap[interfaceName] ??= {};
391-
interfaceMap[memberName] = memberId;
426+
var interface =
427+
interfacesMap[interfaceName] ??= InterfaceRequirements.empty();
428+
interface.methods[memberName] = memberId;
392429
}
393430

394431
/// This method is invoked by an import scope to notify the collector that
@@ -420,37 +457,25 @@ class RequirementsManifest {
420457
}
421458

422459
for (var libUri in bundleLibraryUriList) {
423-
interfaceMembers.remove(libUri);
460+
interfaces.remove(libUri);
424461
}
425462
}
426463

427464
void write(BufferedSink sink) {
428-
void writeNameToIdMap(Map<LookupName, ManifestItemId?> map) {
429-
sink.writeMap(
430-
map,
431-
writeKey: (name) => name.write(sink),
432-
writeValue: (id) {
433-
sink.writeOptionalObject(id, (id) {
434-
id.write(sink);
435-
});
436-
},
437-
);
438-
}
439-
440465
sink.writeMap(
441466
topLevels,
442467
writeKey: (uri) => sink.writeUri(uri),
443-
writeValue: writeNameToIdMap,
468+
writeValue: (map) => sink.writeNameToIdMap(map),
444469
);
445470

446471
sink.writeMap(
447-
interfaceMembers,
472+
interfaces,
448473
writeKey: (uri) => sink.writeUri(uri),
449474
writeValue: (nameToInterfaceMap) {
450475
sink.writeMap(
451476
nameToInterfaceMap,
452477
writeKey: (name) => name.write(sink),
453-
writeValue: writeNameToIdMap,
478+
writeValue: (interface) => interface.write(sink),
454479
);
455480
},
456481
);
@@ -515,3 +540,22 @@ class RequirementsManifest {
515540
}
516541

517542
enum _ExportRequirementCombinatorKind { hide, show }
543+
544+
extension _BufferedSinkExtension on BufferedSink {
545+
void writeNameToIdMap(Map<LookupName, ManifestItemId?> map) {
546+
writeMap(
547+
map,
548+
writeKey: (name) => name.write(this),
549+
writeValue: (id) => id.writeOptional(this),
550+
);
551+
}
552+
}
553+
554+
extension _SummaryDataReaderExtension on SummaryDataReader {
555+
Map<LookupName, ManifestItemId?> readNameToIdMap() {
556+
return readMap(
557+
readKey: () => LookupName.read(this),
558+
readValue: () => ManifestItemId.readOptional(this),
559+
);
560+
}
561+
}

pkg/analyzer/test/src/dart/analysis/driver_test.dart

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5506,7 +5506,7 @@ void f() {
55065506
interfaces
55075507
package:test/a.dart
55085508
A
5509-
methods
5509+
constructors
55105510
named: #M1
55115511
[status] idle
55125512
''',
@@ -5555,7 +5555,7 @@ class A {
55555555
interfaces
55565556
package:test/a.dart
55575557
A
5558-
methods
5558+
constructors
55595559
named: #M4
55605560
[status] idle
55615561
''',
@@ -5613,7 +5613,7 @@ void f() {
56135613
interfaces
56145614
package:test/a.dart
56155615
A
5616-
methods
5616+
constructors
56175617
c2: <null>
56185618
[status] idle
56195619
''',
@@ -5661,7 +5661,7 @@ class A {
56615661
interfaces
56625662
package:test/a.dart
56635663
A
5664-
methods
5664+
constructors
56655665
c2: #M3
56665666
[status] idle
56675667
''',
@@ -5722,7 +5722,7 @@ void f() {
57225722
interfaces
57235723
package:test/a.dart
57245724
A
5725-
methods
5725+
constructors
57265726
c1: #M1
57275727
[status] idle
57285728
''',
@@ -5811,7 +5811,7 @@ void f() {
58115811
interfaces
58125812
package:test/a.dart
58135813
A
5814-
methods
5814+
constructors
58155815
c2: #M2
58165816
[status] idle
58175817
''',
@@ -5859,7 +5859,7 @@ class A {
58595859
interfaces
58605860
package:test/a.dart
58615861
A
5862-
methods
5862+
constructors
58635863
c2: <null>
58645864
[status] idle
58655865
''',
@@ -5916,7 +5916,7 @@ class B extends A {
59165916
interfaces
59175917
package:test/a.dart
59185918
A
5919-
methods
5919+
constructors
59205920
named: #M1
59215921
[operation] analyzeFile
59225922
file: /home/test/lib/test.dart
@@ -5934,7 +5934,7 @@ class B extends A {
59345934
interfaces
59355935
package:test/a.dart
59365936
A
5937-
methods
5937+
constructors
59385938
named: #M1
59395939
[status] idle
59405940
''',
@@ -5984,7 +5984,7 @@ class A {
59845984
interfaces
59855985
package:test/a.dart
59865986
A
5987-
methods
5987+
constructors
59885988
named: #M5
59895989
[operation] getErrorsCannotReuse
59905990
instanceMemberIdMismatch
@@ -6009,7 +6009,7 @@ class A {
60096009
interfaces
60106010
package:test/a.dart
60116011
A
6012-
methods
6012+
constructors
60136013
named: #M5
60146014
[status] idle
60156015
''',
@@ -6070,7 +6070,7 @@ void f() {
60706070
interfaces
60716071
package:test/a.dart
60726072
A
6073-
methods
6073+
constructors
60746074
new: #M1
60756075
[status] idle
60766076
''',
@@ -6119,7 +6119,7 @@ class A {
61196119
interfaces
61206120
package:test/a.dart
61216121
A
6122-
methods
6122+
constructors
61236123
new: #M4
61246124
[status] idle
61256125
''',
@@ -9223,7 +9223,7 @@ void f() {
92239223
interfaces
92249224
package:test/a.dart
92259225
B
9226-
methods
9226+
constructors
92279227
named: #M1
92289228
[status] idle
92299229
''',
@@ -9278,7 +9278,7 @@ class B = A with M;
92789278
interfaces
92799279
package:test/a.dart
92809280
B
9281-
methods
9281+
constructors
92829282
named: #M6
92839283
[status] idle
92849284
''',

0 commit comments

Comments
 (0)