[CFE/VM] Make IncrementalCompilerResult classHierarchy, coreTypes non-nullable; always use latest

This also fixes a potential leak on missing .accept call where using the
non-latest coreTypes in the VM causes us to hold on to old libraries.

Tested: CI
Change-Id: I3a4a25dab83de0d5113b9f08ec745ac181c24b9b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/411580
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
diff --git a/pkg/dev_compiler/lib/src/command/command.dart b/pkg/dev_compiler/lib/src/command/command.dart
index e9bab19..7ffc832 100644
--- a/pkg/dev_compiler/lib/src/command/command.dart
+++ b/pkg/dev_compiler/lib/src/command/command.dart
@@ -349,7 +349,7 @@
         incrementalCompilerResult.component,
         cachedSdkInput?.component,
         doneAdditionalDills,
-        incrementalCompilerResult.classHierarchy!,
+        incrementalCompilerResult.classHierarchy,
         incrementalCompilerResult.neededDillLibraries);
   }
   compilerState.options.onDiagnostic = null; // See http://dartbug.com/36983.
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
index 634ddc0..9313ef3 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
@@ -461,7 +461,7 @@
     if (errors.isNotEmpty) return null;
 
     var coreTypes = incrementalCompilerResult.coreTypes;
-    var hierarchy = incrementalCompilerResult.classHierarchy!;
+    var hierarchy = incrementalCompilerResult.classHierarchy;
 
     var kernel2jsCompiler = ProgramCompiler(
       finalComponent,
diff --git a/pkg/dev_compiler/test/expression_compiler/test_compiler.dart b/pkg/dev_compiler/test/expression_compiler/test_compiler.dart
index 08a4d54..209330e 100644
--- a/pkg/dev_compiler/test/expression_compiler/test_compiler.dart
+++ b/pkg/dev_compiler/test/expression_compiler/test_compiler.dart
@@ -60,7 +60,7 @@
     // Initialize DDC.
     var moduleName = p.basenameWithoutExtension(output.toFilePath());
 
-    var classHierarchy = compilerResult.classHierarchy!;
+    var classHierarchy = compilerResult.classHierarchy;
     var compilerOptions = Options(
       replCompile: true,
       moduleName: moduleName,
diff --git a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
index 7a3153a..6dfb9ab 100644
--- a/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
+++ b/pkg/dev_compiler/test/module_symbols/module_symbols_test_shared.dart
@@ -33,7 +33,7 @@
 
     // Initialize DDC.
     var moduleName = 'foo.dart';
-    var classHierarchy = compilerResult.classHierarchy!;
+    var classHierarchy = compilerResult.classHierarchy;
     var compilerOptions = Options(
         replCompile: true,
         moduleName: moduleName,
diff --git a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
index 6937e52..af317af 100644
--- a/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/incremental_kernel_generator.dart
@@ -146,10 +146,12 @@
 
 class IncrementalCompilerResult {
   final Component component;
-  final ClassHierarchy? classHierarchy;
-  final CoreTypes? coreTypes;
+  final ClassHierarchy classHierarchy;
+  final CoreTypes coreTypes;
   final Set<Library>? neededDillLibraries;
 
   IncrementalCompilerResult(this.component,
-      {this.classHierarchy, this.coreTypes, this.neededDillLibraries});
+      {required this.classHierarchy,
+      required this.coreTypes,
+      this.neededDillLibraries});
 }
diff --git a/pkg/front_end/test/ast_nodes_has_to_string_test.dart b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
index 43d7979..5e4ebbd 100644
--- a/pkg/front_end/test/ast_nodes_has_to_string_test.dart
+++ b/pkg/front_end/test/ast_nodes_has_to_string_test.dart
@@ -29,7 +29,7 @@
             /*Uri initializeFrom*/ null, /*bool outlineOnly*/ true);
     IncrementalCompilerResult compilerResult = await compiler.computeDelta();
     c = compilerResult.component;
-    classHierarchy = compilerResult.classHierarchy!;
+    classHierarchy = compilerResult.classHierarchy;
     List<Library> libraries = c.libraries
         .where((Library lib) =>
             (lib.importUri.toString() == "package:kernel/ast.dart"))
diff --git a/pkg/front_end/test/expression_suite.dart b/pkg/front_end/test/expression_suite.dart
index 69fd5e0..4e6eb4f 100644
--- a/pkg/front_end/test/expression_suite.dart
+++ b/pkg/front_end/test/expression_suite.dart
@@ -417,7 +417,7 @@
       IncrementalCompilerResult compilerResult,
       Context context) async {
     Map<String, DartType>? definitions = createDefinitionsWithTypes(
-        compilerResult.classHierarchy?.knownLibraries,
+        compilerResult.classHierarchy.knownLibraries,
         test.definitionTypes,
         test.definitions);
 
@@ -428,7 +428,7 @@
       }
     }
     List<TypeParameter>? typeParams = createTypeParametersWithBounds(
-        compilerResult.classHierarchy?.knownLibraries,
+        compilerResult.classHierarchy.knownLibraries,
         test.typeBounds,
         test.typeDefaults,
         test.typeDefinitions);
@@ -471,7 +471,7 @@
       IncrementalCompiler compilerNoNNBD,
       IncrementalCompilerResult compilerResult,
       Context context) async {
-    for (Library lib in compilerResult.classHierarchy!.knownLibraries) {
+    for (Library lib in compilerResult.classHierarchy.knownLibraries) {
       if (!context.fuzzedLibraries.add(lib.importUri)) continue;
 
       for (Member m in lib.members) {
diff --git a/pkg/frontend_server/test/frontend_server_test.dart b/pkg/frontend_server/test/frontend_server_test.dart
index ddd8d88..1e1d4ca 100644
--- a/pkg/frontend_server/test/frontend_server_test.dart
+++ b/pkg/frontend_server/test/frontend_server_test.dart
@@ -17,6 +17,8 @@
 import 'package:frontend_server/starter.dart';
 import 'package:kernel/ast.dart' show Component, Library;
 import 'package:kernel/binary/ast_to_binary.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart' show loadComponentFromBinary;
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/verifier.dart' show VerificationStage, verifyComponent;
@@ -111,8 +113,12 @@
 
   @override
   Future<IncrementalCompilerResult> compile({List<Uri>? entryPoints}) async {
+    Component component = new Component();
+    CoreTypes coreTypes = new CoreTypes(component);
+    ClassHierarchy classHierarchy = new ClassHierarchy(component, coreTypes);
     return new Future<IncrementalCompilerResult>.value(
-        new IncrementalCompilerResult(new Component()));
+        new IncrementalCompilerResult(component,
+            coreTypes: coreTypes, classHierarchy: classHierarchy));
   }
 
   @override
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index a1405cc..7b7f98f 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -97,20 +97,19 @@
   }
 
   IncrementalCompilerResult _combinePendingDeltas(bool includePlatform) {
+    assert(_pendingDeltas.isNotEmpty);
     Procedure? mainMethod;
     NonNullableByDefaultCompiledMode compilationMode =
         NonNullableByDefaultCompiledMode.Invalid;
     Map<Uri, Library> combined = <Uri, Library>{};
     Map<Uri, Source> uriToSource = new Map<Uri, Source>();
-    ClassHierarchy? classHierarchy;
-    CoreTypes? coreTypes;
+    ClassHierarchy classHierarchy = _pendingDeltas.last.classHierarchy;
+    CoreTypes coreTypes = _pendingDeltas.last.coreTypes;
     for (IncrementalCompilerResult deltaResult in _pendingDeltas) {
       Component delta = deltaResult.component;
       if (delta.mainMethod != null) {
         mainMethod = delta.mainMethod;
       }
-      classHierarchy ??= deltaResult.classHierarchy;
-      coreTypes ??= deltaResult.coreTypes;
       compilationMode = delta.mode;
       uriToSource.addAll(delta.uriToSource);
       for (Library library in delta.libraries) {
@@ -149,6 +148,7 @@
         "compilation only; cannot accept",
       );
     }
+    if (_pendingDeltas.isEmpty) return;
     Map<Uri, Library> combined = <Uri, Library>{};
     Map<Uri, Source> uriToSource = <Uri, Source>{};
 
@@ -249,10 +249,11 @@
     String? scriptUri,
     bool isStatic,
   ) {
-    ClassHierarchy? classHierarchy =
+    assert(_lastKnownGood != null || _pendingDeltas.isNotEmpty);
+    ClassHierarchy classHierarchy =
         (_lastKnownGood ?? _combinePendingDeltas(false)).classHierarchy;
     Map<String, DartType>? completeDefinitions = createDefinitionsWithTypes(
-      classHierarchy?.knownLibraries,
+      classHierarchy.knownLibraries,
       definitionTypes,
       definitions,
     );
@@ -269,7 +270,7 @@
     }
 
     List<TypeParameter>? typeParameters = createTypeParametersWithBounds(
-      classHierarchy?.knownLibraries,
+      classHierarchy.knownLibraries,
       typeBounds,
       typeDefaults,
       typeDefinitions,