diff --git a/pkg/front_end/test/fasta/expression_suite.dart b/pkg/front_end/test/fasta/expression_suite.dart
index 520e7e1..8ada32c 100644
--- a/pkg/front_end/test/fasta/expression_suite.dart
+++ b/pkg/front_end/test/fasta/expression_suite.dart
@@ -4,8 +4,6 @@
 
 library fasta.test.expression_test;
 
-import "dart:convert" show JsonEncoder;
-
 import "dart:io" show File, IOSink;
 
 import 'dart:typed_data' show Uint8List;
@@ -60,8 +58,6 @@
 
 import '../utils/kernel_chain.dart' show runDiff, openWrite;
 
-const JsonEncoder json = const JsonEncoder.withIndent("  ");
-
 class Context extends ChainContext {
   final CompilerContext compilerContext;
   final List<DiagnosticMessage> errors;
@@ -104,7 +100,7 @@
   String printResult(Uri entryPoint, Context context) {
     StringBuffer buffer = new StringBuffer();
     buffer.write("Errors: {\n");
-    for (var error in errors) {
+    for (DiagnosticMessage error in errors) {
       for (String message in error.plainTextFormatted) {
         for (String line in splitLines(message)) {
           buffer.write("  ");
@@ -219,11 +215,13 @@
   @override
   Future<Result<Null>> run(List<TestCase> tests, Context context) async {
     String actual = "";
-    for (var test in tests) {
-      var primary = test.results.first.printResult(test.entryPoint!, context);
+    for (TestCase test in tests) {
+      String primary =
+          test.results.first.printResult(test.entryPoint!, context);
       actual += primary;
       for (int i = 1; i < test.results.length; ++i) {
-        var secondary = test.results[i].printResult(test.entryPoint!, context);
+        String secondary =
+            test.results[i].printResult(test.entryPoint!, context);
         if (primary != secondary) {
           return fail(
               null,
@@ -233,7 +231,7 @@
         }
       }
     }
-    var test = tests.first;
+    TestCase test = tests.first;
     Uri testUri = test.description.uri;
     File expectedFile = new File("${testUri.toFilePath()}$suffix");
     if (await expectedFile.exists()) {
@@ -292,9 +290,8 @@
 
     final List<TestCase> tests = [];
     for (YamlMap map in maps) {
-      for (var _key in map.keys) {
-        String key = _key;
-        var value = map[key];
+      for (String key in map.keys) {
+        dynamic value = map[key];
 
         if (key == "entry_point") {
           entryPoint = description.uri.resolveUri(Uri.parse(value as String));
@@ -326,7 +323,7 @@
           expression = value;
         }
       }
-      var test = new TestCase(
+      TestCase test = new TestCase(
           description,
           entryPoint,
           import,
@@ -340,7 +337,7 @@
           className,
           methodName,
           expression);
-      var result = test.validate();
+      String? result = test.validate();
       if (result != null) {
         return new Result.fail(tests, result);
       }
@@ -359,9 +356,9 @@
   // Compile [test.expression], update [test.errors] with results.
   // As a side effect - verify that generated procedure can be serialized.
   Future<void> compileExpression(TestCase test, IncrementalCompiler compiler,
-      IncrementalCompilerResult sourceCompilerResult, Context context) async {
+      IncrementalCompilerResult compilerResult, Context context) async {
     Map<String, DartType>? definitions = createDefinitionsWithTypes(
-        sourceCompilerResult.classHierarchy?.knownLibraries,
+        compilerResult.classHierarchy?.knownLibraries,
         test.definitionTypes,
         test.definitions);
 
@@ -372,7 +369,7 @@
       }
     }
     List<TypeParameter>? typeParams = createTypeParametersWithBounds(
-        sourceCompilerResult.classHierarchy?.knownLibraries,
+        compilerResult.classHierarchy?.knownLibraries,
         test.typeBounds,
         test.typeDefaults,
         test.typeDefinitions);
@@ -398,7 +395,7 @@
     test.results.add(new CompilationResult(compiledProcedure, errors));
     if (compiledProcedure != null) {
       // Confirm we can serialize generated procedure.
-      sourceCompilerResult.component.computeCanonicalNames();
+      compilerResult.component.computeCanonicalNames();
       List<int> list = serializeProcedure(compiledProcedure);
       assert(list.length > 0);
     }
@@ -407,7 +404,7 @@
   @override
   Future<Result<List<TestCase>>> run(
       List<TestCase> tests, Context context) async {
-    for (var test in tests) {
+    for (TestCase test in tests) {
       context.fileSystem.entityForUri(test.entryPoint!).writeAsBytesSync(
           await new File.fromUri(test.entryPoint!).readAsBytes());
 
@@ -421,7 +418,7 @@
       IncrementalCompilerResult sourceCompilerResult =
           await sourceCompiler.computeDelta(entryPoints: [test.entryPoint!]);
       Component component = sourceCompilerResult.component;
-      var errors = context.takeErrors();
+      List<DiagnosticMessage> errors = context.takeErrors();
       if (!errors.isEmpty) {
         return fail(
             tests,
diff --git a/tools/VERSION b/tools/VERSION
index 7c42271..02fd046 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 76
+PRERELEASE 77
 PRERELEASE_PATCH 0
\ No newline at end of file
