Added Builder for DeclaredToolchainInfo.

Part of the fix for #7548.

Closes #7552.

PiperOrigin-RevId: 235798206
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/DeclaredToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/DeclaredToolchainInfo.java
index 862d56d..8fa0e06 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/DeclaredToolchainInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/DeclaredToolchainInfo.java
@@ -44,17 +44,58 @@
   /** The label of the toolchain to resolve for use in toolchain-aware rules. */
   public abstract Label toolchainLabel();
 
-  /** Returns a new {@link DeclaredToolchainInfo} with the given data. */
-  public static DeclaredToolchainInfo create(
-      ToolchainTypeInfo toolchainType,
-      ImmutableList<ConstraintValueInfo> execConstraints,
-      ImmutableList<ConstraintValueInfo> targetConstraints,
-      Label toolchainLabel) {
-    return create(
-        toolchainType,
-        ConstraintCollection.builder().addConstraints(execConstraints).build(),
-        ConstraintCollection.builder().addConstraints(targetConstraints).build(),
-        toolchainLabel);
+  /** Builder class to assist in creating {@link DeclaredToolchainInfo} instances. */
+  public static class Builder {
+    private ToolchainTypeInfo toolchainType;
+    private ConstraintCollection.Builder execConstraints = ConstraintCollection.builder();
+    private ConstraintCollection.Builder targetConstraints = ConstraintCollection.builder();
+    private Label toolchainLabel;
+
+    /** Sets the type of the toolchain being declared. */
+    public Builder toolchainType(ToolchainTypeInfo toolchainType) {
+      this.toolchainType = toolchainType;
+      return this;
+    }
+
+    /** Adds constraints describing the execution environment. */
+    public Builder addExecConstraints(Iterable<ConstraintValueInfo> constraints) {
+      this.execConstraints.addConstraints(constraints);
+      return this;
+    }
+
+    /** Adds constraints describing the execution environment. */
+    public Builder addExecConstraints(ConstraintValueInfo... constraints) {
+      return addExecConstraints(ImmutableList.copyOf(constraints));
+    }
+
+    /** Adds constraints describing the target environment. */
+    public Builder addTargetConstraints(Iterable<ConstraintValueInfo> constraints) {
+      this.targetConstraints.addConstraints(constraints);
+      return this;
+    }
+
+    /** Adds constraints describing the target environment. */
+    public Builder addTargetConstraints(ConstraintValueInfo... constraints) {
+      return addTargetConstraints(ImmutableList.copyOf(constraints));
+    }
+
+    /** Sets the label of the toolchain to resolve for use in toolchain-aware rules. */
+    public Builder toolchainLabel(Label toolchainLabel) {
+      this.toolchainLabel = toolchainLabel;
+      return this;
+    }
+
+    /** Returns the newly created {@link DeclaredToolchainInfo} instance. */
+    public DeclaredToolchainInfo build() {
+      // TODO(katre): handle constraint duplication in attributes separately.
+      return new AutoValue_DeclaredToolchainInfo(
+          toolchainType, execConstraints.build(), targetConstraints.build(), toolchainLabel);
+    }
+  }
+
+  /** Returns a new {@link Builder} for creating {@link DeclaredToolchainInfo} instances. */
+  public static Builder builder() {
+    return new Builder();
   }
 
   @AutoCodec.Instantiator
diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/Toolchain.java b/src/main/java/com/google/devtools/build/lib/rules/platform/Toolchain.java
index 35bac2e..22cf191 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/platform/Toolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/platform/Toolchain.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.rules.platform;
 
-import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.FileProvider;
@@ -52,11 +51,12 @@
         ruleContext.attributes().get(ToolchainRule.TOOLCHAIN_ATTR, BuildType.NODEP_LABEL);
 
     DeclaredToolchainInfo registeredToolchain =
-        DeclaredToolchainInfo.create(
-            toolchainType,
-            ImmutableList.copyOf(execConstraints),
-            ImmutableList.copyOf(targetConstraints),
-            toolchainLabel);
+        DeclaredToolchainInfo.builder()
+            .toolchainType(toolchainType)
+            .addExecConstraints(execConstraints)
+            .addTargetConstraints(targetConstraints)
+            .toolchainLabel(toolchainLabel)
+            .build();
 
     return new RuleConfiguredTargetBuilder(ruleContext)
         .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/platform/DeclaredToolchainInfoTest.java b/src/test/java/com/google/devtools/build/lib/analysis/platform/DeclaredToolchainInfoTest.java
index 94b89d7..6c46871 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/platform/DeclaredToolchainInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/platform/DeclaredToolchainInfoTest.java
@@ -37,37 +37,42 @@
     new EqualsTester()
         .addEqualityGroup(
             // Base case.
-            DeclaredToolchainInfo.create(
-                ToolchainTypeInfo.create(makeLabel("//toolchain:tc1")),
-                ImmutableList.of(constraint1),
-                ImmutableList.of(constraint2),
-                makeLabel("//toolchain:toolchain1")),
-            DeclaredToolchainInfo.create(
-                ToolchainTypeInfo.create(makeLabel("//toolchain:tc1")),
-                ImmutableList.of(constraint1),
-                ImmutableList.of(constraint2),
-                makeLabel("//toolchain:toolchain1")))
+            DeclaredToolchainInfo.builder()
+                .toolchainType(ToolchainTypeInfo.create(makeLabel("//toolchain:tc1")))
+                .addExecConstraints(ImmutableList.of(constraint1))
+                .addTargetConstraints(ImmutableList.of(constraint2))
+                .toolchainLabel(makeLabel("//toolchain:toolchain1"))
+                .build(),
+            DeclaredToolchainInfo.builder()
+                .toolchainType(ToolchainTypeInfo.create(makeLabel("//toolchain:tc1")))
+                .addExecConstraints(ImmutableList.of(constraint1))
+                .addTargetConstraints(ImmutableList.of(constraint2))
+                .toolchainLabel(makeLabel("//toolchain:toolchain1"))
+                .build())
         .addEqualityGroup(
             // Different type.
-            DeclaredToolchainInfo.create(
-                ToolchainTypeInfo.create(makeLabel("//toolchain:tc2")),
-                ImmutableList.of(constraint1),
-                ImmutableList.of(constraint2),
-                makeLabel("//toolchain:toolchain1")))
+            DeclaredToolchainInfo.builder()
+                .toolchainType(ToolchainTypeInfo.create(makeLabel("//toolchain:tc2")))
+                .addExecConstraints(ImmutableList.of(constraint1))
+                .addTargetConstraints(ImmutableList.of(constraint2))
+                .toolchainLabel(makeLabel("//toolchain:toolchain1"))
+                .build())
         .addEqualityGroup(
             // Different constraints.
-            DeclaredToolchainInfo.create(
-                ToolchainTypeInfo.create(makeLabel("//toolchain:tc1")),
-                ImmutableList.of(constraint2),
-                ImmutableList.of(constraint1),
-                makeLabel("//toolchain:toolchain1")))
+            DeclaredToolchainInfo.builder()
+                .toolchainType(ToolchainTypeInfo.create(makeLabel("//toolchain:tc1")))
+                .addExecConstraints(ImmutableList.of(constraint2))
+                .addTargetConstraints(ImmutableList.of(constraint1))
+                .toolchainLabel(makeLabel("//toolchain:toolchain1"))
+                .build())
         .addEqualityGroup(
             // Different toolchain label.
-            DeclaredToolchainInfo.create(
-                ToolchainTypeInfo.create(makeLabel("//toolchain:tc1")),
-                ImmutableList.of(constraint1),
-                ImmutableList.of(constraint2),
-                makeLabel("//toolchain:toolchain2")))
+            DeclaredToolchainInfo.builder()
+                .toolchainType(ToolchainTypeInfo.create(makeLabel("//toolchain:tc1")))
+                .addExecConstraints(ImmutableList.of(constraint1))
+                .addTargetConstraints(ImmutableList.of(constraint2))
+                .toolchainLabel(makeLabel("//toolchain:toolchain2"))
+                .build())
         .testEquals();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
index 98c40fc..1fd6da1 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
@@ -280,17 +280,19 @@
   @Test
   public void testRegisteredToolchainsValue_equalsAndHashCode() {
     DeclaredToolchainInfo toolchain1 =
-        DeclaredToolchainInfo.create(
-            ToolchainTypeInfo.create(makeLabel("//test:toolchain")),
-            ImmutableList.of(),
-            ImmutableList.of(),
-            makeLabel("//test/toolchain_impl_1"));
+        DeclaredToolchainInfo.builder()
+            .toolchainType(ToolchainTypeInfo.create(makeLabel("//test:toolchain")))
+            .addExecConstraints(ImmutableList.of())
+            .addTargetConstraints(ImmutableList.of())
+            .toolchainLabel(makeLabel("//test/toolchain_impl_1"))
+            .build();
     DeclaredToolchainInfo toolchain2 =
-        DeclaredToolchainInfo.create(
-            ToolchainTypeInfo.create(makeLabel("//test:toolchain")),
-            ImmutableList.of(),
-            ImmutableList.of(),
-            makeLabel("//test/toolchain_impl_2"));
+        DeclaredToolchainInfo.builder()
+            .toolchainType(ToolchainTypeInfo.create(makeLabel("//test:toolchain")))
+            .addExecConstraints(ImmutableList.of())
+            .addTargetConstraints(ImmutableList.of())
+            .toolchainLabel(makeLabel("//test/toolchain_impl_2"))
+            .build();
 
     new EqualsTester()
         .addEqualityGroup(