Remove the boolean `keepEdges` field from `InMemoryGraphImpl`.

It is somewhat confusing that a subclass can override `newNodeEntry()`, rendering the value passed to `keepEdges` irrelevant.

PiperOrigin-RevId: 417829239
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 e4e423e..1eafcdd 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.common.collect.Maps;
+import com.google.devtools.build.skyframe.InMemoryGraphImpl.EdgelessInMemoryGraphImpl;
 import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
@@ -22,6 +23,20 @@
 
 /** {@link ProcessableGraph} that exposes the contents of the entire graph. */
 public interface InMemoryGraph extends ProcessableGraph {
+
+  /** Creates a new in-memory graph suitable for incremental builds. */
+  static InMemoryGraph create() {
+    return new InMemoryGraphImpl();
+  }
+
+  /**
+   * Creates a new in-memory graph that discards graph edges to save memory and cannot be used for
+   * incremental builds.
+   */
+  static InMemoryGraph createEdgeless() {
+    return new EdgelessInMemoryGraphImpl();
+  }
+
   @Override
   Map<SkyKey, ? extends NodeEntry> createIfAbsentBatch(
       @Nullable SkyKey requestor, Reason reason, Iterable<SkyKey> keys);
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 b6b0fcb..7ea56bd 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java
@@ -13,10 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.skyframe;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.devtools.build.lib.collect.compacthashmap.CompactHashMap;
+import com.google.errorprone.annotations.ForOverride;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -32,20 +32,14 @@
  * <p>This class is public only for use in alternative graph implementations.
  */
 public class InMemoryGraphImpl implements InMemoryGraph {
+
   protected final ConcurrentHashMap<SkyKey, InMemoryNodeEntry> nodeMap;
-  private final boolean keepEdges;
 
-  @VisibleForTesting
-  public InMemoryGraphImpl() {
-    this(/*keepEdges=*/ true);
+  InMemoryGraphImpl() {
+    this(/*initialCapacity=*/ 1 << 10);
   }
 
-  public InMemoryGraphImpl(boolean keepEdges) {
-    this(keepEdges, /*initialCapacity=*/ 1 << 10);
-  }
-
-  protected InMemoryGraphImpl(boolean keepEdges, int initialCapacity) {
-    this.keepEdges = keepEdges;
+  protected InMemoryGraphImpl(int initialCapacity) {
     this.nodeMap = new ConcurrentHashMap<>(initialCapacity);
   }
 
@@ -74,8 +68,9 @@
     return result;
   }
 
+  @ForOverride
   protected InMemoryNodeEntry newNodeEntry(SkyKey key) {
-    return keepEdges ? new InMemoryNodeEntry() : new EdgelessInMemoryNodeEntry();
+    return new InMemoryNodeEntry();
   }
 
   /**
@@ -114,4 +109,11 @@
   public ConcurrentHashMap<SkyKey, InMemoryNodeEntry> getAllValuesMutable() {
     return nodeMap;
   }
+
+  static final class EdgelessInMemoryGraphImpl extends InMemoryGraphImpl {
+    @Override
+    protected InMemoryNodeEntry newNodeEntry(SkyKey key) {
+      return new EdgelessInMemoryNodeEntry();
+    }
+  }
 }
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 5798910..0526095 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -112,7 +112,7 @@
     this.progressReceiver = new DirtyTrackingProgressReceiver(progressReceiver);
     this.graphInconsistencyReceiver = Preconditions.checkNotNull(graphInconsistencyReceiver);
     this.eventFilter = eventFilter;
-    this.graph = new InMemoryGraphImpl(keepEdges);
+    this.graph = keepEdges ? InMemoryGraph.create() : InMemoryGraph.createEdgeless();
     this.emittedEventState = emittedEventState;
     this.keepEdges = keepEdges;
   }
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 434f6ed..2d99f0f 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
@@ -126,7 +126,6 @@
 import com.google.devtools.build.skyframe.EvaluationContext;
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.InMemoryGraph;
-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.NotifyingHelper;
@@ -363,7 +362,7 @@
     return new GraphTransformerForTesting() {
       @Override
       public InMemoryGraph transform(InMemoryGraph graph) {
-        InMemoryGraph transformed = new InMemoryGraphImpl();
+        InMemoryGraph transformed = InMemoryGraph.create();
         transformed
             .getAllValuesMutable()
             .putAll(Maps.transformValues(values, this::createNodeEntry));
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 bc33f88..1d20c0d 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -795,12 +795,12 @@
       throws Exception {
     Assume.assumeTrue(keepGoing || keepEdges);
 
-    graph = new InMemoryGraphImpl(keepEdges);
+    graph = keepEdges ? InMemoryGraph.create() : InMemoryGraph.createEdgeless();
 
     SkyKey catastropheKey = GraphTester.toSkyKey("catastrophe");
     SkyKey otherKey = GraphTester.toSkyKey("someKey");
 
-    final Exception catastrophe = new SomeErrorException("bad");
+    Exception catastrophe = new SomeErrorException("bad");
     tester
         .getOrCreate(catastropheKey)
         .setBuilder(