|  | # Copyright 2021 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. | 
|  |  | 
|  | """ | 
|  | Proguard | 
|  | """ | 
|  |  | 
|  | load(":common/java/java_semantics.bzl", "semantics") | 
|  |  | 
|  | ProguardSpecProvider = _builtins.toplevel.ProguardSpecProvider | 
|  |  | 
|  | def _filter_provider(provider, *attrs): | 
|  | return [dep[provider] for attr in attrs for dep in attr if provider in dep] | 
|  |  | 
|  | def _validate_spec(ctx, spec_file): | 
|  | validated_proguard_spec = ctx.actions.declare_file( | 
|  | "validated_proguard/%s/%s_valid" % (ctx.label.name, spec_file.path), | 
|  | ) | 
|  |  | 
|  | toolchain = semantics.find_java_toolchain(ctx) | 
|  |  | 
|  | args = ctx.actions.args() | 
|  | args.add("--path", spec_file) | 
|  | args.add("--output", validated_proguard_spec) | 
|  |  | 
|  | ctx.actions.run( | 
|  | mnemonic = "ValidateProguard", | 
|  | progress_message = "Validating proguard configuration %{input}", | 
|  | executable = toolchain.proguard_allowlister, | 
|  | arguments = [args], | 
|  | inputs = [spec_file], | 
|  | outputs = [validated_proguard_spec], | 
|  | ) | 
|  |  | 
|  | return validated_proguard_spec | 
|  |  | 
|  | def validate_proguard_specs(ctx, proguard_specs = [], transitive_attrs = []): | 
|  | """ | 
|  | Creates actions that validate Proguard specification and returns ProguardSpecProvider. | 
|  |  | 
|  | Use transtive_attrs parameter to collect Proguard validations from `deps`, | 
|  | `runtime_deps`, `exports`, `plugins`, and `exported_plugins` attributes. | 
|  |  | 
|  | Args: | 
|  | ctx: (RuleContext) Used to register the actions. | 
|  | proguard_specs: (list[File]) List of Proguard specs files. | 
|  | transitive_attrs: (list[list[Target]])  Attributes to collect transitive | 
|  | proguard validations from. | 
|  | Returns: | 
|  | (ProguardSpecProvider) A ProguardSpecProvider. | 
|  | """ | 
|  | proguard_validations = _filter_provider(ProguardSpecProvider, *transitive_attrs) | 
|  | return ProguardSpecProvider( | 
|  | depset( | 
|  | [_validate_spec(ctx, spec_file) for spec_file in proguard_specs], | 
|  | transitive = [validation.specs for validation in proguard_validations], | 
|  | ), | 
|  | ) |