aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar John Cater <jcater@google.com>2018-06-22 14:20:22 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-06-22 14:22:15 -0700
commitc8bd74f76c3e02657571432d2fe4d923803410be (patch)
treec4cf818a9e8d9bd4723c830331311697b8aaeae5 /src/main/java/com/google/devtools/build
parent368bc8ac6080cfce5933ef7ff5d566619bb93add (diff)
ToolchainContext directly implements SkylarkValue and SkylarkIndexable.
Change-Id: I355b138e143771fd826ab03951df821ea7d58ac5 PiperOrigin-RevId: 201740564
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java147
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/Util.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java12
8 files changed, 79 insertions, 105 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index d3c2139207..c16e95dd29 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -1087,7 +1087,7 @@ public final class RuleContext extends TargetContext
if (getToolchainContext() == null) {
return null;
}
- return getToolchainContext().getExecutionPlatform();
+ return getToolchainContext().executionPlatform();
}
private void checkAttribute(String attributeName, Mode mode) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
index a23dccdad5..dea39859a9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
@@ -34,20 +34,18 @@ import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
import com.google.devtools.build.lib.skylarkbuildapi.ToolchainContextApi;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.EvalUtils;
-import com.google.devtools.build.lib.syntax.SkylarkIndexable;
import com.google.devtools.build.lib.util.OrderedSetMultimap;
import java.util.Optional;
import java.util.Set;
import java.util.stream.StreamSupport;
-import javax.annotation.Nullable;
/** Contains toolchain-related information needed for a {@link RuleContext}. */
@Immutable
@ThreadSafe
public class ToolchainContext implements ToolchainContextApi {
+
public static ToolchainContext create(
String targetDescription,
PlatformInfo executionPlatform,
@@ -78,7 +76,7 @@ public class ToolchainContext implements ToolchainContextApi {
private final ResolvedToolchainLabels resolvedToolchainLabels;
/** Stores the actual ToolchainInfo provider for each toolchain type. */
- private ResolvedToolchainProviders resolvedToolchainProviders;
+ private ImmutableMap<Label, ToolchainInfo> toolchainProviders;
private ToolchainContext(
String targetDescription,
@@ -91,36 +89,29 @@ public class ToolchainContext implements ToolchainContextApi {
this.targetPlatform = targetPlatform;
this.requiredToolchains = ImmutableList.copyOf(requiredToolchains);
this.resolvedToolchainLabels = resolvedToolchainLabels;
- this.resolvedToolchainProviders =
- new ResolvedToolchainProviders(ImmutableMap.<Label, ToolchainInfo>of());
+ this.toolchainProviders = ImmutableMap.of();
}
- public PlatformInfo getExecutionPlatform() {
+ public PlatformInfo executionPlatform() {
return executionPlatform;
}
- public PlatformInfo getTargetPlatform() {
+ public PlatformInfo targetPlatform() {
return targetPlatform;
}
- public ImmutableList<Label> getRequiredToolchains() {
+ public ImmutableList<Label> requiredToolchainTypes() {
return requiredToolchains;
}
public void resolveToolchains(
OrderedSetMultimap<Attribute, ConfiguredTargetAndData> prerequisiteMap) {
if (!this.requiredToolchains.isEmpty()) {
- this.resolvedToolchainProviders =
- new ResolvedToolchainProviders(findToolchains(resolvedToolchainLabels, prerequisiteMap));
+ this.toolchainProviders = findToolchains(resolvedToolchainLabels, prerequisiteMap);
}
}
- @Nullable
- public SkylarkIndexable getResolvedToolchainProviders() {
- return resolvedToolchainProviders;
- }
-
- public ImmutableSet<Label> getResolvedToolchainLabels() {
+ public ImmutableSet<Label> resolvedToolchainLabels() {
return resolvedToolchainLabels.getToolchainLabels();
}
@@ -133,6 +124,7 @@ public class ToolchainContext implements ToolchainContextApi {
/** Tracks the mapping from toolchain type label to the label of the actual resolved toolchain. */
private static class ResolvedToolchainLabels {
+
private final ImmutableBiMap<Label, Label> toolchainLabels;
private ResolvedToolchainLabels(ImmutableBiMap<Label, Label> toolchainLabels) {
@@ -185,80 +177,71 @@ public class ToolchainContext implements ToolchainContextApi {
return toolchains.build();
}
- /** Tracks the mapping from toolchain type label to {@link ToolchainInfo} provider. */
- public class ResolvedToolchainProviders implements SkylarkValue, SkylarkIndexable {
-
- private final ImmutableMap<Label, ToolchainInfo> toolchains;
+ // Implement SkylarkValue and SkylarkIndexable.
- private ResolvedToolchainProviders(ImmutableMap<Label, ToolchainInfo> toolchains) {
- this.toolchains = toolchains;
- }
-
- @Override
- public boolean isImmutable() {
- return true;
- }
+ @Override
+ public boolean isImmutable() {
+ return true;
+ }
- @Override
- public void repr(SkylarkPrinter printer) {
- printer.append("<toolchain_context.resolved_labels: ");
- printer.append(toolchains.keySet().stream()
- .map(key -> key.toString())
- .collect(joining(", ")));
- printer.append(">");
- }
+ @Override
+ public void repr(SkylarkPrinter printer) {
+ printer.append("<toolchain_context.resolved_labels: ");
+ printer.append(
+ toolchainProviders.keySet().stream().map(key -> key.toString()).collect(joining(", ")));
+ printer.append(">");
+ }
- private Label transformKey(Object key, Location loc) throws EvalException {
- if (key instanceof Label) {
- Label toolchainType = (Label) key;
- return toolchainType;
- } else if (key instanceof String) {
- Label toolchainType = null;
- String rawLabel = (String) key;
- try {
- toolchainType = Label.parseAbsolute(rawLabel);
- } catch (LabelSyntaxException e) {
- throw new EvalException(
- loc, String.format("Unable to parse toolchain %s: %s", rawLabel, e.getMessage()), e);
- }
- return toolchainType;
- } else {
+ private Label transformKey(Object key, Location loc) throws EvalException {
+ if (key instanceof Label) {
+ Label toolchainType = (Label) key;
+ return toolchainType;
+ } else if (key instanceof String) {
+ Label toolchainType = null;
+ String rawLabel = (String) key;
+ try {
+ toolchainType = Label.parseAbsolute(rawLabel);
+ } catch (LabelSyntaxException e) {
throw new EvalException(
- loc,
- String.format(
- "Toolchains only supports indexing by toolchain type, got %s instead",
- EvalUtils.getDataTypeName(key)));
+ loc, String.format("Unable to parse toolchain %s: %s", rawLabel, e.getMessage()), e);
}
+ return toolchainType;
+ } else {
+ throw new EvalException(
+ loc,
+ String.format(
+ "Toolchains only supports indexing by toolchain type, got %s instead",
+ EvalUtils.getDataTypeName(key)));
}
+ }
- @Override
- public ToolchainInfo getIndex(Object key, Location loc) throws EvalException {
- Label toolchainType = transformKey(key, loc);
-
- if (!requiredToolchains.contains(toolchainType)) {
- throw new EvalException(
- loc,
- String.format(
- "In %s, toolchain type %s was requested but only types [%s] are configured",
- targetDescription,
- toolchainType,
- requiredToolchains
- .stream()
- .map(toolchain -> toolchain.toString())
- .collect(joining())));
- }
- return toolchains.get(toolchainType);
+ @Override
+ public ToolchainInfo getIndex(Object key, Location loc) throws EvalException {
+ Label toolchainType = transformKey(key, loc);
+
+ if (!requiredToolchains.contains(toolchainType)) {
+ throw new EvalException(
+ loc,
+ String.format(
+ "In %s, toolchain type %s was requested but only types [%s] are configured",
+ targetDescription,
+ toolchainType,
+ requiredToolchains
+ .stream()
+ .map(toolchain -> toolchain.toString())
+ .collect(joining())));
}
+ return toolchainProviders.get(toolchainType);
+ }
- /** Returns the toolchain for the given type */
- public ToolchainInfo getForToolchainType(Label toolchainType) {
- return toolchains.get(toolchainType);
- }
+ /** Returns the toolchain for the given type */
+ public ToolchainInfo forToolchainType(Label toolchainType) {
+ return toolchainProviders.get(toolchainType);
+ }
- @Override
- public boolean containsKey(Object key, Location loc) throws EvalException {
- Label toolchainType = transformKey(key, loc);
- return toolchains.containsKey(toolchainType);
- }
+ @Override
+ public boolean containsKey(Object key, Location loc) throws EvalException {
+ Label toolchainType = transformKey(key, loc);
+ return toolchainProviders.containsKey(toolchainType);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Util.java b/src/main/java/com/google/devtools/build/lib/analysis/Util.java
index 47336c0d78..22e90583af 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Util.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Util.java
@@ -101,13 +101,13 @@ public abstract class Util {
ToolchainContext toolchainContext = ruleContext.getToolchainContext();
if (toolchainContext != null) {
BuildConfiguration config = ruleContext.getConfiguration();
- for (Label toolchain : toolchainContext.getResolvedToolchainLabels()) {
+ for (Label toolchain : toolchainContext.resolvedToolchainLabels()) {
maybeImplicitDeps.add(ConfiguredTargetKey.of(toolchain, config));
}
maybeImplicitDeps.add(
- ConfiguredTargetKey.of(toolchainContext.getExecutionPlatform().label(), config));
+ ConfiguredTargetKey.of(toolchainContext.executionPlatform().label(), config));
maybeImplicitDeps.add(
- ConfiguredTargetKey.of(toolchainContext.getTargetPlatform().label(), config));
+ ConfiguredTargetKey.of(toolchainContext.targetPlatform().label(), config));
}
return ImmutableSet.copyOf(Sets.difference(maybeImplicitDeps, explicitDeps));
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
index 2634773cdc..5dec1480bf 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
@@ -656,7 +656,7 @@ public final class SkylarkRuleContext implements SkylarkRuleContextApi {
@Override
public SkylarkIndexable toolchains() throws EvalException {
checkMutable("toolchains");
- return ruleContext.getToolchainContext().getResolvedToolchainProviders();
+ return ruleContext.getToolchainContext();
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
index 0139ddfade..1d0c229d88 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java
@@ -25,7 +25,6 @@ import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
-import com.google.devtools.build.lib.analysis.ToolchainContext.ResolvedToolchainProviders;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Options;
@@ -80,10 +79,8 @@ public class ToolchainType implements RuleConfiguredTargetFactory {
&& ruleContext
.getFragment(PlatformConfiguration.class)
.isToolchainTypeEnabled(ruleContext.getLabel())) {
- ResolvedToolchainProviders providers =
- (ResolvedToolchainProviders)
- ruleContext.getToolchainContext().getResolvedToolchainProviders();
- ToolchainInfo toolchainInfo = providers.getForToolchainType(ruleContext.getLabel());
+ ToolchainInfo toolchainInfo =
+ ruleContext.getToolchainContext().forToolchainType(ruleContext.getLabel());
if (toolchainInfo != null) {
toolchainInfo.addGlobalMakeVariables(fragmentBuilder);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index c1191850f8..63a94cf5f7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -38,7 +38,6 @@ import com.google.devtools.build.lib.analysis.PlatformConfiguration;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.StaticallyLinkedMarkerProvider;
-import com.google.devtools.build.lib.analysis.ToolchainContext.ResolvedToolchainProviders;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
@@ -455,10 +454,7 @@ public class CppHelper {
private static CcToolchainProvider getToolchainFromPlatformConstraints(
RuleContext ruleContext, Label toolchainType) {
- ResolvedToolchainProviders providers =
- (ResolvedToolchainProviders)
- ruleContext.getToolchainContext().getResolvedToolchainProviders();
- return (CcToolchainProvider) providers.getForToolchainType(toolchainType);
+ return (CcToolchainProvider) ruleContext.getToolchainContext().forToolchainType(toolchainType);
}
private static CcToolchainProvider getToolchainFromCrosstoolTop(
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 71e1be16bb..cbee20e43f 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
@@ -452,7 +452,7 @@ public final class ConfiguredTargetFunction implements SkyFunction {
configConditions,
toolchainContext == null
? ImmutableSet.of()
- : toolchainContext.getResolvedToolchainLabels(),
+ : toolchainContext.resolvedToolchainLabels(),
transitiveRootCauses,
defaultBuildOptions,
((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory());
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java
index 3441c52044..3bc97fcd83 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ToolchainContextApi.java
@@ -16,14 +16,12 @@ package com.google.devtools.build.lib.skylarkbuildapi;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.syntax.SkylarkIndexable;
-/**
- * Stores toolchains available to a given rule.
- */
+/** Stores toolchains available to a given rule. */
@SkylarkModule(
name = "ToolchainContext",
category = SkylarkModuleCategory.BUILTIN,
- doc = "Stores toolchains available to a given rule."
-)
-public interface ToolchainContextApi {
-}
+ doc = "Stores toolchains available to a given rule.")
+public interface ToolchainContextApi extends SkylarkValue, SkylarkIndexable {}