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 18792cf45f3374..dfa653e5dd2620 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 @@ public void init(ConfiguredRuleClassProvider.Builder builder) { 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 00000000000000..28af0e69724d97 --- /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 { + + public static final String PROVIDER_NAME = "BaselineProfileProvider"; + public static final Provider PROVIDER = new Provider(); + + private final NestedSet transitiveBaselineProfiles; + + public BaselineProfileProvider(NestedSet transitiveBaselineProfiles) { + this.transitiveBaselineProfiles = transitiveBaselineProfiles; + } + + @Override + public Provider getProvider() { + return PROVIDER; + } + + @Override + public Depset /**/ getTransitiveBaselineProfilesForStarlark() { + return Depset.of(Artifact.TYPE, transitiveBaselineProfiles); + } + + public NestedSet getTransitiveBaselineProfiles() { + return transitiveBaselineProfiles; + } + + public static BaselineProfileProvider merge(Iterable providers) { + NestedSetBuilder 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 + implements BaselineProfileProviderApi.Provider { + 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 5090891c735ccb..20c220a675aaaa 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 @@ public AndroidBootstrap( androidLibraryResourceClassJarProviderApiProvider, AndroidFeatureFlagSetProviderApi.Provider androidFeatureFlagSetProviderApiProvider, ProguardMappingProviderApi.Provider proguardMappingProviderApiProvider, - AndroidBinaryDataInfoApi.Provider androidBinaryDataInfoProvider) { + AndroidBinaryDataInfoApi.Provider androidBinaryDataInfoProvider, + BaselineProfileProviderApi.Provider baselineProfileProvider) { this.androidCommon = androidCommon; ImmutableMap.Builder builder = ImmutableMap.builder(); @@ -80,6 +81,7 @@ public AndroidBootstrap( 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 00000000000000..eecb7d9661ed8e --- /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 extends StructApi { + + String NAME = "BaselineProfileProvider"; + + @StarlarkMethod(name = "files", structField = true, doc = "", documented = false) + Depset /**/ getTransitiveBaselineProfilesForStarlark(); + + /** The provider implementing this can construct the BaselineProfileProvider. */ + @StarlarkBuiltin(name = "Provider", doc = "", documented = false) + interface Provider extends ProviderApi { + + @StarlarkMethod( + name = NAME, + doc = "The BaselineProfileProvider 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 create(Depset files) throws EvalException; + } +}