create BaselineProfileProvider to propagate baseline-prof.txt up to android_binary and expose it to Starlark.

PiperOrigin-RevId: 438680646
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 18792cf..dfa653e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -93,6 +93,7 @@
 import com.google.devtools.build.lib.rules.android.AndroidSdkProvider;
 import com.google.devtools.build.lib.rules.android.AndroidStarlarkCommon;
 import com.google.devtools.build.lib.rules.android.ApkInfo;
+import com.google.devtools.build.lib.rules.android.BaselineProfileProvider;
 import com.google.devtools.build.lib.rules.android.DexArchiveAspect;
 import com.google.devtools.build.lib.rules.android.ProguardMappingProvider;
 import com.google.devtools.build.lib.rules.android.databinding.DataBindingV2Provider;
@@ -391,7 +392,8 @@
                   AndroidLibraryResourceClassJarProvider.PROVIDER,
                   AndroidFeatureFlagSetProvider.PROVIDER,
                   ProguardMappingProvider.PROVIDER,
-                  AndroidBinaryDataInfo.PROVIDER);
+                  AndroidBinaryDataInfo.PROVIDER,
+                  BaselineProfileProvider.PROVIDER);
           builder.addStarlarkBootstrap(bootstrap);
 
           try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/BaselineProfileProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/BaselineProfileProvider.java
new file mode 100644
index 0000000..28af0e6
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/BaselineProfileProvider.java
@@ -0,0 +1,78 @@
+// Copyright 2022 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.rules.android;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.collect.nestedset.Depset;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.BuiltinProvider;
+import com.google.devtools.build.lib.packages.NativeInfo;
+import com.google.devtools.build.lib.starlarkbuildapi.android.BaselineProfileProviderApi;
+import net.starlark.java.eval.EvalException;
+
+/** A target that can provide baseline profile files to Android binaries. */
+@Immutable
+public final class BaselineProfileProvider extends NativeInfo
+    implements BaselineProfileProviderApi<Artifact> {
+
+  public static final String PROVIDER_NAME = "BaselineProfileProvider";
+  public static final Provider PROVIDER = new Provider();
+
+  private final NestedSet<Artifact> transitiveBaselineProfiles;
+
+  public BaselineProfileProvider(NestedSet<Artifact> transitiveBaselineProfiles) {
+    this.transitiveBaselineProfiles = transitiveBaselineProfiles;
+  }
+
+  @Override
+  public Provider getProvider() {
+    return PROVIDER;
+  }
+
+  @Override
+  public Depset /*<Artifact>*/ getTransitiveBaselineProfilesForStarlark() {
+    return Depset.of(Artifact.TYPE, transitiveBaselineProfiles);
+  }
+
+  public NestedSet<Artifact> getTransitiveBaselineProfiles() {
+    return transitiveBaselineProfiles;
+  }
+
+  public static BaselineProfileProvider merge(Iterable<BaselineProfileProvider> providers) {
+    NestedSetBuilder<Artifact> files = NestedSetBuilder.stableOrder();
+    for (BaselineProfileProvider wrapper : providers) {
+      files.addTransitive(wrapper.getTransitiveBaselineProfiles());
+    }
+    return new BaselineProfileProvider(files.build());
+  }
+
+  /** Provider class for {@link BaselineProfileProvider} objects. */
+  public static class Provider extends BuiltinProvider<BaselineProfileProvider>
+      implements BaselineProfileProviderApi.Provider<Artifact> {
+    private Provider() {
+      super(PROVIDER_NAME, BaselineProfileProvider.class);
+    }
+
+    public String getName() {
+      return PROVIDER_NAME;
+    }
+
+    @Override
+    public BaselineProfileProvider create(Depset files) throws EvalException {
+      return new BaselineProfileProvider(Depset.cast(files, Artifact.class, "files"));
+    }
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
index 5090891..20c220a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBootstrap.java
@@ -54,7 +54,8 @@
           androidLibraryResourceClassJarProviderApiProvider,
       AndroidFeatureFlagSetProviderApi.Provider androidFeatureFlagSetProviderApiProvider,
       ProguardMappingProviderApi.Provider<?> proguardMappingProviderApiProvider,
-      AndroidBinaryDataInfoApi.Provider<?, ?, ?, ?> androidBinaryDataInfoProvider) {
+      AndroidBinaryDataInfoApi.Provider<?, ?, ?, ?> androidBinaryDataInfoProvider,
+      BaselineProfileProviderApi.Provider<?> baselineProfileProvider) {
 
     this.androidCommon = androidCommon;
     ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
@@ -80,6 +81,7 @@
     builder.put(AndroidFeatureFlagSetProviderApi.NAME, androidFeatureFlagSetProviderApiProvider);
     builder.put(ProguardMappingProviderApi.NAME, proguardMappingProviderApiProvider);
     builder.put(AndroidBinaryDataInfoApi.NAME, androidBinaryDataInfoProvider);
+    builder.put(BaselineProfileProviderApi.NAME, baselineProfileProvider);
     providers = builder.build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BaselineProfileProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BaselineProfileProviderApi.java
new file mode 100644
index 0000000..eecb7d9
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/BaselineProfileProviderApi.java
@@ -0,0 +1,59 @@
+// Copyright 2022 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.starlarkbuildapi.android;
+
+import com.google.devtools.build.docgen.annot.DocCategory;
+import com.google.devtools.build.docgen.annot.StarlarkConstructor;
+import com.google.devtools.build.lib.collect.nestedset.Depset;
+import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
+import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
+import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
+import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
+import net.starlark.java.annot.StarlarkBuiltin;
+import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+
+/** Provides information about baseline profile for Android binaries. */
+@StarlarkBuiltin(
+    name = "BaselineProfileProvider",
+    doc = "Baseline profile file used for Android binaries.",
+    category = DocCategory.PROVIDER)
+public interface BaselineProfileProviderApi<FileT extends FileApi> extends StructApi {
+
+  String NAME = "BaselineProfileProvider";
+
+  @StarlarkMethod(name = "files", structField = true, doc = "", documented = false)
+  Depset /*<FileT>*/ getTransitiveBaselineProfilesForStarlark();
+
+  /** The provider implementing this can construct the BaselineProfileProvider. */
+  @StarlarkBuiltin(name = "Provider", doc = "", documented = false)
+  interface Provider<FileT extends FileApi> extends ProviderApi {
+
+    @StarlarkMethod(
+        name = NAME,
+        doc = "The <code>BaselineProfileProvider</code> constructor.",
+        parameters = {
+          @Param(
+              name = "files",
+              doc = "Transitive baseline profile files.",
+              positional = true,
+              named = false,
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
+        },
+        selfCall = true)
+    @StarlarkConstructor
+    BaselineProfileProviderApi<FileT> create(Depset files) throws EvalException;
+  }
+}