Skip to content

Commit 51b7329

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Record const/final/late for fields and top-level variables
Teach the fine-grained manifest to capture field/variable modifiers that affect API shape and const semantics. Add `isConst`, `isFinal`, and `isLate` to `InstanceItemFieldItem` and `TopLevelVariableItem`, and thread them through encoding, decoding, and matching. - Add the three flags to the two item types and populate them from element properties. - Persist the flags in summaries (read/write three booleans) and compare them in `match()` to detect modifier-only changes that impact the API (e.g. `final` vs `var` alters setter presence; `const` affects constantness). - Correct the serialization tag for `InstanceItemFieldItem` to write `_InstanceItemMemberItemKind.field` (it previously wrote `getter`). - Bump `AnalysisDriver.DATA_VERSION` to 529 to invalidate stale caches. This makes manifest matching reflect modifier-driven API differences more accurately and prevents incorrect bundle reuse when only `const`/`final`/ `late` change. Change-Id: I4249456fefdd5763adc5ba294cbf25e32f86511f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447943 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent e3d218a commit 51b7329

File tree

3 files changed

+334
-2
lines changed

3 files changed

+334
-2
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 = 528;
109+
static const int DATA_VERSION = 529;
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: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,13 +492,19 @@ sealed class InstanceItem<E extends InstanceElementImpl>
492492
}
493493

494494
class InstanceItemFieldItem extends InstanceItemMemberItem<FieldElementImpl> {
495+
final bool isConst;
496+
final bool isFinal;
497+
final bool isLate;
495498
final ManifestType type;
496499
final ManifestNode? constInitializer;
497500

498501
InstanceItemFieldItem({
499502
required super.id,
500503
required super.metadata,
501504
required super.isStatic,
505+
required this.isConst,
506+
required this.isFinal,
507+
required this.isLate,
502508
required this.type,
503509
required this.constInitializer,
504510
});
@@ -512,6 +518,9 @@ class InstanceItemFieldItem extends InstanceItemMemberItem<FieldElementImpl> {
512518
id: id,
513519
metadata: ManifestMetadata.encode(context, element.metadata),
514520
isStatic: element.isStatic,
521+
isConst: element.isConst,
522+
isFinal: element.isFinal,
523+
isLate: element.isLate,
515524
type: element.type.encode(context),
516525
constInitializer: element.constantInitializer?.encode(context),
517526
);
@@ -522,6 +531,9 @@ class InstanceItemFieldItem extends InstanceItemMemberItem<FieldElementImpl> {
522531
id: ManifestItemId.read(reader),
523532
metadata: ManifestMetadata.read(reader),
524533
isStatic: reader.readBool(),
534+
isConst: reader.readBool(),
535+
isFinal: reader.readBool(),
536+
isLate: reader.readBool(),
525537
type: ManifestType.read(reader),
526538
constInitializer: ManifestNode.readOptional(reader),
527539
);
@@ -530,20 +542,26 @@ class InstanceItemFieldItem extends InstanceItemMemberItem<FieldElementImpl> {
530542
@override
531543
bool match(MatchContext context, FieldElementImpl element) {
532544
return super.match(context, element) &&
545+
isConst == element.isConst &&
546+
isFinal == element.isFinal &&
547+
isLate == element.isLate &&
533548
type.match(context, element.type) &&
534549
constInitializer.match(context, element.constantInitializer);
535550
}
536551

537552
@override
538553
void write(BufferedSink sink) {
539554
super.write(sink);
555+
sink.writeBool(isConst);
556+
sink.writeBool(isFinal);
557+
sink.writeBool(isLate);
540558
type.write(sink);
541559
constInitializer.writeOptional(sink);
542560
}
543561

544562
@override
545563
void writeKind(BufferedSink sink) {
546-
sink.writeEnum(_InstanceItemMemberItemKind.getter);
564+
sink.writeEnum(_InstanceItemMemberItemKind.field);
547565
}
548566

549567
static Map<LookupName, InstanceItemFieldItem> readMap(
@@ -1323,12 +1341,18 @@ class TopLevelSetterItem extends TopLevelItem<SetterElementImpl> {
13231341
}
13241342

13251343
class TopLevelVariableItem extends TopLevelItem<TopLevelVariableElementImpl> {
1344+
final bool isConst;
1345+
final bool isFinal;
1346+
final bool isLate;
13261347
final ManifestType type;
13271348
final ManifestNode? constInitializer;
13281349

13291350
TopLevelVariableItem({
13301351
required super.id,
13311352
required super.metadata,
1353+
required this.isConst,
1354+
required this.isFinal,
1355+
required this.isLate,
13321356
required this.type,
13331357
required this.constInitializer,
13341358
});
@@ -1341,6 +1365,9 @@ class TopLevelVariableItem extends TopLevelItem<TopLevelVariableElementImpl> {
13411365
return TopLevelVariableItem(
13421366
id: id,
13431367
metadata: ManifestMetadata.encode(context, element.metadata),
1368+
isConst: element.isConst,
1369+
isFinal: element.isFinal,
1370+
isLate: element.isLate,
13441371
type: element.type.encode(context),
13451372
constInitializer: element.constantInitializer?.encode(context),
13461373
);
@@ -1350,6 +1377,9 @@ class TopLevelVariableItem extends TopLevelItem<TopLevelVariableElementImpl> {
13501377
return TopLevelVariableItem(
13511378
id: ManifestItemId.read(reader),
13521379
metadata: ManifestMetadata.read(reader),
1380+
isConst: reader.readBool(),
1381+
isFinal: reader.readBool(),
1382+
isLate: reader.readBool(),
13531383
type: ManifestType.read(reader),
13541384
constInitializer: ManifestNode.readOptional(reader),
13551385
);
@@ -1358,13 +1388,19 @@ class TopLevelVariableItem extends TopLevelItem<TopLevelVariableElementImpl> {
13581388
@override
13591389
bool match(MatchContext context, TopLevelVariableElementImpl element) {
13601390
return super.match(context, element) &&
1391+
isConst == element.isConst &&
1392+
isFinal == element.isFinal &&
1393+
isLate == element.isLate &&
13611394
type.match(context, element.type) &&
13621395
constInitializer.match(context, element.constantInitializer);
13631396
}
13641397

13651398
@override
13661399
void write(BufferedSink sink) {
13671400
super.write(sink);
1401+
sink.writeBool(isConst);
1402+
sink.writeBool(isFinal);
1403+
sink.writeBool(isLate);
13681404
type.write(sink);
13691405
constInitializer.writeOptional(sink);
13701406
}

0 commit comments

Comments
 (0)