Avoid implicit iteration over nested sets

Use .toList() instead (this is equivalent, as iterator() calls
toList().iterator()).

PiperOrigin-RevId: 288466842
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
index 4e3a3c9..ccc237a 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
@@ -246,7 +246,7 @@
   public Artifact getPrimaryInput() {
     // The default behavior is to return the first input artifact.
     // Call through the method, not the field, because it may be overridden.
-    return Iterables.getFirst(getInputs(), null);
+    return Iterables.getFirst(getInputs().toList(), null);
   }
 
   @Override
@@ -520,7 +520,7 @@
 
   @Override
   public Depset getSkylarkInputs() {
-    return Depset.of(Artifact.TYPE, NestedSetBuilder.wrap(Order.STABLE_ORDER, getInputs()));
+    return Depset.of(Artifact.TYPE, getInputs());
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
index 72ded14..ce203a0 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
@@ -403,7 +403,7 @@
         entry.addFile(output.getExecPath(), metadata);
       }
     }
-    for (Artifact input : action.getInputs()) {
+    for (Artifact input : action.getInputs().toList()) {
       entry.addFile(input.getExecPath(), getMetadataMaybe(metadataHandler, input));
     }
     entry.getFileDigest();
@@ -514,7 +514,7 @@
       // Since we never validate action key for middlemen, we should not store
       // it in the cache entry and just use empty string instead.
       entry = new ActionCache.Entry("", ImmutableMap.<String, String>of(), false);
-      for (Artifact input : action.getInputs()) {
+      for (Artifact input : action.getInputs().toList()) {
         entry.addFile(input.getExecPath(), getMetadataMaybe(metadataHandler, input));
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java b/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java
index 6d335a8..e101621 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java
@@ -77,7 +77,7 @@
 
   @Override protected void black(ActionAnalysisMetadata action) {
     visitAction(action);
-    for (Artifact input : action.getInputs()) {
+    for (Artifact input : action.getInputs().toList()) {
       if (shouldVisit(input)) {
         visitWhiteNode(input);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
index af6bcbb..556ccba 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
@@ -49,18 +49,16 @@
         // it cannot expand arbitrary middlemen without access to a global action graph.
         // We could check this constraint here too, but it seems unnecessary. This code is
         // going away anyway.
-        Preconditions.checkArgument(mm.isMiddlemanArtifact(),
-            "%s is not a middleman artifact", mm);
+        Preconditions.checkArgument(mm.isMiddlemanArtifact(), "%s is not a middleman artifact", mm);
         ActionAnalysisMetadata middlemanAction = actionGraph.getGeneratingAction(mm);
         Preconditions.checkState(middlemanAction != null, mm);
         // TODO(bazel-team): Consider expanding recursively or throwing an exception here.
         // Most likely, this code will cause silent errors if we ever have a middleman that
         // contains a middleman.
         if (middlemanAction.getActionType() == Action.MiddlemanType.AGGREGATING_MIDDLEMAN) {
-          Artifact.addNonMiddlemanArtifacts(middlemanAction.getInputs(), output,
-              Functions.<Artifact>identity());
+          Artifact.addNonMiddlemanArtifacts(
+              middlemanAction.getInputs().toList(), output, Functions.<Artifact>identity());
         }
-
       }
     };
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/LazyWriteNestedSetOfPairAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/LazyWriteNestedSetOfPairAction.java
index 74b15cc..4ab985c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/LazyWriteNestedSetOfPairAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/LazyWriteNestedSetOfPairAction.java
@@ -65,7 +65,7 @@
   private String getContents() {
     if (fileContents == null) {
       StringBuilder stringBuilder = new StringBuilder();
-      for (Pair<String, String> pair : pairsToWrite) {
+      for (Pair<String, String> pair : pairsToWrite.toList()) {
         stringBuilder
             .append(pair.first)
             .append(":")
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
index d8f62c5..73c58e4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
@@ -206,16 +206,14 @@
       // Validate that input path is a file with the executable bit is set.
       if (!inputPath.isFile()) {
         throw new ActionExecutionException(
-            "'" + Iterables.getOnlyElement(getInputs()).prettyPrint() + "' is not a file",
-            this,
-            false);
+            "'" + getInputs().getSingleton().prettyPrint() + "' is not a file", this, false);
       }
       if (!inputPath.isExecutable()) {
         throw new ActionExecutionException(
             "failed to create symbolic link '"
                 + Iterables.getOnlyElement(getOutputs()).prettyPrint()
                 + "': file '"
-                + Iterables.getOnlyElement(getInputs()).prettyPrint()
+                + getInputs().getSingleton().prettyPrint()
                 + "' is not executable",
             this,
             false);
@@ -225,7 +223,7 @@
           "failed to create symbolic link '"
               + Iterables.getOnlyElement(getOutputs()).prettyPrint()
               + "' to the '"
-              + Iterables.getOnlyElement(getInputs()).prettyPrint()
+              + getInputs().getSingleton().prettyPrint()
               + "' due to I/O error: "
               + e.getMessage(),
           e,
@@ -254,18 +252,24 @@
         actionExecutionContext.getExecRoot().getRelative(getInputPath()).createDirectory();
       }
     } catch (IOException e) {
-      throw new ActionExecutionException("failed to touch symbolic link '"
-          + Iterables.getOnlyElement(getOutputs()).prettyPrint()
-          + "' to the '" + Iterables.getOnlyElement(getInputs()).prettyPrint()
-          + "' due to I/O error: " + e.getMessage(), e, this, false);
+      throw new ActionExecutionException(
+          "failed to touch symbolic link '"
+              + Iterables.getOnlyElement(getOutputs()).prettyPrint()
+              + "' to the '"
+              + getInputs().getSingleton().prettyPrint()
+              + "' due to I/O error: "
+              + e.getMessage(),
+          e,
+          this,
+          false);
     }
   }
 
   private String printInputs() {
-    if (Iterables.isEmpty(getInputs())) {
+    if (getInputs().isEmpty()) {
       return inputPath.getPathString();
-    } else if (Iterables.size(getInputs()) == 1){
-      return Iterables.getOnlyElement(getInputs()).prettyPrint();
+    } else if (getInputs().isSingleton()) {
+      return getInputs().getSingleton().prettyPrint();
     } else {
       throw new IllegalStateException(
           "Inputs unexpectedly contains more than 1 element: " + getInputs());
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/Args.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/Args.java
index 913c52d..1918c57 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/Args.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/Args.java
@@ -563,8 +563,8 @@
 
     @Override
     public ImmutableSet<Artifact> getDirectoryArtifacts() {
-      for (Iterable<?> collection : potentialDirectoryArtifacts) {
-        scanForDirectories(collection);
+      for (NestedSet<?> collection : potentialDirectoryArtifacts) {
+        scanForDirectories(collection.toList());
       }
       potentialDirectoryArtifacts.clear();
       return ImmutableSet.copyOf(directoryArtifacts);
diff --git a/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java b/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
index 66c527c..c266278 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/StandaloneTestStrategy.java
@@ -132,7 +132,7 @@
             ImmutableMap.copyOf(executionInfo),
             action.getRunfilesSupplier(),
             ImmutableMap.of(),
-            /*inputs=*/ ImmutableList.copyOf(action.getInputs()),
+            /*inputs=*/ action.getInputs().toList(),
             /*tools=*/ ImmutableList.<Artifact>of(),
             ImmutableList.copyOf(action.getSpawnOutputs()),
             localResourceUsage);
diff --git a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java
index acde8ac..aa030ad 100644
--- a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java
+++ b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java
@@ -377,7 +377,7 @@
           logger.warning("Error getting hints for " + packageFragment + ": " + e);
           continue;
         }
-        for (PathFragment file : globValue.getMatches()) {
+        for (PathFragment file : globValue.getMatches().toList()) {
           hints.add(
               artifactFactory.getSourceArtifact(
                   packageFragment.getRelative(file), globKey.getPackageRoot()));
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BUILD b/src/main/java/com/google/devtools/build/lib/query2/BUILD
index 3a43ae3..3865f7d 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD
@@ -65,6 +65,7 @@
     ],
     deps = [
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/query2/engine",
         "//third_party:guava",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java
index af180f7..96d4f42 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java
@@ -182,25 +182,25 @@
     }
 
     if (options.includeArtifacts) {
-    stringBuilder
-        .append("  Inputs: [")
-        .append(
-            Streams.stream(action.getInputs())
-                .map(input -> input.getExecPathString())
-                .sorted()
-                .collect(Collectors.joining(", ")))
-        .append("]\n")
-        .append("  Outputs: [")
-        .append(
-            Streams.stream(action.getOutputs())
-                .map(
-                    output ->
-                        output.isTreeArtifact()
-                            ? output.getExecPathString() + " (TreeArtifact)"
-                            : output.getExecPathString())
-                .sorted()
-                .collect(Collectors.joining(", ")))
-        .append("]\n");
+      stringBuilder
+          .append("  Inputs: [")
+          .append(
+              action.getInputs().toList().stream()
+                  .map(input -> input.getExecPathString())
+                  .sorted()
+                  .collect(Collectors.joining(", ")))
+          .append("]\n")
+          .append("  Outputs: [")
+          .append(
+              Streams.stream(action.getOutputs())
+                  .map(
+                      output ->
+                          output.isTreeArtifact()
+                              ? output.getExecPathString() + " (TreeArtifact)"
+                              : output.getExecPathString())
+                  .sorted()
+                  .collect(Collectors.joining(", ")))
+          .append("]\n");
     }
 
     if (action instanceof AbstractAction) {
@@ -257,7 +257,7 @@
     if (options.includeParamFiles) {
       // Assumption: if an Action takes a param file as an input, it will be used
       // to provide params to the command.
-      for (Artifact input : action.getInputs()) {
+      for (Artifact input : action.getInputs().toList()) {
         String inputFileName = input.getExecPathString();
         if (getParamFileNameToContentMap().containsKey(inputFileName)) {
           stringBuilder
diff --git a/src/main/java/com/google/devtools/build/lib/query2/aquery/AqueryUtils.java b/src/main/java/com/google/devtools/build/lib/query2/aquery/AqueryUtils.java
index 9a0296e..1f36050 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/aquery/AqueryUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/aquery/AqueryUtils.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.Streams;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 
 /** Utility class for Aquery */
 public class AqueryUtils {
@@ -33,7 +34,7 @@
    */
   public static boolean matchesAqueryFilters(
       ActionAnalysisMetadata action, AqueryActionFilter actionFilters) {
-    Iterable<Artifact> inputs = action.getInputs();
+    NestedSet<Artifact> inputs = action.getInputs();
     Iterable<Artifact> outputs = action.getOutputs();
     String mnemonic = action.getMnemonic();
 
@@ -45,7 +46,7 @@
 
     if (actionFilters.hasFilterForFunction(INPUTS)) {
       Boolean containsFile =
-          Streams.stream(inputs)
+          inputs.toList().stream()
               .anyMatch(
                   artifact ->
                       actionFilters.matchesAllPatternsForFunction(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
index 7950fee..a8f9be1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
@@ -941,7 +941,8 @@
       }
       Iterable<Artifact> pySrcs =
           FileType.filter(
-              src.getProvider(FileProvider.class).getFilesToBuild(), PyRuleClasses.PYTHON_SOURCE);
+              src.getProvider(FileProvider.class).getFilesToBuild().toList(),
+              PyRuleClasses.PYTHON_SOURCE);
       Iterables.addAll(sourceFiles, pySrcs);
       if (Iterables.isEmpty(pySrcs)) {
         ruleContext.attributeWarning("srcs",
@@ -995,12 +996,15 @@
     PythonInfo info =
         PythonInfo.newBuilder()
             .addAllSourceFile(Artifact.toExecPaths(sources))
-            .addAllDepFile(Artifact.toExecPaths(dependencies))
+            .addAllDepFile(Artifact.toExecPaths(dependencies.toList()))
             .build();
 
     return new PyPseudoAction(
         owner,
-        NestedSetBuilder.wrap(Order.STABLE_ORDER, Iterables.concat(sources, dependencies)),
+        NestedSetBuilder.<Artifact>stableOrder()
+            .addAll(sources)
+            .addTransitive(dependencies)
+            .build(),
         ImmutableList.of(output),
         "Python",
         PYTHON_INFO,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
index 80a442a..0d8541d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyProviderUtils.java
@@ -92,7 +92,7 @@
     } else {
       NestedSet<Artifact> files = target.getProvider(FileProvider.class).getFilesToBuild();
       return NestedSetBuilder.<Artifact>compileOrder()
-          .addAll(FileType.filter(files, PyRuleClasses.PYTHON_SOURCE))
+          .addAll(FileType.filter(files.toList(), PyRuleClasses.PYTHON_SOURCE))
           .build();
     }
   }
@@ -114,7 +114,7 @@
       return PyStructUtils.getUsesSharedLibraries(getLegacyProvider(target));
     } else {
       NestedSet<Artifact> files = target.getProvider(FileProvider.class).getFilesToBuild();
-      return FileType.contains(files, CppFileTypes.SHARED_LIBRARY);
+      return FileType.contains(files.toList(), CppFileTypes.SHARED_LIBRARY);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java b/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java
index 3188ada..8259aa1 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java
@@ -330,7 +330,7 @@
   private void finalizeActionStat(
       long startTimeNanos, Action action, CriticalPathComponent component) {
     long finishTimeNanos = clock.nanoTime();
-    for (Artifact input : action.getInputs()) {
+    for (Artifact input : action.getInputs().toList()) {
       addArtifactDependency(component, input, finishTimeNanos);
     }
     component.finishActionExecution(startTimeNanos, finishTimeNanos);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/PrintActionCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/PrintActionCommand.java
index dd1f67a..c8aa624 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/PrintActionCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/PrintActionCommand.java
@@ -336,7 +336,7 @@
         continue;
       }
 
-      expandRecursiveHelper(actionGraph, middlemanAction.getInputs(), visited, result);
+      expandRecursiveHelper(actionGraph, middlemanAction.getInputs().toList(), visited, result);
     }
   }
 
@@ -375,7 +375,7 @@
       Set<Artifact> expandedArtifacts = Sets.newHashSet();
       expandRecursive(
           env.getSkyframeExecutor().getActionGraph(env.getReporter()),
-          action.getInputs(),
+          action.getInputs().toList(),
           expandedArtifacts);
       for (Artifact input : expandedArtifacts) {
         if (filesDesired.remove(input.getRootRelativePath().getSafePathString())) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionInputMapHelper.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionInputMapHelper.java
index ed08925..fd920d7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionInputMapHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionInputMapHelper.java
@@ -16,7 +16,6 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionInputMapSink;
 import com.google.devtools.build.lib.actions.ActionLookupData;
@@ -115,7 +114,7 @@
 
     if (generatingAction instanceof SymlinkAction) {
       Artifact.DerivedArtifact outputManifest =
-          (Artifact.DerivedArtifact) Iterables.getOnlyElement(generatingAction.getInputs());
+          (Artifact.DerivedArtifact) generatingAction.getInputs().getSingleton();
       ActionLookupData manifestGeneratingKey = outputManifest.getGeneratingActionKey();
       Preconditions.checkState(
           manifestGeneratingKey.getActionLookupKey().equals(filesetActionLookupKey),
@@ -127,7 +126,7 @@
       ActionAnalysisMetadata symlinkTreeAction =
           filesetActionLookupValue.getAction(manifestGeneratingKey.getActionIndex());
       Artifact.DerivedArtifact inputManifest =
-          (Artifact.DerivedArtifact) Iterables.getOnlyElement(symlinkTreeAction.getInputs());
+          (Artifact.DerivedArtifact) symlinkTreeAction.getInputs().getSingleton();
       ActionLookupData inputManifestGeneratingKey = inputManifest.getGeneratingActionKey();
       Preconditions.checkState(
           inputManifestGeneratingKey.getActionLookupKey().equals(filesetActionLookupKey),
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindStrategy.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindStrategy.java
index f2fe907..3665fb1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindStrategy.java
@@ -385,7 +385,7 @@
       ArrayList<Artifact.DerivedArtifact> newlyVisitedArtifacts,
       ArrayList<ActionLookupData> newlyVisitedActions) {
 
-    for (Artifact input : action.getInputs()) {
+    for (Artifact input : action.getInputs().toList()) {
       if (input.isSourceArtifact()) {
         continue;
       }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionSketchFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionSketchFunction.java
index 454adae..3691662 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionSketchFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionSketchFunction.java
@@ -98,7 +98,7 @@
     Action action = actionLookupValue.getAction(actionLookupData.getActionIndex());
     List<Artifact> srcArtifacts = new ArrayList<>();
     List<SketchKey> depActions = new ArrayList<>();
-    for (Artifact artifact : action.getInputs()) {
+    for (Artifact artifact : action.getInputs().toList()) {
       if (artifact.isSourceArtifact()) {
         srcArtifacts.add(artifact);
       } else {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
index 690a569f..932a43c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
@@ -36,7 +36,6 @@
 import com.google.devtools.build.lib.actions.FilesetTraversalParams.PackageBoundaryMode;
 import com.google.devtools.build.lib.actions.MissingInputFileException;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalFunction.RecursiveFilesystemTraversalException;
 import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile;
@@ -263,7 +262,7 @@
         return null;
       }
       Fingerprint fp = new Fingerprint();
-      for (ResolvedFile file : value.getTransitiveFiles()) {
+      for (ResolvedFile file : value.getTransitiveFiles().toList()) {
         fp.addString(file.getNameInSymlinkTree().getPathString());
         fp.addBytes(file.getMetadata().getDigest());
       }
@@ -321,11 +320,8 @@
         ImmutableList.builder();
     ImmutableList.Builder<Pair<Artifact, TreeArtifactValue>> directoryInputsBuilder =
         ImmutableList.builder();
-    Iterable<Artifact> inputs = action.getInputs();
-    if (inputs instanceof NestedSet) {
-      // Avoid iterating over nested set twice.
-      inputs = ((NestedSet<Artifact>) inputs).toList();
-    }
+    // Avoid iterating over nested set twice.
+    Iterable<Artifact> inputs = action.getInputs().toList();
     Map<SkyKey, SkyValue> values = env.getValues(Artifact.keys(inputs));
     if (env.valuesMissing()) {
       return null;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
index f3926b7..c3abfdb 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java
@@ -202,7 +202,7 @@
         encounteredPackageErrors.set(true);
       }
 
-      for (String packageName : lookup.getPackages()) {
+      for (String packageName : lookup.getPackages().toList()) {
         // TODO(bazel-team): Make RecursivePkgValue return NestedSet<PathFragment> so this transform
         // is unnecessary.
         PathFragment packageNamePathFragment = PathFragment.create(packageName);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
index 990a39e..39013ad 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
@@ -65,7 +65,7 @@
           root.asPath(),
           repository.getName());
       ImmutableList.Builder<PackageIdentifier> packageIds = ImmutableList.builder();
-      for (String packageName : lookup.getPackages()) {
+      for (String packageName : lookup.getPackages().toList()) {
         // TODO(bazel-team): Make RecursivePkgValue return NestedSet<PathFragment> so this transform
         // is unnecessary.
         PathFragment packageNamePathFragment = PathFragment.create(packageName);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
index 1fafa05..03eada4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
@@ -33,9 +33,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetView;
-import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.query2.aquery.AqueryActionFilter;
 import com.google.devtools.build.lib.query2.aquery.AqueryUtils;
@@ -185,7 +183,7 @@
     if (includeParamFiles) {
       // Assumption: if an Action takes a params file as an input, it will be used
       // to provide params to the command.
-      for (Artifact input : action.getInputs()) {
+      for (Artifact input : action.getInputs().toList()) {
         String inputFileExecPath = input.getExecPathString();
         if (getParamFileNameToContentMap().containsKey(inputFileExecPath)) {
           AnalysisProtos.ParamFile paramFile =
@@ -225,11 +223,8 @@
 
     if (includeArtifacts) {
       // Store inputs
-      Iterable<Artifact> inputs = action.getInputs();
-      if (!(inputs instanceof NestedSet)) {
-        inputs = NestedSetBuilder.wrap(Order.STABLE_ORDER, inputs);
-      }
-      NestedSetView<Artifact> nestedSetView = new NestedSetView<>((NestedSet<Artifact>) inputs);
+      NestedSet<Artifact> inputs = action.getInputs();
+      NestedSetView<Artifact> nestedSetView = new NestedSetView<>(inputs);
 
       if (nestedSetView.directs().size() > 0 || nestedSetView.transitives().size() > 0) {
         actionBuilder.addInputDepSetIds(knownNestedSets.dataToId(nestedSetView));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java
index fa36e5e..f973d15 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java
@@ -33,9 +33,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetView;
-import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.query2.aquery.AqueryActionFilter;
 import com.google.devtools.build.lib.query2.aquery.AqueryUtils;
@@ -181,7 +179,7 @@
     if (includeParamFiles) {
       // Assumption: if an Action takes a params file as an input, it will be used
       // to provide params to the command.
-      for (Artifact input : action.getInputs()) {
+      for (Artifact input : action.getInputs().toList()) {
         String inputFileExecPath = input.getExecPathString();
         if (getParamFileNameToContentMap().containsKey(inputFileExecPath)) {
           AnalysisProtosV2.ParamFile paramFile =
@@ -221,11 +219,8 @@
 
     if (includeArtifacts) {
       // Store inputs
-      Iterable<Artifact> inputs = action.getInputs();
-      if (!(inputs instanceof NestedSet)) {
-        inputs = NestedSetBuilder.wrap(Order.STABLE_ORDER, inputs);
-      }
-      NestedSetView<Artifact> nestedSetView = new NestedSetView<>((NestedSet<Artifact>) inputs);
+      NestedSet<Artifact> inputs = action.getInputs();
+      NestedSetView<Artifact> nestedSetView = new NestedSetView<>(inputs);
 
       if (nestedSetView.directs().size() > 0 || nestedSetView.transitives().size() > 0) {
         actionBuilder.addInputDepSetIds(