Move UnloadedToolchainContext to a top-level class.

Part of work on execution transitions, #7935.

Closes #7963.

PiperOrigin-RevId: 242199824
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
index 86b8601..4c17651 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
@@ -22,20 +22,15 @@
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Table;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
 import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
-import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils;
-import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
 import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
-import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import com.google.devtools.build.lib.skyframe.ConstraintValueLookupUtil;
 import com.google.devtools.build.lib.skyframe.ConstraintValueLookupUtil.InvalidConstraintValueException;
@@ -451,116 +446,6 @@
     return Optional.empty();
   }
 
-  /**
-   * Represents the state of toolchain resolution once the specific required toolchains have been
-   * determined, but before the toolchain dependencies have been resolved.
-   */
-  @AutoValue
-  public abstract static class UnloadedToolchainContext {
-
-    static Builder builder() {
-      return new AutoValue_ToolchainResolver_UnloadedToolchainContext.Builder();
-    }
-
-    /** Builder class to help create the {@link UnloadedToolchainContext}. */
-    @AutoValue.Builder
-    public interface Builder {
-      /** Sets a description of the target being used, for error messaging. */
-      Builder setTargetDescription(String targetDescription);
-
-      /** Sets the selected execution platform that these toolchains use. */
-      Builder setExecutionPlatform(PlatformInfo executionPlatform);
-
-      /** Sets the target platform that these toolchains generate output for. */
-      Builder setTargetPlatform(PlatformInfo targetPlatform);
-
-      /** Sets the toolchain types that were requested. */
-      Builder setRequiredToolchainTypes(Set<ToolchainTypeInfo> requiredToolchainTypes);
-
-      Builder setToolchainTypeToResolved(
-          ImmutableBiMap<ToolchainTypeInfo, Label> toolchainTypeToResolved);
-
-      UnloadedToolchainContext build();
-    }
-
-    /** Returns a description of the target being used, for error messaging. */
-    abstract String targetDescription();
-
-    /** Returns the selected execution platform that these toolchains use. */
-    abstract PlatformInfo executionPlatform();
-
-    /** Returns the target platform that these toolchains generate output for. */
-    abstract PlatformInfo targetPlatform();
-
-    /** Returns the toolchain types that were requested. */
-    abstract ImmutableSet<ToolchainTypeInfo> requiredToolchainTypes();
-
-    /** The map of toolchain type to resolved toolchain to be used. */
-    abstract ImmutableBiMap<ToolchainTypeInfo, Label> toolchainTypeToResolved();
-
-    /** Returns the labels of the specific toolchains being used. */
-    public ImmutableSet<Label> resolvedToolchainLabels() {
-      return toolchainTypeToResolved().values();
-    }
-
-    /**
-     * Finishes preparing the {@link ResolvedToolchainContext} by finding the specific toolchain
-     * providers to be used for each toolchain type.
-     */
-    public ResolvedToolchainContext load(Iterable<ConfiguredTargetAndData> toolchainTargets)
-        throws ToolchainException {
-
-      ResolvedToolchainContext.Builder toolchainContext =
-          ResolvedToolchainContext.builder()
-              .setTargetDescription(targetDescription())
-              .setExecutionPlatform(executionPlatform())
-              .setTargetPlatform(targetPlatform())
-              .setRequiredToolchainTypes(requiredToolchainTypes())
-              .setResolvedToolchainLabels(resolvedToolchainLabels());
-
-      ImmutableMap.Builder<ToolchainTypeInfo, ToolchainInfo> toolchains =
-          new ImmutableMap.Builder<>();
-      ImmutableList.Builder<TemplateVariableInfo> templateVariableProviders =
-          new ImmutableList.Builder<>();
-      for (ConfiguredTargetAndData target : toolchainTargets) {
-        Label discoveredLabel;
-        // Aliases are in toolchainTypeToResolved by the original alias label, not via the final
-        // target's label.
-        if (target.getConfiguredTarget() instanceof AliasConfiguredTarget) {
-          discoveredLabel =
-              ((AliasConfiguredTarget) target.getConfiguredTarget()).getOriginalLabel();
-        } else {
-          discoveredLabel = target.getConfiguredTarget().getLabel();
-        }
-        ToolchainTypeInfo toolchainType = toolchainTypeToResolved().inverse().get(discoveredLabel);
-        ToolchainInfo toolchainInfo = PlatformProviderUtils.toolchain(target.getConfiguredTarget());
-
-        // If the toolchainType hadn't been resolved to an actual target, resolution would have
-        // failed with an error much earlier. However, the target might still not be an actual
-        // toolchain.
-        if (toolchainType != null) {
-          if (toolchainInfo != null) {
-            toolchains.put(toolchainType, toolchainInfo);
-          } else {
-            throw new TargetNotToolchainException(toolchainType, discoveredLabel);
-          }
-        }
-
-        // Find any template variables present for this toolchain.
-        TemplateVariableInfo templateVariableInfo =
-            target.getConfiguredTarget().get(TemplateVariableInfo.PROVIDER);
-        if (templateVariableInfo != null) {
-          templateVariableProviders.add(templateVariableInfo);
-        }
-      }
-
-      return toolchainContext
-          .setToolchains(toolchains.build())
-          .setTemplateVariableProviders(templateVariableProviders.build())
-          .build();
-    }
-  }
-
   private static final class ValueMissingException extends Exception {
     private ValueMissingException() {
       super();
@@ -611,18 +496,4 @@
               missingToolchainTypes.stream().map(Label::toString).collect(joining(", "))));
     }
   }
-
-  /**
-   * Exception used when a toolchain type is required but the resolved target does not have
-   * ToolchainInfo.
-   */
-  static final class TargetNotToolchainException extends ToolchainException {
-    TargetNotToolchainException(ToolchainTypeInfo toolchainType, Label resolvedTargetLabel) {
-      super(
-          String.format(
-              "toolchain type %s resolved to target %s, but that target does not provide"
-                  + " ToolchainInfo",
-              toolchainType.typeLabel(), resolvedTargetLabel));
-    }
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/UnloadedToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/UnloadedToolchainContext.java
new file mode 100644
index 0000000..5180f14
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/UnloadedToolchainContext.java
@@ -0,0 +1,143 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.analysis;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
+import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils;
+import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
+import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
+import com.google.devtools.build.lib.skyframe.ToolchainException;
+import java.util.Set;
+
+/**
+ * Represents the state of toolchain resolution once the specific required toolchains have been
+ * determined, but before the toolchain dependencies have been resolved.
+ */
+@AutoValue
+public abstract class UnloadedToolchainContext implements ToolchainContext {
+
+  static Builder builder() {
+    return new AutoValue_UnloadedToolchainContext.Builder();
+  }
+
+  /** Builder class to help create the {@link UnloadedToolchainContext}. */
+  @AutoValue.Builder
+  public interface Builder {
+    /** Sets a description of the target being used, for error messaging. */
+    Builder setTargetDescription(String targetDescription);
+
+    /** Sets the selected execution platform that these toolchains use. */
+    Builder setExecutionPlatform(PlatformInfo executionPlatform);
+
+    /** Sets the target platform that these toolchains generate output for. */
+    Builder setTargetPlatform(PlatformInfo targetPlatform);
+
+    /** Sets the toolchain types that were requested. */
+    Builder setRequiredToolchainTypes(Set<ToolchainTypeInfo> requiredToolchainTypes);
+
+    Builder setToolchainTypeToResolved(
+        ImmutableBiMap<ToolchainTypeInfo, Label> toolchainTypeToResolved);
+
+    UnloadedToolchainContext build();
+  }
+
+  /** Returns a description of the target being used, for error messaging. */
+  abstract String targetDescription();
+
+  /** The map of toolchain type to resolved toolchain to be used. */
+  abstract ImmutableBiMap<ToolchainTypeInfo, Label> toolchainTypeToResolved();
+
+  @Override
+  public ImmutableSet<Label> resolvedToolchainLabels() {
+    return toolchainTypeToResolved().values();
+  }
+
+  /**
+   * Finishes preparing the {@link ResolvedToolchainContext} by finding the specific toolchain
+   * providers to be used for each toolchain type.
+   */
+  public ResolvedToolchainContext load(Iterable<ConfiguredTargetAndData> toolchainTargets)
+      throws ToolchainException {
+
+    ResolvedToolchainContext.Builder toolchainContext =
+        ResolvedToolchainContext.builder()
+            .setTargetDescription(targetDescription())
+            .setExecutionPlatform(executionPlatform())
+            .setTargetPlatform(targetPlatform())
+            .setRequiredToolchainTypes(requiredToolchainTypes())
+            .setResolvedToolchainLabels(resolvedToolchainLabels());
+
+    ImmutableMap.Builder<ToolchainTypeInfo, ToolchainInfo> toolchains =
+        new ImmutableMap.Builder<>();
+    ImmutableList.Builder<TemplateVariableInfo> templateVariableProviders =
+        new ImmutableList.Builder<>();
+    for (ConfiguredTargetAndData target : toolchainTargets) {
+      Label discoveredLabel;
+      // Aliases are in toolchainTypeToResolved by the original alias label, not via the final
+      // target's label.
+      if (target.getConfiguredTarget() instanceof AliasConfiguredTarget) {
+        discoveredLabel = ((AliasConfiguredTarget) target.getConfiguredTarget()).getOriginalLabel();
+      } else {
+        discoveredLabel = target.getConfiguredTarget().getLabel();
+      }
+      ToolchainTypeInfo toolchainType = toolchainTypeToResolved().inverse().get(discoveredLabel);
+      ToolchainInfo toolchainInfo = PlatformProviderUtils.toolchain(target.getConfiguredTarget());
+
+      // If the toolchainType hadn't been resolved to an actual target, resolution would have
+      // failed with an error much earlier. However, the target might still not be an actual
+      // toolchain.
+      if (toolchainType != null) {
+        if (toolchainInfo != null) {
+          toolchains.put(toolchainType, toolchainInfo);
+        } else {
+          throw new TargetNotToolchainException(toolchainType, discoveredLabel);
+        }
+      }
+
+      // Find any template variables present for this toolchain.
+      TemplateVariableInfo templateVariableInfo =
+          target.getConfiguredTarget().get(TemplateVariableInfo.PROVIDER);
+      if (templateVariableInfo != null) {
+        templateVariableProviders.add(templateVariableInfo);
+      }
+    }
+
+    return toolchainContext
+        .setToolchains(toolchains.build())
+        .setTemplateVariableProviders(templateVariableProviders.build())
+        .build();
+  }
+
+  /**
+   * Exception used when a toolchain type is required but the resolved target does not have
+   * ToolchainInfo.
+   */
+  static final class TargetNotToolchainException extends ToolchainException {
+    TargetNotToolchainException(ToolchainTypeInfo toolchainType, Label resolvedTargetLabel) {
+      super(
+          String.format(
+              "toolchain type %s resolved to target %s, but that target does not provide"
+                  + " ToolchainInfo",
+              toolchainType.typeLabel(), resolvedTargetLabel));
+    }
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index f83ea70..03665ed 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -32,7 +32,7 @@
 import com.google.devtools.build.lib.analysis.ResolvedToolchainContext;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
 import com.google.devtools.build.lib.analysis.ToolchainResolver;
-import com.google.devtools.build.lib.analysis.ToolchainResolver.UnloadedToolchainContext;
+import com.google.devtools.build.lib.analysis.UnloadedToolchainContext;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 673108b..8454b96 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -37,7 +37,7 @@
 import com.google.devtools.build.lib.analysis.ResolvedToolchainContext;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
 import com.google.devtools.build.lib.analysis.ToolchainResolver;
-import com.google.devtools.build.lib.analysis.ToolchainResolver.UnloadedToolchainContext;
+import com.google.devtools.build.lib.analysis.UnloadedToolchainContext;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ToolchainResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ToolchainResolverTest.java
index f262b26..2a90c90 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ToolchainResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ToolchainResolverTest.java
@@ -23,7 +23,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.ToolchainResolver.NoMatchingPlatformException;
-import com.google.devtools.build.lib.analysis.ToolchainResolver.UnloadedToolchainContext;
 import com.google.devtools.build.lib.analysis.ToolchainResolver.UnresolvedToolchainsException;
 import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
 import com.google.devtools.build.lib.analysis.util.AnalysisMock;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
index 0b7b547..0a5af1a 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
@@ -42,8 +42,8 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
 import com.google.devtools.build.lib.analysis.ToolchainResolver;
-import com.google.devtools.build.lib.analysis.ToolchainResolver.UnloadedToolchainContext;
 import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
+import com.google.devtools.build.lib.analysis.UnloadedToolchainContext;
 import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
 import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;