Skip to content

Commit 99b693b

Browse files
Dmitry Stefantsovcommit-bot@chromium.org
authored andcommitted
[cfe] Add support for constructor initializers to text serialization
Change-Id: I1a311978460bee2f554a3bddbaf329698d1d33c4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/153779 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Dmitry Stefantsov <[email protected]>
1 parent d5664c3 commit 99b693b

File tree

2 files changed

+63
-6
lines changed

2 files changed

+63
-6
lines changed

pkg/kernel/lib/text/text_serialization_verifier.dart

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -328,21 +328,15 @@ class VerificationState {
328328
node is FunctionNode && node.body == null ||
329329
node is Procedure &&
330330
(!node.isStatic || node.kind != ProcedureKind.Method) ||
331-
node is AssertInitializer ||
332331
node is Class ||
333332
node is Component ||
334333
node is Constructor ||
335334
node is Extension ||
336-
node is FieldInitializer ||
337-
node is InvalidInitializer ||
338335
node is Library ||
339336
node is LibraryPart ||
340-
node is LocalInitializer ||
341337
node is MapEntry ||
342338
node is Name && node.isPrivate ||
343339
node is RedirectingFactoryConstructor ||
344-
node is RedirectingInitializer ||
345-
node is SuperInitializer ||
346340
node is Supertype ||
347341
node is Typedef;
348342
}
@@ -489,6 +483,8 @@ class TextSerializationVerifier extends RecursiveVisitor<void> {
489483
makeRoundTrip<Catch>(node, catchSerializer);
490484
} else if (node is SwitchCase) {
491485
makeRoundTrip<SwitchCase>(node, switchCaseSerializer);
486+
} else if (node is Initializer) {
487+
makeRoundTrip<Initializer>(node, initializerSerializer);
492488
} else {
493489
throw new StateError(
494490
"Don't know how to make a round trip for a supported node "

pkg/kernel/lib/text/text_serializer.dart

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,6 +1826,59 @@ TextSerializer<InstanceConstant> instanceConstantSerializer =
18261826

18271827
Case<Constant> constantSerializer = Case.uninitialized(ConstantTagger());
18281828

1829+
class InitializerTagger implements Tagger<Initializer> {
1830+
const InitializerTagger();
1831+
1832+
String tag(Initializer node) {
1833+
if (node is AssertInitializer) {
1834+
return "assert";
1835+
} else if (node is FieldInitializer) {
1836+
return "field";
1837+
} else if (node is InvalidInitializer) {
1838+
return "invalid";
1839+
} else if (node is LocalInitializer) {
1840+
return "local";
1841+
} else if (node is RedirectingInitializer) {
1842+
return "redirecting";
1843+
} else if (node is SuperInitializer) {
1844+
return "super";
1845+
} else {
1846+
throw UnimplementedError("InitializerTagger.tag(${node.runtimeType}).");
1847+
}
1848+
}
1849+
}
1850+
1851+
TextSerializer<AssertInitializer> assertInitializerSerializer = Wrapped(
1852+
(w) => w.statement, (u) => AssertInitializer(u), statementSerializer);
1853+
1854+
TextSerializer<FieldInitializer> fieldInitializerSerializer = Wrapped(
1855+
(w) => Tuple2(w.fieldReference.canonicalName, w.value),
1856+
(u) => FieldInitializer.byReference(u.first.getReference(), u.second),
1857+
Tuple2Serializer(CanonicalNameSerializer(), expressionSerializer));
1858+
1859+
TextSerializer<InvalidInitializer> invalidInitializerSerializer =
1860+
Wrapped((_) => null, (_) => InvalidInitializer(), Nothing());
1861+
1862+
TextSerializer<LocalInitializer> localInitializerSerializer = Wrapped(
1863+
(w) => w.variable,
1864+
(u) => LocalInitializer(u),
1865+
variableDeclarationSerializer);
1866+
1867+
TextSerializer<RedirectingInitializer> redirectingInitializerSerializer =
1868+
Wrapped(
1869+
(w) => Tuple2(w.targetReference.canonicalName, w.arguments),
1870+
(u) => RedirectingInitializer.byReference(
1871+
u.first.getReference(), u.second),
1872+
Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer));
1873+
1874+
TextSerializer<SuperInitializer> superInitializerSerializer = Wrapped(
1875+
(w) => Tuple2(w.targetReference.canonicalName, w.arguments),
1876+
(u) => SuperInitializer.byReference(u.first.getReference(), u.second),
1877+
Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer));
1878+
1879+
Case<Initializer> initializerSerializer =
1880+
Case.uninitialized(InitializerTagger());
1881+
18291882
void initializeSerializers() {
18301883
expressionSerializer.registerTags({
18311884
"string": stringLiteralSerializer,
@@ -1950,4 +2003,12 @@ void initializeSerializers() {
19502003
"const-expr": unevaluatedConstantSerializer,
19512004
"const-object": instanceConstantSerializer,
19522005
});
2006+
initializerSerializer.registerTags({
2007+
"assert": assertInitializerSerializer,
2008+
"field": fieldInitializerSerializer,
2009+
"invalid": invalidInitializerSerializer,
2010+
"local": localInitializerSerializer,
2011+
"redirecting": redirectingInitializerSerializer,
2012+
"super": superInitializerSerializer,
2013+
});
19532014
}

0 commit comments

Comments
 (0)