starlark: remove Dict.of(K, V) constructors

They are mostly used in tests, and aren't necessary even there.

PiperOrigin-RevId: 340666283
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
index 8f141dd..d70250d 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD
@@ -48,6 +48,7 @@
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/net/starlark/java/annot",
         "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/syntax",
         "//third_party:guava",
         "//third_party:java-diff-utils",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
index 1f41676..a0e067c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
@@ -86,12 +86,12 @@
 import javax.annotation.Nullable;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
-import net.starlark.java.eval.Mutability;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.Starlark;
 import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkSemantics;
 import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.syntax.Location;
 
 /** Starlark API for the repository_rule's context. */
 public class StarlarkRepositoryContext
@@ -770,8 +770,7 @@
           new IOException("thread interrupted"), Transience.TRANSIENT);
     } catch (IOException e) {
       if (allowFail) {
-        Dict<String, Object> dict = Dict.of((Mutability) null, "success", false);
-        return StructProvider.STRUCT.createWithBuiltinLocation(dict);
+        return StructProvider.STRUCT.create(ImmutableMap.of("success", false), Location.BUILTIN);
       } else {
         throw new RepositoryFunctionException(e, Transience.TRANSIENT);
       }
@@ -898,8 +897,7 @@
     } catch (IOException e) {
       env.getListener().post(w);
       if (allowFail) {
-        Dict<String, Object> dict = Dict.of((Mutability) null, "success", false);
-        return StructProvider.STRUCT.createWithBuiltinLocation(dict);
+        return StructProvider.STRUCT.create(ImmutableMap.of("success", false), Location.BUILTIN);
       } else {
         throw new RepositoryFunctionException(e, Transience.TRANSIENT);
       }
@@ -1020,7 +1018,7 @@
           Transience.PERSISTENT);
     }
 
-    Dict.Builder<String, Object> out = Dict.builder();
+    ImmutableMap.Builder<String, Object> out = ImmutableMap.builder();
     out.put("success", true);
     out.put("integrity", finalChecksum.toSubresourceIntegrity());
 
@@ -1028,7 +1026,7 @@
     if (finalChecksum.getKeyType() == KeyType.SHA256) {
       out.put("sha256", finalChecksum.toString());
     }
-    return StructProvider.STRUCT.createWithBuiltinLocation(out.buildImmutable());
+    return StructProvider.STRUCT.create(out.build(), Location.BUILTIN);
   }
 
   private static ImmutableList<String> checkAllUrls(Iterable<?> urlList) throws EvalException {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
index 20e385a..d7cfe10 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
@@ -17,7 +17,6 @@
 import static com.google.devtools.build.lib.packages.PackageFactory.getContext;
 
 import com.google.common.base.Joiner;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -139,8 +138,7 @@
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("native.existing_rule");
     PackageContext context = getContext(thread);
     Target target = context.pkgBuilder.getTarget(name);
-    Dict<String, Object> rule = targetDict(target, thread.mutability());
-    return rule != null ? rule : Starlark.NONE;
+    return target instanceof Rule ? getRuleDict((Rule) target, thread.mutability()) : Starlark.NONE;
   }
 
   /*
@@ -154,16 +152,13 @@
     PackageContext context = getContext(thread);
     Collection<Target> targets = context.pkgBuilder.getTargets();
     Mutability mu = thread.mutability();
-    Dict<String, Dict<String, Object>> rules = Dict.of(mu);
+    Dict.Builder<String, Dict<String, Object>> rules = Dict.builder();
     for (Target t : targets) {
       if (t instanceof Rule) {
-        Dict<String, Object> rule = targetDict(t, mu);
-        Preconditions.checkNotNull(rule);
-        rules.putEntry(t.getName(), rule);
+        rules.put(t.getName(), getRuleDict((Rule) t, mu));
       }
     }
-
-    return rules;
+    return rules.build(mu);
   }
 
   @Override
@@ -279,15 +274,9 @@
     return packageId.getRepository().toString();
   }
 
-  @Nullable
-  private static Dict<String, Object> targetDict(Target target, Mutability mu)
-      throws EvalException {
-    if (!(target instanceof Rule)) {
-      return null;
-    }
-    Dict<String, Object> values = Dict.of(mu);
+  private static Dict<String, Object> getRuleDict(Rule rule, Mutability mu) throws EvalException {
+    Dict.Builder<String, Object> values = Dict.builder();
 
-    Rule rule = (Rule) target;
     for (Attribute attr : rule.getAttributes()) {
       if (!Character.isAlphabetic(attr.getName().charAt(0))) {
         continue;
@@ -300,21 +289,21 @@
       }
 
       try {
-        Object val = starlarkifyValue(mu, rule.getAttr(attr.getName()), target.getPackage());
+        Object val = starlarkifyValue(mu, rule.getAttr(attr.getName()), rule.getPackage());
         if (val == null) {
           continue;
         }
-        values.putEntry(attr.getName(), val);
+        values.put(attr.getName(), val);
       } catch (NotRepresentableException e) {
         throw new NotRepresentableException(
             String.format(
-                "target %s, attribute %s: %s", target.getName(), attr.getName(), e.getMessage()));
+                "target %s, attribute %s: %s", rule.getName(), attr.getName(), e.getMessage()));
       }
     }
 
-    values.putEntry("name", rule.getName());
-    values.putEntry("kind", rule.getRuleClass());
-    return values;
+    values.put("name", rule.getName());
+    values.put("kind", rule.getRuleClass());
+    return values.build(mu);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
index 2a1fd88..dcdd3a5 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
@@ -43,19 +43,14 @@
     return create(kwargs, thread.getCallerLocation());
   }
 
-  // Called from StarlarkRepositoryContext. TODO(adonovan): eliminate.
-  public StructImpl createWithBuiltinLocation(Dict<String, Object> kwargs) throws EvalException {
-    return create(kwargs, Location.BUILTIN);
-  }
-
-  private StructImpl create(Dict<String, Object> kwargs, Location location) throws EvalException {
-    if (kwargs.containsKey("to_json")) {
+  public StructImpl create(Map<String, Object> fields, Location location) throws EvalException {
+    if (fields.containsKey("to_json")) {
       throw Starlark.errorf("cannot override built-in struct function 'to_json'");
     }
-    if (kwargs.containsKey("to_proto")) {
+    if (fields.containsKey("to_proto")) {
       throw Starlark.errorf("cannot override built-in struct function 'to_proto'");
     }
-    return StarlarkInfo.create(this, kwargs, location);
+    return StarlarkInfo.create(this, fields, location);
   }
 
   /**
@@ -65,7 +60,7 @@
    * providers, such as the {@code native} object, and the struct fields of {@code ctx} like {@code
    * ctx.attr}.
    */
-  public StarlarkInfo create(Map<String, Object> values, String errorMessageFormatForUnknownField) {
-    return StarlarkInfo.createWithCustomMessage(this, values, errorMessageFormatForUnknownField);
+  public StarlarkInfo create(Map<String, Object> fields, String errorMessageFormatForUnknownField) {
+    return StarlarkInfo.createWithCustomMessage(this, fields, errorMessageFormatForUnknownField);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java
index bdda8ce..a5550a4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidStarlarkData.java
@@ -47,7 +47,6 @@
 import javax.annotation.Nullable;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
-import net.starlark.java.eval.Mutability;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.Starlark;
 import net.starlark.java.eval.StarlarkList;
@@ -190,12 +189,10 @@
         mergeRes(ctx, manifest, resources, deps, neverlink, enableDataBinding);
     JavaInfo javaInfo =
         getJavaInfoForRClassJar(validated.getClassJar(), validated.getJavaSourceJar());
-    return Dict.of(
-        (Mutability) null,
-        AndroidResourcesInfo.PROVIDER,
-        validated.toProvider(),
-        JavaInfo.PROVIDER,
-        javaInfo);
+    return Dict.<Provider, NativeInfo>builder()
+        .put(AndroidResourcesInfo.PROVIDER, validated.toProvider())
+        .put(JavaInfo.PROVIDER, javaInfo)
+        .buildImmutable();
   }
 
   @Override