Skip to content

Commit 31f7950

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Persist type erasure and self-ref flags for extension types
Capture more observable facts about extension types in fine-grained manifests to improve matching and invalidation. This change persists additional fields on `ExtensionTypeItem` and uses them during matching: - `typeErasure` - `representationType` - `hasImplementsSelfReference` - `hasRepresentationSelfReference` It updates encode/decode/write paths, extends `match()` to compare the new fields, and teaches the result printer to display the flags and types when element manifests are enabled. The analyzer data format is bumped (`DATA_VERSION` 532 → 533) to invalidate stale caches. Motivation: - Make manifest identities reflect changes to an extension type’s underlying representation and erasure. - Enable manifest-driven, flag-level invalidation without re-deriving from other properties. - Improve determinism and clarity in diagnostics and reuse decisions. Notes: - Existing behavior is preserved; changes primarily affect identity, reuse, and printed diagnostics. - Cache rebuilds are expected due to the version bump. Change-Id: I008c9549265811dacbabfcdb1d2554349c55fee2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447983 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 3172a7c commit 31f7950

File tree

4 files changed

+221
-44
lines changed

4 files changed

+221
-44
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 = 532;
109+
static const int DATA_VERSION = 533;
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/fine/manifest_item.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,11 @@ class ExtensionItem<E extends ExtensionElementImpl> extends InstanceItem<E> {
264264
}
265265

266266
class ExtensionTypeItem extends InterfaceItem<ExtensionTypeElementImpl> {
267+
final bool hasImplementsSelfReference;
268+
final bool hasRepresentationSelfReference;
269+
final ManifestType representationType;
270+
final ManifestType typeErasure;
271+
267272
ExtensionTypeItem({
268273
required super.id,
269274
required super.metadata,
@@ -279,6 +284,10 @@ class ExtensionTypeItem extends InterfaceItem<ExtensionTypeElementImpl> {
279284
required super.supertype,
280285
required super.mixins,
281286
required super.interfaces,
287+
required this.hasImplementsSelfReference,
288+
required this.hasRepresentationSelfReference,
289+
required this.representationType,
290+
required this.typeErasure,
282291
});
283292

284293
factory ExtensionTypeItem.fromElement({
@@ -302,6 +311,10 @@ class ExtensionTypeItem extends InterfaceItem<ExtensionTypeElementImpl> {
302311
supertype: element.supertype?.encode(context),
303312
mixins: element.mixins.encode(context),
304313
interfaces: element.interfaces.encode(context),
314+
hasImplementsSelfReference: element.hasImplementsSelfReference,
315+
hasRepresentationSelfReference: element.hasRepresentationSelfReference,
316+
representationType: element.representation.type.encode(context),
317+
typeErasure: element.typeErasure.encode(context),
305318
);
306319
});
307320
}
@@ -322,8 +335,31 @@ class ExtensionTypeItem extends InterfaceItem<ExtensionTypeElementImpl> {
322335
mixins: ManifestType.readList(reader),
323336
interfaces: ManifestType.readList(reader),
324337
interface: ManifestInterface.read(reader),
338+
hasImplementsSelfReference: reader.readBool(),
339+
hasRepresentationSelfReference: reader.readBool(),
340+
representationType: ManifestType.read(reader),
341+
typeErasure: ManifestType.read(reader),
325342
);
326343
}
344+
345+
@override
346+
bool match(MatchContext context, ExtensionTypeElementImpl element) {
347+
return super.match(context, element) &&
348+
hasImplementsSelfReference == element.hasImplementsSelfReference &&
349+
hasRepresentationSelfReference ==
350+
element.hasRepresentationSelfReference &&
351+
representationType.match(context, element.representation.type) &&
352+
typeErasure.match(context, element.typeErasure);
353+
}
354+
355+
@override
356+
void write(BufferedSink sink) {
357+
super.write(sink);
358+
sink.writeBool(hasImplementsSelfReference);
359+
sink.writeBool(hasRepresentationSelfReference);
360+
representationType.write(sink);
361+
typeErasure.write(sink);
362+
}
327363
}
328364

329365
/// The item for [InstanceElementImpl].

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

Lines changed: 178 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -24174,28 +24174,27 @@ extension type A(double it) {
2417424174
[operation] linkLibraryCycle
2417524175
package:test/a.dart
2417624176
declaredExtensionTypes
24177-
A: #M0
24177+
A: #M6
2417824178
declaredFields
24179-
it: #M6
24180-
declaredGetters
2418124179
it: #M7
24180+
declaredGetters
24181+
it: #M8
2418224182
declaredConstructors
24183-
named: #M3
24184-
new: #M8
24185-
interface: #M9
24183+
named: #M9
24184+
new: #M10
24185+
interface: #M11
2418624186
map
24187-
it: #M7
24187+
it: #M8
2418824188
requirements
2418924189
[operation] reuseLinkedBundle
2419024190
package:test/test.dart
2419124191
[operation] checkLibraryDiagnosticsRequirements
2419224192
library: /home/test/lib/test.dart
24193-
interfaceChildrenIdsMismatch
24193+
topLevelIdMismatch
2419424194
libraryUri: package:test/a.dart
24195-
interfaceName: A
24196-
childrenPropertyName: constructors
24197-
expectedIds: #M4 #M3
24198-
actualIds: #M8 #M3
24195+
name: A
24196+
expectedId: #M0
24197+
actualId: #M6
2419924198
[operation] analyzeFile
2420024199
file: /home/test/lib/test.dart
2420124200
library: /home/test/lib/test.dart
@@ -24212,10 +24211,10 @@ extension type A(double it) {
2421224211
libraries
2421324212
package:test/a.dart
2421424213
exportedTopLevels
24215-
A: #M0
24214+
A: #M6
2421624215
interfaces
2421724216
A
24218-
allConstructors: #M8 #M3
24217+
allConstructors: #M10 #M9
2421924218
[status] idle
2422024219
[future] getErrors T2
2422124220
ErrorsResult #3
@@ -24297,27 +24296,26 @@ extension type A(double it) {}
2429724296
[operation] linkLibraryCycle
2429824297
package:test/a.dart
2429924298
declaredExtensionTypes
24300-
A: #M0
24299+
A: #M6
2430124300
declaredFields
24302-
it: #M6
24303-
declaredGetters
2430424301
it: #M7
24302+
declaredGetters
24303+
it: #M8
2430524304
declaredConstructors
24306-
new: #M8
24307-
interface: #M9
24305+
new: #M9
24306+
interface: #M10
2430824307
map
24309-
it: #M7
24308+
it: #M8
2431024309
requirements
2431124310
[operation] reuseLinkedBundle
2431224311
package:test/test.dart
2431324312
[operation] checkLibraryDiagnosticsRequirements
2431424313
library: /home/test/lib/test.dart
24315-
interfaceConstructorIdMismatch
24314+
topLevelIdMismatch
2431624315
libraryUri: package:test/a.dart
24317-
interfaceName: A
24318-
constructorName: new
24319-
expectedId: #M3
24320-
actualId: #M8
24316+
name: A
24317+
expectedId: #M0
24318+
actualId: #M6
2432124319
[operation] analyzeFile
2432224320
file: /home/test/lib/test.dart
2432324321
library: /home/test/lib/test.dart
@@ -24332,11 +24330,11 @@ extension type A(double it) {}
2433224330
libraries
2433324331
package:test/a.dart
2433424332
exportedTopLevels
24335-
A: #M0
24333+
A: #M6
2433624334
interfaces
2433724335
A
2433824336
requestedConstructors
24339-
new: #M8
24337+
new: #M9
2434024338
[status] idle
2434124339
[future] getErrors T2
2434224340
ErrorsResult #3
@@ -24421,26 +24419,49 @@ extension type A(double it) {
2442124419
[operation] linkLibraryCycle
2442224420
package:test/a.dart
2442324421
declaredExtensionTypes
24424-
A: #M0
24422+
A: #M7
2442524423
declaredFields
24426-
it: #M7
24427-
declaredGetters
2442824424
it: #M8
24425+
declaredGetters
24426+
it: #M9
2442924427
declaredConstructors
24430-
named: #M3
24431-
new: #M9
24432-
interface: #M10
24428+
named: #M10
24429+
new: #M11
24430+
interface: #M12
2443324431
map
24434-
it: #M8
24432+
it: #M9
2443524433
requirements
2443624434
[operation] reuseLinkedBundle
2443724435
package:test/test.dart
24438-
[operation] getErrorsFromBytes
24436+
[operation] checkLibraryDiagnosticsRequirements
24437+
library: /home/test/lib/test.dart
24438+
topLevelIdMismatch
24439+
libraryUri: package:test/a.dart
24440+
name: A
24441+
expectedId: #M0
24442+
actualId: #M7
24443+
[operation] analyzeFile
2443924444
file: /home/test/lib/test.dart
2444024445
library: /home/test/lib/test.dart
24446+
[stream]
24447+
ResolvedUnitResult #2
24448+
path: /home/test/lib/test.dart
24449+
uri: package:test/test.dart
24450+
flags: exists isLibrary
24451+
[operation] analyzedLibrary
24452+
file: /home/test/lib/test.dart
24453+
requirements
24454+
libraries
24455+
package:test/a.dart
24456+
exportedTopLevels
24457+
A: #M7
24458+
interfaces
24459+
A
24460+
requestedConstructors
24461+
named: #M10
2444124462
[status] idle
2444224463
[future] getErrors T2
24443-
ErrorsResult #2
24464+
ErrorsResult #3
2444424465
path: /home/test/lib/test.dart
2444524466
uri: package:test/test.dart
2444624467
flags: isLibrary
@@ -50881,6 +50902,82 @@ extension type A(int it) {
5088150902
);
5088250903
}
5088350904

50905+
test_manifest_extensionType_hasImplementsSelfReference() async {
50906+
await _runLibraryManifestScenario(
50907+
initialCode: r'''
50908+
extension type A(int it) implements Object {}
50909+
''',
50910+
expectedInitialEvents: r'''
50911+
[operation] linkLibraryCycle SDK
50912+
[operation] linkLibraryCycle
50913+
package:test/test.dart
50914+
declaredExtensionTypes
50915+
A: #M0
50916+
declaredFields
50917+
it: #M1
50918+
declaredGetters
50919+
it: #M2
50920+
interface: #M3
50921+
map
50922+
it: #M2
50923+
''',
50924+
updatedCode: r'''
50925+
extension type A(int it) implements A {}
50926+
''',
50927+
expectedUpdatedEvents: r'''
50928+
[operation] linkLibraryCycle
50929+
package:test/test.dart
50930+
declaredExtensionTypes
50931+
A: #M4
50932+
declaredFields
50933+
it: #M5
50934+
declaredGetters
50935+
it: #M6
50936+
interface: #M7
50937+
map
50938+
it: #M6
50939+
''',
50940+
);
50941+
}
50942+
50943+
test_manifest_extensionType_hasRepresentationSelfReference() async {
50944+
await _runLibraryManifestScenario(
50945+
initialCode: r'''
50946+
extension type A(NoSuchType it) {}
50947+
''',
50948+
expectedInitialEvents: r'''
50949+
[operation] linkLibraryCycle SDK
50950+
[operation] linkLibraryCycle
50951+
package:test/test.dart
50952+
declaredExtensionTypes
50953+
A: #M0
50954+
declaredFields
50955+
it: #M1
50956+
declaredGetters
50957+
it: #M2
50958+
interface: #M3
50959+
map
50960+
it: #M2
50961+
''',
50962+
updatedCode: r'''
50963+
extension type A(A it) {}
50964+
''',
50965+
expectedUpdatedEvents: r'''
50966+
[operation] linkLibraryCycle
50967+
package:test/test.dart
50968+
declaredExtensionTypes
50969+
A: #M4
50970+
declaredFields
50971+
it: #M5
50972+
declaredGetters
50973+
it: #M6
50974+
interface: #M7
50975+
map
50976+
it: #M6
50977+
''',
50978+
);
50979+
}
50980+
5088450981
test_manifest_extensionType_implements_add() async {
5088550982
await _runLibraryManifestScenario(
5088650983
initialCode: r'''
@@ -51205,17 +51302,17 @@ extension type A(double it) {
5120551302
[operation] linkLibraryCycle
5120651303
package:test/test.dart
5120751304
declaredExtensionTypes
51208-
A: #M0
51305+
A: #M5
5120951306
declaredFields
51210-
it: #M5
51211-
declaredGetters
5121251307
it: #M6
51308+
declaredGetters
51309+
it: #M7
5121351310
declaredMethods
51214-
foo: #M3
51215-
interface: #M7
51311+
foo: #M8
51312+
interface: #M9
5121651313
map
51217-
foo: #M3
51218-
it: #M6
51314+
foo: #M8
51315+
it: #M7
5121951316
''',
5122051317
);
5122151318
}
@@ -51278,6 +51375,44 @@ extension type A(int it) {
5127851375
);
5127951376
}
5128051377

51378+
test_manifest_extensionType_typeErasure() async {
51379+
await _runLibraryManifestScenario(
51380+
initialCode: r'''
51381+
extension type A(num it) {}
51382+
''',
51383+
expectedInitialEvents: r'''
51384+
[operation] linkLibraryCycle SDK
51385+
[operation] linkLibraryCycle
51386+
package:test/test.dart
51387+
declaredExtensionTypes
51388+
A: #M0
51389+
declaredFields
51390+
it: #M1
51391+
declaredGetters
51392+
it: #M2
51393+
interface: #M3
51394+
map
51395+
it: #M2
51396+
''',
51397+
updatedCode: r'''
51398+
extension type A(int it) {}
51399+
''',
51400+
expectedUpdatedEvents: r'''
51401+
[operation] linkLibraryCycle
51402+
package:test/test.dart
51403+
declaredExtensionTypes
51404+
A: #M4
51405+
declaredFields
51406+
it: #M5
51407+
declaredGetters
51408+
it: #M6
51409+
interface: #M7
51410+
map
51411+
it: #M6
51412+
''',
51413+
);
51414+
}
51415+
5128151416
test_manifest_extensionType_typeParameters() async {
5128251417
await _runLibraryManifestScenario(
5128351418
initialCode: r'''

0 commit comments

Comments
 (0)