# Copyright 2020 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.
"""Bazel Desugar Commands."""

load("//rules:visibility.bzl", "PROJECT_VISIBILITY")
load("//rules/flags:flags.bzl", "read_possibly_native_flag")

visibility(PROJECT_VISIBILITY)

def _desugar(
        ctx,
        input,
        output = None,
        classpath = None,
        bootclasspath = [],
        min_sdk_version = 0,
        library_desugaring = True,
        desugar_exec = None,
        desugared_lib_config = None,
        toolchain_type = None):
    """Desugars a JAR.

    Args:
        ctx: The context.
        input: File. The jar to be desugared.
        output: File. The desugared jar.
        classpath: Depset of Files. The transitive classpath needed to resolve symbols in the input jar.
        bootclasspath: List of Files. Bootclasspaths that was used to compile the input jar with.
        min_sdk_version: Integer. The minimum targeted sdk version.
        library_desugaring: Boolean. Whether to enable core library desugaring.
        desugar_exec: File. The executable desugar file.
        desugared_lib_config: File. The json file containing desugarer options.
        toolchain_type: Label or String. The toolchain to use for running the desugar action.
    """

    args = ctx.actions.args()
    args.use_param_file("@%s", use_always = True)  # Required for workers.
    args.set_param_file_format("multiline")

    # Explicitly calls input.path here to work around b/310015642
    args.add("--input", input.path)
    args.add("--output", output)
    args.add_all(classpath, before_each = "--classpath_entry")
    args.add_all(bootclasspath, before_each = "--bootclasspath_entry")

    input_file_deps = [input]
    if library_desugaring:
        args.add("--emit_dependency_metadata_as_needed")
        if read_possibly_native_flag(ctx, "desugar_java8_libs"):
            args.add("--desugar_supported_core_libs")

    # Unconditionally add --desugared_lib_config. This matches the behavior of tools/android/d8_desugar.sh.
    args.add("--desugared_lib_config", desugared_lib_config)
    if desugared_lib_config:
        input_file_deps.append(desugared_lib_config)
    else:
        fail("Got NoneType for desugared_lib_config")

    if min_sdk_version > 0:
        args.add("--min_sdk_version", str(min_sdk_version))

    ctx.actions.run(
        inputs = depset(input_file_deps + bootclasspath, transitive = [classpath]),
        outputs = [output],
        executable = desugar_exec,
        arguments = [args],
        mnemonic = "Desugar",
        progress_message = "Desugaring " + input.short_path + " for Android",
        execution_requirements = {"supports-workers": "1"},
        use_default_shell_env = True,
        toolchain = toolchain_type,
    )

desugar = struct(
    desugar = _desugar,
)
