[kernel] Start implementing verifier for serialization round trips

Change-Id: I907e92cf7b7f791a4bc64cac6739489d38d2c224
Reviewed-on: https://dart-review.googlesource.com/c/88322
Reviewed-by: Kevin Millikin <kmillikin@google.com>
diff --git a/pkg/kernel/lib/transformations/round_trip_verifier.dart b/pkg/kernel/lib/transformations/round_trip_verifier.dart
new file mode 100644
index 0000000..b239925
--- /dev/null
+++ b/pkg/kernel/lib/transformations/round_trip_verifier.dart
@@ -0,0 +1,738 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../ast.dart';
+
+import '../visitor.dart' show Visitor;
+
+abstract class RoundTripFailure {
+  /// [Uri] of the file containing the expression that produced an error during
+  /// the round trip.
+  final Uri uri;
+
+  /// Offset within the file with [uri] of the expression that produced an error
+  /// during the round trip.
+  final int offset;
+
+  RoundTripFailure(this.uri, this.offset);
+}
+
+class RoundTripSerializationFailure extends RoundTripFailure {
+  RoundTripSerializationFailure(Uri uri, int offset) : super(uri, offset);
+}
+
+class RoundTripDeserializationFailure extends RoundTripFailure {
+  RoundTripDeserializationFailure(Uri uri, int offset) : super(uri, offset);
+}
+
+class RoundTripMismatchFailure extends RoundTripFailure {
+  RoundTripMismatchFailure(Uri uri, int offset) : super(uri, offset);
+}
+
+class RoundTripVerifier implements Visitor<void> {
+  /// List of errors produced during round trips on the visited nodes.
+  final List<RoundTripFailure> errors = <RoundTripFailure>[];
+
+  RoundTripVerifier();
+
+  void makeExpressionRoundTrip(Expression node) {
+    throw new UnimplementedError("makeExpressionRoundTrip");
+  }
+
+  void makeDartTypeRoundTrip(DartType node) {
+    throw new UnimplementedError("makeDartTypeRoundTrip");
+  }
+
+  @override
+  void defaultExpression(Expression node) {
+    throw new UnsupportedError("defaultExpression");
+  }
+
+  @override
+  void defaultMemberReference(Member node) {
+    throw new UnsupportedError("defaultMemberReference");
+  }
+
+  @override
+  void defaultConstantReference(Constant node) {
+    throw new UnsupportedError("defaultConstantReference");
+  }
+
+  @override
+  void defaultConstant(Constant node) {
+    throw new UnsupportedError("defaultConstant");
+  }
+
+  @override
+  void defaultDartType(DartType node) {
+    throw new UnsupportedError("defaultDartType");
+  }
+
+  @override
+  void defaultTreeNode(TreeNode node) {
+    throw new UnsupportedError("defaultTreeNode");
+  }
+
+  @override
+  void defaultNode(Node node) {
+    throw new UnsupportedError("defaultNode");
+  }
+
+  @override
+  void defaultInitializer(Initializer node) {
+    throw new UnsupportedError("defaultInitializer");
+  }
+
+  @override
+  void defaultMember(Member node) {
+    throw new UnsupportedError("defaultMember");
+  }
+
+  @override
+  void defaultStatement(Statement node) {
+    throw new UnsupportedError("defaultStatement");
+  }
+
+  @override
+  void defaultBasicLiteral(BasicLiteral node) {
+    throw new UnsupportedError("defaultBasicLiteral");
+  }
+
+  @override
+  void visitNamedType(NamedType node) {
+    throw new UnimplementedError("visitNamedType");
+  }
+
+  @override
+  void visitSupertype(Supertype node) {
+    throw new UnimplementedError("visitSupertype");
+  }
+
+  @override
+  void visitName(Name node) {
+    throw new UnimplementedError("visitName");
+  }
+
+  @override
+  void visitRedirectingFactoryConstructorReference(
+      RedirectingFactoryConstructor node) {
+    throw new UnimplementedError("visitRedirectingFactoryConstructorReference");
+  }
+
+  @override
+  void visitProcedureReference(Procedure node) {
+    throw new UnimplementedError("visitProcedureReference");
+  }
+
+  @override
+  void visitConstructorReference(Constructor node) {
+    throw new UnimplementedError("visitConstructorReference");
+  }
+
+  @override
+  void visitFieldReference(Field node) {
+    throw new UnimplementedError("visitFieldReference");
+  }
+
+  @override
+  void visitTypeLiteralConstantReference(TypeLiteralConstant node) {
+    throw new UnimplementedError("visitTypeLiteralConstantReference");
+  }
+
+  @override
+  void visitTearOffConstantReference(TearOffConstant node) {
+    throw new UnimplementedError("visitTearOffConstantReference");
+  }
+
+  @override
+  void visitPartialInstantiationConstantReference(
+      PartialInstantiationConstant node) {
+    throw new UnimplementedError("visitPartialInstantiationConstantReference");
+  }
+
+  @override
+  void visitInstanceConstantReference(InstanceConstant node) {
+    throw new UnimplementedError("visitInstanceConstantReference");
+  }
+
+  @override
+  void visitListConstantReference(ListConstant node) {
+    throw new UnimplementedError("visitListConstantReference");
+  }
+
+  @override
+  void visitMapConstantReference(MapConstant node) {
+    throw new UnimplementedError("visitMapConstantReference");
+  }
+
+  @override
+  void visitSymbolConstantReference(SymbolConstant node) {
+    throw new UnimplementedError("visitSymbolConstantReference");
+  }
+
+  @override
+  void visitStringConstantReference(StringConstant node) {
+    throw new UnimplementedError("visitStringConstantReference");
+  }
+
+  @override
+  void visitDoubleConstantReference(DoubleConstant node) {
+    throw new UnimplementedError("visitDoubleConstantReference");
+  }
+
+  @override
+  void visitIntConstantReference(IntConstant node) {
+    throw new UnimplementedError("visitIntConstantReference");
+  }
+
+  @override
+  void visitBoolConstantReference(BoolConstant node) {
+    throw new UnimplementedError("visitBoolConstantReference");
+  }
+
+  @override
+  void visitNullConstantReference(NullConstant node) {
+    throw new UnimplementedError("visitNullConstantReference");
+  }
+
+  @override
+  void visitTypedefReference(Typedef node) {
+    throw new UnimplementedError("visitTypedefReference");
+  }
+
+  @override
+  void visitClassReference(Class node) {
+    throw new UnimplementedError("visitClassReference");
+  }
+
+  @override
+  void visitTypeLiteralConstant(TypeLiteralConstant node) {
+    throw new UnimplementedError("visitTypeLiteralConstant");
+  }
+
+  @override
+  void visitTearOffConstant(TearOffConstant node) {
+    throw new UnimplementedError("visitTearOffConstant");
+  }
+
+  @override
+  void visitPartialInstantiationConstant(PartialInstantiationConstant node) {
+    throw new UnimplementedError("visitPartialInstantiationConstant");
+  }
+
+  @override
+  void visitInstanceConstant(InstanceConstant node) {
+    throw new UnimplementedError("visitInstanceConstant");
+  }
+
+  @override
+  void visitListConstant(ListConstant node) {
+    throw new UnimplementedError("visitListConstant");
+  }
+
+  @override
+  void visitMapConstant(MapConstant node) {
+    throw new UnimplementedError("visitMapConstant");
+  }
+
+  @override
+  void visitSymbolConstant(SymbolConstant node) {
+    throw new UnimplementedError("visitSymbolConstant");
+  }
+
+  @override
+  void visitStringConstant(StringConstant node) {
+    throw new UnimplementedError("visitStringConstant");
+  }
+
+  @override
+  void visitDoubleConstant(DoubleConstant node) {
+    throw new UnimplementedError("visitDoubleConstant");
+  }
+
+  @override
+  void visitIntConstant(IntConstant node) {
+    throw new UnimplementedError("visitIntConstant");
+  }
+
+  @override
+  void visitBoolConstant(BoolConstant node) {
+    throw new UnimplementedError("visitBoolConstant");
+  }
+
+  @override
+  void visitNullConstant(NullConstant node) {
+    throw new UnimplementedError("visitNullConstant");
+  }
+
+  @override
+  void visitTypedefType(TypedefType node) {
+    throw new UnimplementedError("visitTypedefType");
+  }
+
+  @override
+  void visitTypeParameterType(TypeParameterType node) {
+    throw new UnimplementedError("visitTypeParameterType");
+  }
+
+  @override
+  void visitFunctionType(FunctionType node) {
+    throw new UnimplementedError("visitFunctionType");
+  }
+
+  @override
+  void visitInterfaceType(InterfaceType node) {
+    throw new UnimplementedError("visitInterfaceType");
+  }
+
+  @override
+  void visitBottomType(BottomType node) {
+    throw new UnimplementedError("visitBottomType");
+  }
+
+  @override
+  void visitVoidType(VoidType node) {
+    throw new UnimplementedError("visitVoidType");
+  }
+
+  @override
+  void visitDynamicType(DynamicType node) {
+    throw new UnimplementedError("visitDynamicType");
+  }
+
+  @override
+  void visitInvalidType(InvalidType node) {
+    throw new UnimplementedError("visitInvalidType");
+  }
+
+  @override
+  void visitComponent(Component node) {
+    throw new UnimplementedError("visitComponent");
+  }
+
+  @override
+  void visitMapEntry(MapEntry node) {
+    throw new UnimplementedError("visitMapEntry");
+  }
+
+  @override
+  void visitCatch(Catch node) {
+    throw new UnimplementedError("visitCatch");
+  }
+
+  @override
+  void visitSwitchCase(SwitchCase node) {
+    throw new UnimplementedError("visitSwitchCase");
+  }
+
+  @override
+  void visitNamedExpression(NamedExpression node) {
+    throw new UnimplementedError("visitNamedExpression");
+  }
+
+  @override
+  void visitArguments(Arguments node) {
+    throw new UnimplementedError("visitArguments");
+  }
+
+  @override
+  void visitFunctionNode(FunctionNode node) {
+    throw new UnimplementedError("visitFunctionNode");
+  }
+
+  @override
+  void visitTypeParameter(TypeParameter node) {
+    throw new UnimplementedError("visitTypeParameter");
+  }
+
+  @override
+  void visitTypedef(Typedef node) {
+    throw new UnimplementedError("visitTypedef");
+  }
+
+  @override
+  void visitLibraryPart(LibraryPart node) {
+    throw new UnimplementedError("visitLibraryPart");
+  }
+
+  @override
+  void visitCombinator(Combinator node) {
+    throw new UnimplementedError("visitCombinator");
+  }
+
+  @override
+  void visitLibraryDependency(LibraryDependency node) {
+    throw new UnimplementedError("visitLibraryDependency");
+  }
+
+  @override
+  void visitLibrary(Library node) {
+    throw new UnimplementedError("visitLibrary");
+  }
+
+  @override
+  void visitAssertInitializer(AssertInitializer node) {
+    throw new UnimplementedError("visitAssertInitializer");
+  }
+
+  @override
+  void visitLocalInitializer(LocalInitializer node) {
+    throw new UnimplementedError("visitLocalInitializer");
+  }
+
+  @override
+  void visitRedirectingInitializer(RedirectingInitializer node) {
+    throw new UnimplementedError("visitRedirectingInitializer");
+  }
+
+  @override
+  void visitSuperInitializer(SuperInitializer node) {
+    throw new UnimplementedError("visitSuperInitializer");
+  }
+
+  @override
+  void visitFieldInitializer(FieldInitializer node) {
+    throw new UnimplementedError("visitFieldInitializer");
+  }
+
+  @override
+  void visitInvalidInitializer(InvalidInitializer node) {
+    throw new UnimplementedError("visitInvalidInitializer");
+  }
+
+  @override
+  void visitClass(Class node) {
+    throw new UnimplementedError("visitClass");
+  }
+
+  @override
+  void visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
+    throw new UnimplementedError("visitRedirectingFactoryConstructor");
+  }
+
+  @override
+  void visitField(Field node) {
+    throw new UnimplementedError("visitField");
+  }
+
+  @override
+  void visitProcedure(Procedure node) {
+    throw new UnimplementedError("visitProcedure");
+  }
+
+  @override
+  void visitConstructor(Constructor node) {
+    throw new UnimplementedError("visitConstructor");
+  }
+
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    throw new UnimplementedError("visitFunctionDeclaration");
+  }
+
+  @override
+  void visitVariableDeclaration(VariableDeclaration node) {
+    throw new UnimplementedError("visitVariableDeclaration");
+  }
+
+  @override
+  void visitYieldStatement(YieldStatement node) {
+    throw new UnimplementedError("visitYieldStatement");
+  }
+
+  @override
+  void visitTryFinally(TryFinally node) {
+    throw new UnimplementedError("visitTryFinally");
+  }
+
+  @override
+  void visitTryCatch(TryCatch node) {
+    throw new UnimplementedError("visitTryCatch");
+  }
+
+  @override
+  void visitReturnStatement(ReturnStatement node) {
+    throw new UnimplementedError("visitReturnStatement");
+  }
+
+  @override
+  void visitIfStatement(IfStatement node) {
+    throw new UnimplementedError("visitIfStatement");
+  }
+
+  @override
+  void visitContinueSwitchStatement(ContinueSwitchStatement node) {
+    throw new UnimplementedError("visitContinueSwitchStatement");
+  }
+
+  @override
+  void visitSwitchStatement(SwitchStatement node) {
+    throw new UnimplementedError("visitSwitchStatement");
+  }
+
+  @override
+  void visitForInStatement(ForInStatement node) {
+    throw new UnimplementedError("visitForInStatement");
+  }
+
+  @override
+  void visitForStatement(ForStatement node) {
+    throw new UnimplementedError("visitForStatement");
+  }
+
+  @override
+  void visitDoStatement(DoStatement node) {
+    throw new UnimplementedError("visitDoStatement");
+  }
+
+  @override
+  void visitWhileStatement(WhileStatement node) {
+    throw new UnimplementedError("visitWhileStatement");
+  }
+
+  @override
+  void visitBreakStatement(BreakStatement node) {
+    throw new UnimplementedError("visitBreakStatement");
+  }
+
+  @override
+  void visitLabeledStatement(LabeledStatement node) {
+    throw new UnimplementedError("visitLabeledStatement");
+  }
+
+  @override
+  void visitAssertStatement(AssertStatement node) {
+    throw new UnimplementedError("visitAssertStatement");
+  }
+
+  @override
+  void visitEmptyStatement(EmptyStatement node) {
+    throw new UnimplementedError("visitEmptyStatement");
+  }
+
+  @override
+  void visitAssertBlock(AssertBlock node) {
+    throw new UnimplementedError("visitAssertBlock");
+  }
+
+  @override
+  void visitBlock(Block node) {
+    throw new UnimplementedError("visitBlock");
+  }
+
+  @override
+  void visitExpressionStatement(ExpressionStatement node) {
+    throw new UnimplementedError("visitExpressionStatement");
+  }
+
+  @override
+  void visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+    throw new UnimplementedError("visitCheckLibraryIsLoaded");
+  }
+
+  @override
+  void visitLoadLibrary(LoadLibrary node) {
+    throw new UnimplementedError("visitLoadLibrary");
+  }
+
+  @override
+  void visitInstantiation(Instantiation node) {
+    throw new UnimplementedError("visitInstantiation");
+  }
+
+  @override
+  void visitLet(Let node) {
+    throw new UnimplementedError("visitLet");
+  }
+
+  @override
+  void visitNullLiteral(NullLiteral node) {
+    throw new UnimplementedError("visitNullLiteral");
+  }
+
+  @override
+  void visitBoolLiteral(BoolLiteral node) {
+    throw new UnimplementedError("visitBoolLiteral");
+  }
+
+  @override
+  void visitDoubleLiteral(DoubleLiteral node) {
+    throw new UnimplementedError("visitDoubleLiteral");
+  }
+
+  @override
+  void visitIntLiteral(IntLiteral node) {
+    throw new UnimplementedError("visitIntLiteral");
+  }
+
+  @override
+  void visitStringLiteral(StringLiteral node) {
+    throw new UnimplementedError("visitStringLiteral");
+  }
+
+  @override
+  void visitConstantExpression(ConstantExpression node) {
+    throw new UnimplementedError("visitConstantExpression");
+  }
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    throw new UnimplementedError("visitFunctionExpression");
+  }
+
+  @override
+  void visitAwaitExpression(AwaitExpression node) {
+    throw new UnimplementedError("visitAwaitExpression");
+  }
+
+  @override
+  void visitMapLiteral(MapLiteral node) {
+    throw new UnimplementedError("visitMapLiteral");
+  }
+
+  @override
+  void visitSetLiteral(SetLiteral node) {
+    throw new UnimplementedError("visitSetLiteral");
+  }
+
+  @override
+  void visitListLiteral(ListLiteral node) {
+    throw new UnimplementedError("visitListLiteral");
+  }
+
+  @override
+  void visitThrow(Throw node) {
+    throw new UnimplementedError("visitThrow");
+  }
+
+  @override
+  void visitRethrow(Rethrow node) {
+    throw new UnimplementedError("visitRethrow");
+  }
+
+  @override
+  void visitThisExpression(ThisExpression node) {
+    throw new UnimplementedError("visitThisExpression");
+  }
+
+  @override
+  void visitTypeLiteral(TypeLiteral node) {
+    throw new UnimplementedError("visitTypeLiteral");
+  }
+
+  @override
+  void visitSymbolLiteral(SymbolLiteral node) {
+    throw new UnimplementedError("visitSymbolLiteral");
+  }
+
+  @override
+  void visitAsExpression(AsExpression node) {
+    throw new UnimplementedError("visitAsExpression");
+  }
+
+  @override
+  void visitIsExpression(IsExpression node) {
+    throw new UnimplementedError("visitIsExpression");
+  }
+
+  @override
+  void visitStringConcatenation(StringConcatenation node) {
+    throw new UnimplementedError("visitStringConcatenation");
+  }
+
+  @override
+  void visitConditionalExpression(ConditionalExpression node) {
+    throw new UnimplementedError("visitConditionalExpression");
+  }
+
+  @override
+  void visitLogicalExpression(LogicalExpression node) {
+    throw new UnimplementedError("visitLogicalExpression");
+  }
+
+  @override
+  void visitNot(Not node) {
+    throw new UnimplementedError("visitNot");
+  }
+
+  @override
+  void visitConstructorInvocation(ConstructorInvocation node) {
+    throw new UnimplementedError("visitConstructorInvocation");
+  }
+
+  @override
+  void visitStaticInvocation(StaticInvocation node) {
+    throw new UnimplementedError("visitStaticInvocation");
+  }
+
+  @override
+  void visitSuperMethodInvocation(SuperMethodInvocation node) {
+    throw new UnimplementedError("visitSuperMethodInvocation");
+  }
+
+  @override
+  void visitDirectMethodInvocation(DirectMethodInvocation node) {
+    throw new UnimplementedError("visitDirectMethodInvocation");
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    throw new UnimplementedError("visitMethodInvocation");
+  }
+
+  @override
+  void visitStaticSet(StaticSet node) {
+    throw new UnimplementedError("visitStaticSet");
+  }
+
+  @override
+  void visitStaticGet(StaticGet node) {
+    throw new UnimplementedError("visitStaticGet");
+  }
+
+  @override
+  void visitSuperPropertySet(SuperPropertySet node) {
+    throw new UnimplementedError("visitSuperPropertySet");
+  }
+
+  @override
+  void visitSuperPropertyGet(SuperPropertyGet node) {
+    throw new UnimplementedError("visitSuperPropertyGet");
+  }
+
+  @override
+  void visitDirectPropertySet(DirectPropertySet node) {
+    throw new UnimplementedError("visitDirectPropertySet");
+  }
+
+  @override
+  void visitDirectPropertyGet(DirectPropertyGet node) {
+    throw new UnimplementedError("visitDirectPropertyGet");
+  }
+
+  @override
+  void visitPropertySet(PropertySet node) {
+    throw new UnimplementedError("visitPropertySet");
+  }
+
+  @override
+  void visitPropertyGet(PropertyGet node) {
+    throw new UnimplementedError("visitPropertyGet");
+  }
+
+  @override
+  void visitVariableSet(VariableSet node) {
+    throw new UnimplementedError("visitVariableSet");
+  }
+
+  @override
+  void visitVariableGet(VariableGet node) {
+    throw new UnimplementedError("visitVariableGet");
+  }
+
+  @override
+  void visitInvalidExpression(InvalidExpression node) {
+    throw new UnimplementedError("visitInvalidExpression");
+  }
+}