diff options
author | 2018-06-22 14:20:22 -0700 | |
---|---|---|
committer | 2018-06-22 14:22:15 -0700 | |
commit | c8bd74f76c3e02657571432d2fe4d923803410be (patch) | |
tree | c4cf818a9e8d9bd4723c830331311697b8aaeae5 /src/main/java/com/google/devtools/build | |
parent | 368bc8ac6080cfce5933ef7ff5d566619bb93add (diff) |
ToolchainContext directly implements SkylarkValue and SkylarkIndexable.
Change-Id: I355b138e143771fd826ab03951df821ea7d58ac5
PiperOrigin-RevId: 201740564
Diffstat (limited to 'src/main/java/com/google/devtools/build')
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 {} |