Skip to content

Commit e101229

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Include initializer of const top-level variable.
Change-Id: Ife91f61722f7b3d0279402868a820a54fc569cdf Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/419985 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent 45a088f commit e101229

File tree

4 files changed

+174
-1
lines changed

4 files changed

+174
-1
lines changed

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ sealed class ManifestNode {
1717
switch (node) {
1818
case Annotation():
1919
return ManifestNodeAnnotation.encode(context, node);
20+
case IntegerLiteral():
21+
return ManifestNodeIntegerLiteral.encode(node);
2022
case SimpleIdentifier():
2123
return ManifestNodeSimpleIdentifier.encode(context, node);
2224
default:
@@ -35,6 +37,10 @@ sealed class ManifestNode {
3537
return ManifestNodeSimpleIdentifier.read(reader);
3638
}
3739
}
40+
41+
static ManifestNode? readOptional(SummaryDataReader reader) {
42+
return reader.readOptionalObject(() => ManifestNode.read(reader));
43+
}
3844
}
3945

4046
class ManifestNodeAnnotation extends ManifestNode {
@@ -183,3 +189,20 @@ enum _ManifestNodeKind {
183189
integerLiteral,
184190
simpleIdentifier,
185191
}
192+
193+
extension ManifestNodeOrNullExtension on ManifestNode? {
194+
bool match(MatchContext context, AstNode? node) {
195+
var self = this;
196+
if (self == null && node == null) {
197+
return true;
198+
} else if (self == null || node == null) {
199+
return false;
200+
} else {
201+
return self.match(context, node);
202+
}
203+
}
204+
205+
void writeOptional(BufferedSink sink) {
206+
sink.writeOptionalObject(this, (it) => it.write(sink));
207+
}
208+
}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analyzer/dart/ast/ast.dart';
56
import 'package:analyzer/src/dart/element/element.dart';
67
import 'package:analyzer/src/fine/lookup_name.dart';
78
import 'package:analyzer/src/fine/manifest_ast.dart';
@@ -498,13 +499,15 @@ class TopLevelFunctionItem extends TopLevelItem {
498499
class TopLevelGetterItem extends TopLevelItem {
499500
final ManifestMetadata metadata;
500501
final ManifestType returnType;
502+
final ManifestNode? constInitializer;
501503

502504
TopLevelGetterItem({
503505
required super.libraryUri,
504506
required super.name,
505507
required super.id,
506508
required this.metadata,
507509
required this.returnType,
510+
required this.constInitializer,
508511
});
509512

510513
factory TopLevelGetterItem.fromElement({
@@ -519,6 +522,7 @@ class TopLevelGetterItem extends TopLevelItem {
519522
id: id,
520523
metadata: ManifestMetadata.encode(context, element.metadata2),
521524
returnType: element.returnType.encode(context),
525+
constInitializer: element.constInitializer?.encode(context),
522526
);
523527
}
524528

@@ -529,6 +533,7 @@ class TopLevelGetterItem extends TopLevelItem {
529533
id: ManifestItemId.read(reader),
530534
metadata: ManifestMetadata.read(reader),
531535
returnType: ManifestType.read(reader),
536+
constInitializer: ManifestNode.readOptional(reader),
532537
);
533538
}
534539

@@ -543,6 +548,10 @@ class TopLevelGetterItem extends TopLevelItem {
543548
return null;
544549
}
545550

551+
if (!constInitializer.match(context, element.constInitializer)) {
552+
return null;
553+
}
554+
546555
return context;
547556
}
548557

@@ -554,6 +563,7 @@ class TopLevelGetterItem extends TopLevelItem {
554563
id.write(sink);
555564
metadata.write(sink);
556565
returnType.write(sink);
566+
constInitializer.writeOptional(sink);
557567
}
558568
}
559569

@@ -665,3 +675,31 @@ enum _ManifestItemKind2 {
665675
instanceMethod,
666676
interfaceConstructor,
667677
}
678+
679+
extension _AstNodeExtension on AstNode {
680+
ManifestNode encode(EncodeContext context) {
681+
return ManifestNode.encode(context, this);
682+
}
683+
}
684+
685+
extension _GetterElementImplExtension on GetterElementImpl {
686+
Expression? get constInitializer {
687+
Expression? constInitializer;
688+
if (isSynthetic) {
689+
var variable = variable3!;
690+
if (variable.isConst) {
691+
constInitializer = variable.constantInitializer2?.expression;
692+
}
693+
}
694+
695+
// TODO(scheglov): support all expressions
696+
switch (constInitializer) {
697+
case IntegerLiteral():
698+
case SimpleIdentifier():
699+
break;
700+
default:
701+
constInitializer = null;
702+
}
703+
return constInitializer;
704+
}
705+
}

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

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9388,6 +9388,73 @@ class A {}
93889388
);
93899389
}
93909390

9391+
test_manifest_constInitializer_integerLiteral() async {
9392+
configuration.withElementManifests = true;
9393+
await _runLibraryManifestScenario(
9394+
initialCode: r'''
9395+
const a = 0;
9396+
''',
9397+
expectedInitialEvents: r'''
9398+
[operation] linkLibraryCycle SDK
9399+
[operation] linkLibraryCycle
9400+
package:test/test.dart
9401+
manifest
9402+
a: #M0
9403+
returnType: int @ dart:core
9404+
constInitializer: ManifestNodeIntegerLiteral
9405+
value: 0
9406+
''',
9407+
updatedCode: r'''
9408+
const a = 0;
9409+
const b = 1;
9410+
''',
9411+
expectedUpdatedEvents: r'''
9412+
[operation] linkLibraryCycle
9413+
package:test/test.dart
9414+
manifest
9415+
a: #M0
9416+
returnType: int @ dart:core
9417+
constInitializer: ManifestNodeIntegerLiteral
9418+
value: 0
9419+
b: #M1
9420+
returnType: int @ dart:core
9421+
constInitializer: ManifestNodeIntegerLiteral
9422+
value: 1
9423+
''',
9424+
);
9425+
}
9426+
9427+
test_manifest_constInitializer_integerLiteral_value() async {
9428+
configuration.withElementManifests = true;
9429+
await _runLibraryManifestScenario(
9430+
initialCode: r'''
9431+
const a = 0;
9432+
''',
9433+
expectedInitialEvents: r'''
9434+
[operation] linkLibraryCycle SDK
9435+
[operation] linkLibraryCycle
9436+
package:test/test.dart
9437+
manifest
9438+
a: #M0
9439+
returnType: int @ dart:core
9440+
constInitializer: ManifestNodeIntegerLiteral
9441+
value: 0
9442+
''',
9443+
updatedCode: r'''
9444+
const a = 1;
9445+
''',
9446+
expectedUpdatedEvents: r'''
9447+
[operation] linkLibraryCycle
9448+
package:test/test.dart
9449+
manifest
9450+
a: #M1
9451+
returnType: int @ dart:core
9452+
constInitializer: ManifestNodeIntegerLiteral
9453+
value: 1
9454+
''',
9455+
);
9456+
}
9457+
93919458
test_manifest_metadata() async {
93929459
await _runLibraryManifestScenario(
93939460
initialCode: r'''
@@ -10249,7 +10316,31 @@ final a = 1.2;
1024910316
);
1025010317
}
1025110318

10252-
test_manifest_topLevelVariable_initializer_value() async {
10319+
test_manifest_topLevelVariable_initializer_value_const() async {
10320+
await _runLibraryManifestScenario(
10321+
initialCode: r'''
10322+
const a = 0;
10323+
''',
10324+
expectedInitialEvents: r'''
10325+
[operation] linkLibraryCycle SDK
10326+
[operation] linkLibraryCycle
10327+
package:test/test.dart
10328+
manifest
10329+
a: #M0
10330+
''',
10331+
updatedCode: r'''
10332+
const a = 1;
10333+
''',
10334+
expectedUpdatedEvents: r'''
10335+
[operation] linkLibraryCycle
10336+
package:test/test.dart
10337+
manifest
10338+
a: #M1
10339+
''',
10340+
);
10341+
}
10342+
10343+
test_manifest_topLevelVariable_initializer_value_final() async {
1025310344
await _runLibraryManifestScenario(
1025410345
initialCode: r'''
1025510346
final a = 0;

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:analyzer/src/dart/analysis/results.dart';
1414
import 'package:analyzer/src/dart/analysis/status.dart';
1515
import 'package:analyzer/src/fine/library_manifest.dart';
1616
import 'package:analyzer/src/fine/lookup_name.dart';
17+
import 'package:analyzer/src/fine/manifest_ast.dart';
1718
import 'package:analyzer/src/fine/manifest_id.dart';
1819
import 'package:analyzer/src/fine/manifest_item.dart';
1920
import 'package:analyzer/src/fine/manifest_type.dart';
@@ -807,6 +808,25 @@ class LibraryManifestPrinter {
807808
}
808809
}
809810

811+
void _writeNode(String name, ManifestNode? node) {
812+
if (node != null) {
813+
sink.writeWithIndent('$name: ');
814+
switch (node) {
815+
case ManifestNodeAnnotation():
816+
// TODO(scheglov): Handle this case.
817+
throw UnimplementedError();
818+
case ManifestNodeIntegerLiteral():
819+
sink.writeln('ManifestNodeIntegerLiteral');
820+
sink.withIndent(() {
821+
sink.writelnWithIndent('value: ${node.value}');
822+
});
823+
case ManifestNodeSimpleIdentifier():
824+
// TODO(scheglov): Handle this case.
825+
throw UnimplementedError();
826+
}
827+
}
828+
}
829+
810830
void _writeTopLevelFunctionItem(TopLevelFunctionItem item) {
811831
if (configuration.withElementManifests) {
812832
sink.withIndent(() {
@@ -819,6 +839,7 @@ class LibraryManifestPrinter {
819839
if (configuration.withElementManifests) {
820840
sink.withIndent(() {
821841
_writeNamedType('returnType', item.returnType);
842+
_writeNode('constInitializer', item.constInitializer);
822843
});
823844
}
824845
}

0 commit comments

Comments
 (0)