Tighten some node types to reduce use of wildcards, casting, and handling of impossible exceptions.

PiperOrigin-RevId: 417704799
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java
index 968d360..e4e423e 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java
@@ -13,10 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.skyframe;
 
-import com.google.common.base.Predicates;
 import com.google.common.collect.Maps;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import javax.annotation.Nullable;
 
@@ -53,25 +53,14 @@
   }
 
   // Only for use by MemoizingEvaluator#delete
-  Map<SkyKey, ? extends NodeEntry> getAllValues();
+  Map<SkyKey, InMemoryNodeEntry> getAllValues();
 
-  ConcurrentHashMap<SkyKey, ? extends NodeEntry> getAllValuesMutable();
+  ConcurrentHashMap<SkyKey, InMemoryNodeEntry> getAllValuesMutable();
 
-  static Map<SkyKey, SkyValue> transformDoneEntries(Map<SkyKey, ? extends NodeEntry> nodeMap) {
+  static Map<SkyKey, SkyValue> transformDoneEntries(Map<SkyKey, InMemoryNodeEntry> nodeMap) {
     return Collections.unmodifiableMap(
         Maps.filterValues(
-            Maps.transformValues(
-                nodeMap,
-                entry -> {
-                  if (!entry.isDone()) {
-                    return null;
-                  }
-                  try {
-                    return entry.getValue();
-                  } catch (InterruptedException e) {
-                    throw new IllegalStateException("Interrupted getting " + entry, e);
-                  }
-                }),
-            Predicates.notNull()));
+            Maps.transformValues(nodeMap, entry -> entry.isDone() ? entry.getValue() : null),
+            Objects::nonNull));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java
index ea16a9a..b6b0fcb 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java
@@ -32,7 +32,7 @@
  * <p>This class is public only for use in alternative graph implementations.
  */
 public class InMemoryGraphImpl implements InMemoryGraph {
-  protected final ConcurrentHashMap<SkyKey, NodeEntry> nodeMap;
+  protected final ConcurrentHashMap<SkyKey, InMemoryNodeEntry> nodeMap;
   private final boolean keepEdges;
 
   @VisibleForTesting
@@ -74,7 +74,7 @@
     return result;
   }
 
-  protected NodeEntry newNodeEntry(SkyKey key) {
+  protected InMemoryNodeEntry newNodeEntry(SkyKey key) {
     return keepEdges ? new InMemoryNodeEntry() : new EdgelessInMemoryNodeEntry();
   }
 
@@ -83,7 +83,7 @@
    * lambda instantiation overhead.
    */
   @SuppressWarnings("UnnecessaryLambda")
-  private final Function<SkyKey, NodeEntry> newNodeEntryFunction = k -> newNodeEntry(k);
+  private final Function<SkyKey, InMemoryNodeEntry> newNodeEntryFunction = this::newNodeEntry;
 
   @Override
   public Map<SkyKey, NodeEntry> createIfAbsentBatch(
@@ -102,25 +102,16 @@
 
   @Override
   public Map<SkyKey, SkyValue> getValues() {
-    return Collections.unmodifiableMap(
-        Maps.transformValues(
-            nodeMap,
-            entry -> {
-              try {
-                return entry.toValue();
-              } catch (InterruptedException e) {
-                throw new IllegalStateException(e);
-              }
-            }));
+    return Collections.unmodifiableMap(Maps.transformValues(nodeMap, InMemoryNodeEntry::toValue));
   }
 
   @Override
-  public Map<SkyKey, NodeEntry> getAllValues() {
+  public Map<SkyKey, InMemoryNodeEntry> getAllValues() {
     return Collections.unmodifiableMap(nodeMap);
   }
 
   @Override
-  public ConcurrentHashMap<SkyKey, ? extends NodeEntry> getAllValuesMutable() {
+  public ConcurrentHashMap<SkyKey, InMemoryNodeEntry> getAllValuesMutable() {
     return nodeMap;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
index b471603..5798910 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -362,14 +362,10 @@
     if (summarize) {
       long nodes = 0;
       long edges = 0;
-      for (NodeEntry entry : graph.getAllValues().values()) {
+      for (InMemoryNodeEntry entry : graph.getAllValues().values()) {
         nodes++;
         if (entry.isDone()) {
-          try {
-            edges += Iterables.size(entry.getDirectDeps());
-          } catch (InterruptedException e) {
-            throw new IllegalStateException("InMemoryGraph doesn't throw: " + entry, e);
-          }
+          edges += Iterables.size(entry.getDirectDeps());
         }
       }
       out.println("Node count: " + nodes);
@@ -380,21 +376,17 @@
               String.format(
                   "%s:%s", key.functionName(), key.argument().toString().replace('\n', '_'));
 
-      for (Map.Entry<SkyKey, ? extends NodeEntry> mapPair : graph.getAllValues().entrySet()) {
+      for (Map.Entry<SkyKey, InMemoryNodeEntry> mapPair : graph.getAllValues().entrySet()) {
         SkyKey key = mapPair.getKey();
-        NodeEntry entry = mapPair.getValue();
+        InMemoryNodeEntry entry = mapPair.getValue();
         if (entry.isDone()) {
           out.print(keyFormatter.apply(key));
           out.print("|");
-          if (((InMemoryNodeEntry) entry).keepEdges() == NodeEntry.KeepEdgesPolicy.NONE) {
+          if (entry.keepEdges() == NodeEntry.KeepEdgesPolicy.NONE) {
             out.println(" (direct deps not stored)");
           } else {
-            try {
-              out.println(
-                  Joiner.on('|').join(Iterables.transform(entry.getDirectDeps(), keyFormatter)));
-            } catch (InterruptedException e) {
-              throw new IllegalStateException("InMemoryGraph doesn't throw: " + entry, e);
-            }
+            out.println(
+                Joiner.on('|').join(Iterables.transform(entry.getDirectDeps(), keyFormatter)));
           }
         }
       }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
index 44a2f36..434f6ed 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
@@ -129,7 +129,6 @@
 import com.google.devtools.build.skyframe.InMemoryGraphImpl;
 import com.google.devtools.build.skyframe.InMemoryNodeEntry;
 import com.google.devtools.build.skyframe.MemoizingEvaluator.GraphTransformerForTesting;
-import com.google.devtools.build.skyframe.NodeEntry;
 import com.google.devtools.build.skyframe.NotifyingHelper;
 import com.google.devtools.build.skyframe.NotifyingHelper.EventType;
 import com.google.devtools.build.skyframe.ProcessableGraph;
@@ -364,11 +363,11 @@
     return new GraphTransformerForTesting() {
       @Override
       public InMemoryGraph transform(InMemoryGraph graph) {
-        return new InMemoryGraphImpl() {
-          {
-            nodeMap.putAll(Maps.transformValues(values, v -> createNodeEntry(v)));
-          }
-        };
+        InMemoryGraph transformed = new InMemoryGraphImpl();
+        transformed
+            .getAllValuesMutable()
+            .putAll(Maps.transformValues(values, this::createNodeEntry));
+        return transformed;
       }
 
       @Override
@@ -381,7 +380,7 @@
         throw new UnsupportedOperationException();
       }
 
-      private NodeEntry createNodeEntry(SkyValue value) {
+      private InMemoryNodeEntry createNodeEntry(SkyValue value) {
         InMemoryNodeEntry nodeEntry = new InMemoryNodeEntry();
         nodeEntry.addReverseDepAndCheckIfDone(null);
         nodeEntry.markRebuilding();
diff --git a/src/test/java/com/google/devtools/build/skyframe/DeterministicInMemoryGraph.java b/src/test/java/com/google/devtools/build/skyframe/DeterministicInMemoryGraph.java
index 41e3203..39b9169 100644
--- a/src/test/java/com/google/devtools/build/skyframe/DeterministicInMemoryGraph.java
+++ b/src/test/java/com/google/devtools/build/skyframe/DeterministicInMemoryGraph.java
@@ -64,12 +64,12 @@
   }
 
   @Override
-  public Map<SkyKey, ? extends NodeEntry> getAllValues() {
+  public Map<SkyKey, InMemoryNodeEntry> getAllValues() {
     return ((InMemoryGraph) delegate).getAllValues();
   }
 
   @Override
-  public ConcurrentHashMap<SkyKey, ? extends NodeEntry> getAllValuesMutable() {
+  public ConcurrentHashMap<SkyKey, InMemoryNodeEntry> getAllValuesMutable() {
     return ((InMemoryGraph) delegate).getAllValuesMutable();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/skyframe/NotifyingInMemoryGraph.java b/src/test/java/com/google/devtools/build/skyframe/NotifyingInMemoryGraph.java
index 53d110e..2a7ad76 100644
--- a/src/test/java/com/google/devtools/build/skyframe/NotifyingInMemoryGraph.java
+++ b/src/test/java/com/google/devtools/build/skyframe/NotifyingInMemoryGraph.java
@@ -71,12 +71,12 @@
   }
 
   @Override
-  public Map<SkyKey, ? extends NodeEntry> getAllValues() {
+  public Map<SkyKey, InMemoryNodeEntry> getAllValues() {
     return ((InMemoryGraph) delegate).getAllValues();
   }
 
   @Override
-  public ConcurrentHashMap<SkyKey, ? extends NodeEntry> getAllValuesMutable() {
+  public ConcurrentHashMap<SkyKey, InMemoryNodeEntry> getAllValuesMutable() {
     return ((InMemoryGraph) delegate).getAllValuesMutable();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
index f63cbb2..57c9700 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -22,6 +22,9 @@
 import static com.google.devtools.build.skyframe.GraphTester.skyKey;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -76,7 +79,6 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mockito;
 
 /** Tests for {@link ParallelEvaluator}. */
 @RunWith(TestParameterInjector.class)
@@ -205,7 +207,7 @@
               private ListenableFuture<SkyValue> future;
 
               @Override
-              public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException {
+              public SkyValue compute(SkyKey skyKey, Environment env) {
                 if (future == null) {
                   future =
                       executor.submit(
@@ -364,9 +366,9 @@
     // thread, aka the main Skyframe evaluation thread),
     CountDownLatch keyAStartedComputingLatch = new CountDownLatch(1);
     CountDownLatch keyBAddReverseDepAndCheckIfDoneLatch = new CountDownLatch(1);
-    NodeEntry nodeEntryB = Mockito.mock(NodeEntry.class);
+    InMemoryNodeEntry nodeEntryB = mock(InMemoryNodeEntry.class);
     AtomicBoolean keyBAddReverseDepAndCheckIfDoneInterrupted = new AtomicBoolean(false);
-    Mockito.doAnswer(
+    doAnswer(
             invocation -> {
               keyAStartedComputingLatch.await();
               keyBAddReverseDepAndCheckIfDoneLatch.countDown();
@@ -379,11 +381,11 @@
               }
             })
         .when(nodeEntryB)
-        .addReverseDepAndCheckIfDone(Mockito.eq(null));
+        .addReverseDepAndCheckIfDone(eq(null));
     graph =
         new InMemoryGraphImpl() {
           @Override
-          protected NodeEntry newNodeEntry(SkyKey key) {
+          protected InMemoryNodeEntry newNodeEntry(SkyKey key) {
             return key.equals(keyB) ? nodeEntryB : super.newNodeEntry(key);
           }
         };
@@ -579,17 +581,16 @@
     class CustomRuntimeException extends RuntimeException {}
     final CustomRuntimeException expected = new CustomRuntimeException();
 
-    final SkyFunction builder =
+    SkyFunction builder =
         new SkyFunction() {
           @Override
           @Nullable
-          public SkyValue compute(SkyKey skyKey, Environment env)
-              throws SkyFunctionException, InterruptedException {
+          public SkyValue compute(SkyKey skyKey, Environment env) {
             throw expected;
           }
         };
 
-    final ParallelEvaluator evaluator =
+    ParallelEvaluator evaluator =
         makeEvaluator(
             new InMemoryGraphImpl(), ImmutableMap.of(GraphTester.NODE_TYPE, builder), false);
 
@@ -895,10 +896,6 @@
                 } catch (SomeErrorException e) {
                   throw new SkyFunctionException(
                       new SomeErrorException("We got: " + e.getMessage()), Transience.PERSISTENT) {
-                    @Override
-                    public boolean isCatastrophic() {
-                      return false;
-                    }
                   };
                 }
                 return null;
@@ -1084,12 +1081,7 @@
         .getOrCreate(errorKey)
         .setBuilder(
             new ChainedFunction(
-                null,
-                /*waitToFinish=*/ latch,
-                null,
-                false,
-                /*value=*/ null,
-                ImmutableList.<SkyKey>of()));
+                null, /*waitToFinish=*/ latch, null, false, /*value=*/ null, ImmutableList.of()));
     tester.getOrCreate(parentKey).addDependency(errorKey).setComputedValue(CONCATENATE);
     EvaluationResult<StringValue> result =
         eval(/*keepGoing=*/ false, ImmutableList.of(parentKey, errorKey));
@@ -1129,7 +1121,7 @@
                 /*notifyFinish=*/ null,
                 /*waitForException=*/ false,
                 /*value=*/ null,
-                ImmutableList.<SkyKey>of()));
+                ImmutableList.of()));
     tester
         .getOrCreate(secondError)
         .setBuilder(
@@ -1139,7 +1131,7 @@
                 /*notifyFinish=*/ null,
                 /*waitForException=*/ false,
                 /*value=*/ null,
-                ImmutableList.<SkyKey>of()));
+                ImmutableList.of()));
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/ false, firstError, secondError);
     assertWithMessage(result.toString()).that(result.hasError()).isTrue();
     // With keepGoing=false, the eval call will terminate with exactly one error (the first one
@@ -1599,7 +1591,7 @@
         .addDependency("after")
         .setComputedValue(CONCATENATE);
     EvaluationResult<StringValue> result = eval(/*keepGoing=*/ true, ImmutableList.of(topKey));
-    assertThat(ImmutableList.<String>copyOf(result.<String>keyNames())).containsExactly("top");
+    assertThat(ImmutableList.<String>copyOf(result.keyNames())).containsExactly("top");
     assertThat(result.get(topKey).getValue()).isEqualTo("parent valueafter");
     assertThat(result.errorMap()).isEmpty();
   }
@@ -1726,22 +1718,12 @@
         .getOrCreate(cycleKey)
         .setBuilder(
             new ChainedFunction(
-                null,
-                null,
-                cycleFinish,
-                false,
-                new StringValue(""),
-                ImmutableSet.<SkyKey>of(midKey)));
+                null, null, cycleFinish, false, new StringValue(""), ImmutableSet.of(midKey)));
     tester
         .getOrCreate(errorKey)
         .setBuilder(
             new ChainedFunction(
-                null,
-                cycleFinish,
-                null,
-                /*waitForException=*/ false,
-                null,
-                ImmutableSet.<SkyKey>of()));
+                null, cycleFinish, null, /*waitForException=*/ false, null, ImmutableSet.of()));
 
     EvaluationResult<StringValue> result = eval(keepGoing, ImmutableSet.of(topKey));
     assertThatEvaluationResult(result)
@@ -1796,7 +1778,7 @@
                 null,
                 /*waitForException=*/ true,
                 new StringValue("never returned"),
-                ImmutableSet.<SkyKey>of(GraphTester.toSkyKey("dep that never builds"))));
+                ImmutableSet.of(GraphTester.toSkyKey("dep that never builds"))));
 
     tester
         .getOrCreate(cycleKey)
@@ -1807,7 +1789,7 @@
                 topStartAndCycleFinish,
                 /*waitForException=*/ false,
                 new StringValue(""),
-                ImmutableSet.<SkyKey>of(midKey)));
+                ImmutableSet.of(midKey)));
     // error waits until otherTop starts and cycle finishes, to make sure otherTop will request
     // its dep before the threadpool shuts down.
     tester
@@ -1819,7 +1801,7 @@
                 null,
                 /*waitForException=*/ false,
                 null,
-                ImmutableSet.<SkyKey>of()));
+                ImmutableSet.of()));
     EvaluationResult<StringValue> result =
         eval(/*keepGoing=*/ false, ImmutableSet.of(topKey, otherTop));
     assertThat(result.errorMap().keySet()).containsExactly(topKey);
@@ -1862,7 +1844,7 @@
                 null,
                 /*waitForException=*/ !keepGoing,
                 null,
-                ImmutableSet.<SkyKey>of()));
+                ImmutableSet.of()));
     // error waits until otherTop starts and cycle finishes, to make sure otherTop will request
     // its dep before the threadpool shuts down.
     tester
@@ -1874,7 +1856,7 @@
                 null,
                 /*waitForException=*/ false,
                 null,
-                ImmutableSet.<SkyKey>of()));
+                ImmutableSet.of()));
     tester
         .getOrCreate(cycleKey)
         .setBuilder(
@@ -1884,7 +1866,7 @@
                 topStartAndCycleFinish,
                 /*waitForException=*/ false,
                 new StringValue(""),
-                ImmutableSet.<SkyKey>of(midKey)));
+                ImmutableSet.of(midKey)));
     EvaluationResult<StringValue> result = eval(keepGoing, ImmutableSet.of(topKey, otherTop));
     if (keepGoing) {
       assertThatEvaluationResult(result).hasErrorMapThat().hasSize(2);
@@ -1945,8 +1927,8 @@
                 + "(requested by nodes 'parent:octodad')");
   }
 
-  private static class SomeOtherErrorException extends Exception {
-    public SomeOtherErrorException(String msg) {
+  private static final class SomeOtherErrorException extends Exception {
+    SomeOtherErrorException(String msg) {
       super(msg);
     }
   }
@@ -2205,7 +2187,7 @@
     // Skyframe doesn't automatically dedupe cycles that are the same except for entry point.
     assertThat(cycles).hasSize(2);
     int numUniqueCycles = 0;
-    CycleDeduper<SkyKey> cycleDeduper = new CycleDeduper<SkyKey>();
+    CycleDeduper<SkyKey> cycleDeduper = new CycleDeduper<>();
     for (ImmutableList<SkyKey> cycle : cycles) {
       if (!cycleDeduper.alreadySeen(cycle)) {
         numUniqueCycles++;
@@ -2216,8 +2198,8 @@
 
   @Test
   public void signalValueEnqueuedAndEvaluated() throws Exception {
-    final Set<SkyKey> enqueuedValues = Sets.newConcurrentHashSet();
-    final Set<SkyKey> evaluatedValues = Sets.newConcurrentHashSet();
+    Set<SkyKey> enqueuedValues = Sets.newConcurrentHashSet();
+    Set<SkyKey> evaluatedValues = Sets.newConcurrentHashSet();
     EvaluationProgressReceiver progressReceiver =
         new EvaluationProgressReceiver() {
           @Override