Enable rewinding for edgeless node entries.

PiperOrigin-RevId: 324925689
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
index dbf6bb1..2c6fd0c 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
@@ -501,17 +501,26 @@
     return DirtyBuildingState.create(dirtyType, directDeps, value);
   }
 
+  private static final GroupedList<SkyKey> EMPTY_LIST = new GroupedList<>();
+
   @Override
   public synchronized MarkedDirtyResult markDirty(DirtyType dirtyType) {
-    // Can't process a dirty node without its deps.
-    assertKeepDeps();
+    if (!DirtyType.FORCE_REBUILD.equals(dirtyType)) {
+      // A node can't be found to be dirty without deps unless it's force-rebuilt.
+      assertKeepDeps();
+    }
     if (isDone()) {
-      dirtyBuildingState =
-          createDirtyBuildingStateForDoneNode(
-              dirtyType, GroupedList.create(getCompressedDirectDepsForDoneEntry()), value);
+      GroupedList<SkyKey> directDeps =
+          KeepEdgesPolicy.NONE.equals(keepEdges())
+              ? EMPTY_LIST
+              : GroupedList.create(getCompressedDirectDepsForDoneEntry());
+      dirtyBuildingState = createDirtyBuildingStateForDoneNode(dirtyType, directDeps, value);
       value = null;
-      directDeps = null;
-      return new MarkedDirtyResult(ReverseDepsUtility.getReverseDeps(this));
+      this.directDeps = null;
+      return new MarkedDirtyResult(
+          KeepEdgesPolicy.ALL.equals(keepEdges())
+              ? ReverseDepsUtility.getReverseDeps(this)
+              : ImmutableList.of());
     }
     if (dirtyType.equals(DirtyType.FORCE_REBUILD)) {
       if (dirtyBuildingState != null) {