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;