ToolchainContext directly implements SkylarkValue and SkylarkIndexable.

Change-Id: I355b138e143771fd826ab03951df821ea7d58ac5
PiperOrigin-RevId: 201740564
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 d3c2139..c16e95d 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 @@
     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 a23dccd..dea3985 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.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 @@
   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 @@
     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 @@
 
   /** 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 @@
     return toolchains.build();
   }
 
-  /** Tracks the mapping from toolchain type label to {@link ToolchainInfo} provider. */
-  public class ResolvedToolchainProviders implements SkylarkValue, SkylarkIndexable {
+  // Implement SkylarkValue and SkylarkIndexable.
 
-    private final ImmutableMap<Label, ToolchainInfo> toolchains;
+  @Override
+  public boolean isImmutable() {
+    return true;
+  }
 
-    private ResolvedToolchainProviders(ImmutableMap<Label, ToolchainInfo> toolchains) {
-      this.toolchains = toolchains;
-    }
+  @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(">");
+  }
 
-    @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(">");
-    }
-
-    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);
+  @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);
+    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 47336c0..22e9058 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 @@
     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 2634773..5dec148 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 @@
   @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 0139ddf..1d0c229 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.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 @@
         && 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 c119185..63a94cf 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.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 @@
 
   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 71e1be1..cbee20e 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 @@
               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 3441c52..3bc97fc 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 @@
 
 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 {}