# Copyright 2022 Google LLC. 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. """kt_jvm_compile_stubs""" load("//:visibility.bzl", "RULES_KOTLIN") load("//kotlin:common.bzl", "common") load("//kotlin:jvm_compile.bzl", "kt_jvm_compile") load("//kotlin:traverse_exports.bzl", "kt_traverse_exports") load("//kotlin/common/testing:analysis.bzl", "kt_analysis") load("//kotlin/common/testing:testing_rules.bzl", "kt_testing_rules") load("//toolchains/kotlin_jvm:java_toolchains.bzl", "java_toolchains") load("//toolchains/kotlin_jvm:kt_jvm_toolchains.bzl", "kt_jvm_toolchains") load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") visibility(RULES_KOTLIN) _kt_jvm_compile_stub_rule = rule( implementation = lambda ctx: _kt_jvm_compile_stub_rule_impl(ctx), attrs = dict( srcs = attr.label_list( allow_files = True, ), common_srcs = attr.label_list( allow_files = True, ), deps = attr.label_list( aspects = [kt_traverse_exports.aspect], providers = [JavaInfo], ), exports = attr.label_list( aspects = [kt_traverse_exports.aspect], providers = [JavaInfo], ), rule_family = attr.int( default = common.RULE_FAMILY.UNKNOWN, ), r_java = attr.label( providers = [JavaInfo], ), _java_toolchain = attr.label( default = Label( "@bazel_tools//tools/jdk:current_java_toolchain", ), ), ), fragments = ["java"], outputs = dict( jar = "lib%{name}.jar", ), toolchains = [kt_jvm_toolchains.type, "@bazel_tools//tools/jdk:toolchain_type"], ) def _kt_jvm_compile_stub_rule_impl(ctx): # As additional capabilites need to be tested, this rule should support # additional fields/attributes. result = kt_jvm_compile( ctx, output = ctx.outputs.jar, srcs = ctx.files.srcs, common_srcs = ctx.files.common_srcs, deps = ctx.attr.deps, plugins = [], exported_plugins = [], runtime_deps = [], exports = ctx.attr.exports, javacopts = [], kotlincopts = [], neverlink = False, testonly = False, android_lint_plugins = [], manifest = None, merged_manifest = None, resource_files = [], rule_family = ctx.attr.rule_family, kt_toolchain = kt_jvm_toolchains.get(ctx), java_toolchain = java_toolchains.get(ctx), disable_lint_checks = [], r_java = ctx.attr.r_java[JavaInfo] if ctx.attr.r_java else None, ) return [result.java_info] _kt_jvm_compile_stub_analysis_test = analysistest.make( impl = lambda ctx: _kt_jvm_compile_stub_analysis_test_impl(ctx), attrs = dict( expected_kotlinc_classpath_names = attr.string_list(default = kt_analysis.DEFAULT_LIST), ), ) def _kt_jvm_compile_stub_analysis_test_impl(ctx): kt_analysis.check_endswith_test(ctx) env = analysistest.begin(ctx) actions = analysistest.target_actions(env) kotlinc_action = kt_analysis.get_action(actions, "Kt2JavaCompile") asserts.true( env, JavaInfo in ctx.attr.target_under_test, "Did not produce JavaInfo provider.", ) if ctx.attr.expected_kotlinc_classpath_names != kt_analysis.DEFAULT_LIST: kotlinc_classpath = kt_analysis.get_arg(kotlinc_action, "-cp", style = "next").split(":") asserts.equals( env, ctx.attr.expected_kotlinc_classpath_names, [file.rsplit("/", 1)[1] for file in kotlinc_classpath], ) return analysistest.end(env) kt_jvm_compile_stubs = struct( rule = kt_testing_rules.wrap_for_analysis(_kt_jvm_compile_stub_rule), analysis_test = _kt_jvm_compile_stub_analysis_test, )