[incremental compiler] Streamline processing of reused/removed builders

Suprisingly this doesn't seem to affect performance, but doing basically
the same thing in two different ways is suboptimal.

Change-Id: I1cc52bceb05a0af4d0e0d0574c3599c063cf42a8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105242
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index f2bd798..87f7acd1 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -228,17 +228,26 @@
       List<LibraryBuilder> reusedLibraries = computeReusedLibraries(
           invalidatedUris, uriTranslator,
           notReused: notReusedLibraries);
-      Set<Uri> reusedLibraryUris =
-          new Set<Uri>.from(reusedLibraries.map((b) => b.uri));
-      bool removedBuilders = false;
-      for (Uri uri in new Set<Uri>.from(dillLoadedData.loader.builders.keys)
-        ..removeAll(reusedLibraryUris)) {
-        LibraryBuilder builder = dillLoadedData.loader.builders.remove(uri);
-        userBuilders?.remove(uri);
+
+      bool removedDillBuilders = false;
+      for (LibraryBuilder builder in notReusedLibraries) {
         CompilerContext.current.uriToSource.remove(builder.fileUri);
-        removedBuilders = true;
+
+        LibraryBuilder dillBuilder =
+            dillLoadedData.loader.builders.remove(builder.uri);
+        if (dillBuilder != null) {
+          removedDillBuilders = true;
+          userBuilders?.remove(builder.uri);
+        }
+
+        // Remove component problems for libraries we don't reuse.
+        if (remainingComponentProblems.isNotEmpty) {
+          Library lib = builder.target;
+          removeLibraryFromRemainingComponentProblems(lib, uriTranslator);
+        }
       }
-      if (removedBuilders) {
+
+      if (removedDillBuilders) {
         dillLoadedData.loader.libraries.clear();
         for (LibraryBuilder builder in dillLoadedData.loader.builders.values) {
           dillLoadedData.loader.libraries.add(builder.target);
@@ -264,16 +273,6 @@
             .addAll(oldDillLoadedData.loader.libraries);
       }
 
-      for (LibraryBuilder builder in notReusedLibraries) {
-        Library lib = builder.target;
-        CompilerContext.current.uriToSource.remove(builder.fileUri);
-
-        // Remove component problems for libraries we don't reuse.
-        if (remainingComponentProblems.isNotEmpty) {
-          removeLibraryFromRemainingComponentProblems(lib, uriTranslator);
-        }
-      }
-
       if (hierarchy != null) {
         List<Library> removedLibraries = new List<Library>();
         for (LibraryBuilder builder in notReusedLibraries) {
@@ -289,7 +288,7 @@
             " of ${userCode.loader.builders.length} libraries");
       }
 
-      await loadEnsureLoadedComponents(reusedLibraryUris, reusedLibraries);
+      await loadEnsureLoadedComponents(reusedLibraries);
 
       KernelTarget userCodeOld = userCode;
       userCode = new KernelTarget(
@@ -407,13 +406,13 @@
 
   /// Internal method.
   Future loadEnsureLoadedComponents(
-      Set<Uri> reusedLibraryUris, List<LibraryBuilder> reusedLibraries) async {
+      List<LibraryBuilder> reusedLibraries) async {
     if (modulesToLoad != null) {
       bool loadedAnything = false;
       for (Component module in modulesToLoad) {
         bool usedComponent = false;
         for (Library lib in module.libraries) {
-          if (!reusedLibraryUris.contains(lib.importUri)) {
+          if (!dillLoadedData.loader.builders.containsKey(lib.importUri)) {
             dillLoadedData.loader.libraries.add(lib);
             dillLoadedData.addLibrary(lib);
             reusedLibraries.add(dillLoadedData.loader.read(lib.importUri, -1));