# 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")

    args.add("--input", input)
    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", "supports-path-mapping": "1"},
        use_default_shell_env = True,
        toolchain = toolchain_type,
    )

desugar = struct(
    desugar = _desugar,
)
