diff --git a/pkg/kernel/lib/text/text_serialization_verifier.dart b/pkg/kernel/lib/text/text_serialization_verifier.dart index 747920efc067..581c7ef0ed87 100644 --- a/pkg/kernel/lib/text/text_serialization_verifier.dart +++ b/pkg/kernel/lib/text/text_serialization_verifier.dart @@ -328,21 +328,15 @@ class VerificationState { node is FunctionNode && node.body == null || node is Procedure && (!node.isStatic || node.kind != ProcedureKind.Method) || - node is AssertInitializer || node is Class || node is Component || node is Constructor || node is Extension || - node is FieldInitializer || - node is InvalidInitializer || node is Library || node is LibraryPart || - node is LocalInitializer || node is MapEntry || node is Name && node.isPrivate || node is RedirectingFactoryConstructor || - node is RedirectingInitializer || - node is SuperInitializer || node is Supertype || node is Typedef; } @@ -489,6 +483,8 @@ class TextSerializationVerifier extends RecursiveVisitor { makeRoundTrip(node, catchSerializer); } else if (node is SwitchCase) { makeRoundTrip(node, switchCaseSerializer); + } else if (node is Initializer) { + makeRoundTrip(node, initializerSerializer); } else { throw new StateError( "Don't know how to make a round trip for a supported node " diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart index 4514bf79068b..cba55cb05377 100644 --- a/pkg/kernel/lib/text/text_serializer.dart +++ b/pkg/kernel/lib/text/text_serializer.dart @@ -1826,6 +1826,59 @@ TextSerializer instanceConstantSerializer = Case constantSerializer = Case.uninitialized(ConstantTagger()); +class InitializerTagger implements Tagger { + const InitializerTagger(); + + String tag(Initializer node) { + if (node is AssertInitializer) { + return "assert"; + } else if (node is FieldInitializer) { + return "field"; + } else if (node is InvalidInitializer) { + return "invalid"; + } else if (node is LocalInitializer) { + return "local"; + } else if (node is RedirectingInitializer) { + return "redirecting"; + } else if (node is SuperInitializer) { + return "super"; + } else { + throw UnimplementedError("InitializerTagger.tag(${node.runtimeType})."); + } + } +} + +TextSerializer assertInitializerSerializer = Wrapped( + (w) => w.statement, (u) => AssertInitializer(u), statementSerializer); + +TextSerializer fieldInitializerSerializer = Wrapped( + (w) => Tuple2(w.fieldReference.canonicalName, w.value), + (u) => FieldInitializer.byReference(u.first.getReference(), u.second), + Tuple2Serializer(CanonicalNameSerializer(), expressionSerializer)); + +TextSerializer invalidInitializerSerializer = + Wrapped((_) => null, (_) => InvalidInitializer(), Nothing()); + +TextSerializer localInitializerSerializer = Wrapped( + (w) => w.variable, + (u) => LocalInitializer(u), + variableDeclarationSerializer); + +TextSerializer redirectingInitializerSerializer = + Wrapped( + (w) => Tuple2(w.targetReference.canonicalName, w.arguments), + (u) => RedirectingInitializer.byReference( + u.first.getReference(), u.second), + Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer)); + +TextSerializer superInitializerSerializer = Wrapped( + (w) => Tuple2(w.targetReference.canonicalName, w.arguments), + (u) => SuperInitializer.byReference(u.first.getReference(), u.second), + Tuple2Serializer(CanonicalNameSerializer(), argumentsSerializer)); + +Case initializerSerializer = + Case.uninitialized(InitializerTagger()); + void initializeSerializers() { expressionSerializer.registerTags({ "string": stringLiteralSerializer, @@ -1950,4 +2003,12 @@ void initializeSerializers() { "const-expr": unevaluatedConstantSerializer, "const-object": instanceConstantSerializer, }); + initializerSerializer.registerTags({ + "assert": assertInitializerSerializer, + "field": fieldInitializerSerializer, + "invalid": invalidInitializerSerializer, + "local": localInitializerSerializer, + "redirecting": redirectingInitializerSerializer, + "super": superInitializerSerializer, + }); }