Skylark: Make ctx.var a dictionary.

ctx.var(x) is kept for compatibility and should be removed after next
release.

--
MOS_MIGRATED_REVID=88438195
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
index 8c98f5f..c0034dc 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfigurationMakeVariableContext.java
@@ -14,10 +14,12 @@
 
 package com.google.devtools.build.lib.analysis;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.MakeVariableExpander.ExpansionException;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.packages.Package;
 
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
@@ -53,4 +55,14 @@
 
     return value;
   }
+
+  public ImmutableMap<String, String> collectMakeVariables() {
+    Map<String, String> map = new LinkedHashMap<>();
+    // Collect variables in the reverse order as in lookupMakeVariable
+    // because each update is overwriting.
+    map.putAll(pkg.getAllMakeVariables(platform));
+    map.putAll(globalEnv);
+    map.putAll(commandLineEnv);
+    return ImmutableMap.copyOf(map);
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 900f901..5d2bafd 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -452,6 +452,17 @@
   }
 
   /**
+   * Returns all make variables for a given platform.
+   */
+  public Map<String, String> getAllMakeVariables(String platform) {
+    ImmutableMap.Builder<String, String> map = ImmutableMap.builder();
+    for (String var : makeEnv.getBindings().keySet()) {
+      map.put(var, makeEnv.lookup(var, platform));
+    }
+    return map.build();
+  }
+
+  /**
    * Returns the label of this package's BUILD file.
    *
    * Typically <code>getBuildFileLabel().getName().equals("BUILD")</code> --
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
index 2d5bc07..d8a7fc8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java
@@ -115,6 +115,8 @@
 
   private final ImmutableMap<Artifact, FilesToRunProvider> executableRunfilesMap;
 
+  private final Map<String, String> makeVariables;
+
   /**
    * In native code, private values start with $.
    * In Skylark, private values start with _, because of the grammar.
@@ -245,6 +247,8 @@
     targetsObject = new SkylarkClassObject(targetsBuilder.build(),
         "No such targets. Make sure there is a '%s' label or label_list type attribute");
     executableRunfilesMap = executableRunfilesbuilder.build();
+
+    makeVariables = ruleContext.getConfigurationMakeVariableContext().collectMakeVariables();
   }
 
   private void addOutput(HashMap<String, Object> outputsBuilder, String key, Object value)
@@ -386,6 +390,12 @@
     return outputsObject;
   }
 
+  @SkylarkCallable(structField = true,
+      doc = "Dictionary (String to String) of configuration variables")
+  public Map<String, String> var() {
+    return makeVariables;
+  }
+
   @Override
   public String toString() {
     return ruleContext.getLabel().toString();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
index ce21c42..7e11bda 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleImplementationFunctions.java
@@ -340,9 +340,12 @@
         }
       };
 
-
+  // Deprecated function.
+  // Use the new ctx.var field, which is a dictionary.
+  // TODO(bazel-team): Remove function when user code has been updated.
   @SkylarkBuiltin(name = "var",
       doc = "get the value bound to a configuration variable in the context",
+      hidden = true,
       objectType = SkylarkRuleContext.class,
       mandatoryParams = {
         @Param(name = "name", type = String.class, doc = "the name of the variable")