xref: /aosp_15_r20/external/bazelbuild-rules_android/rules/intellij.bzl (revision 9e965d6fece27a77de5377433c2f7e6999b8cc0b)
1# Copyright 2018 The Bazel Authors. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#    http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""Common methods for use by the IntelliJ Aspect."""
16
17load(":java.bzl", _java = "java")
18load(":utils.bzl", _utils = "utils")
19
20def _extract_idl_jars(
21        ctx,
22        idl_java_srcs = [],
23        jar = None,
24        manifest_proto = None,
25        out_srcjar = None,
26        out_jar = None,
27        idlclass = None,
28        host_javabase = None):
29    """Extracts the idl class and src jars."""
30    args = ctx.actions.args()
31    args.add("--class_jar", jar)
32    args.add("--manifest_proto", manifest_proto)
33    args.add("--output_class_jar", out_jar)
34    args.add("--output_source_jar", out_srcjar)
35
36    # tmp directory is removed by the idl tool before each invocation so create a unique dir.
37    # See src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
38    args.add("--temp_dir", "%s/%s_idl_tmp" % (out_jar.dirname, ctx.label.name))
39    args.add_all(idl_java_srcs)
40
41    _java.run(
42        ctx = ctx,
43        host_javabase = host_javabase,
44        executable = idlclass,
45        arguments = [args],
46        inputs = idl_java_srcs + [jar, manifest_proto],
47        outputs = [out_srcjar, out_jar],
48        mnemonic = "AndroidIdlJars",
49        progress_message = "Building idl jars %s" % out_jar.path,
50    )
51
52def _make_android_ide_info(
53        ctx,
54        idl_ctx = None,
55        resources_ctx = None,
56        defines_resources = False,
57        java_package = None,
58        manifest = None,
59        merged_manifest = None,
60        resources_apk = None,
61        idl_import_root = None,
62        idl_srcs = [],
63        idl_java_srcs = [],
64        java_info = None,
65        r_jar = None,
66        signed_apk = None,
67        aar = None,
68        apks_under_test = [],
69        native_libs = dict(),
70        idlclass = None,
71        host_javabase = None):
72    # TODO(b/154513292): Clean up bad usages of context objects.
73    if idl_ctx:
74        idl_import_root = idl_ctx.idl_import_root
75        idl_srcs = idl_ctx.idl_srcs
76        idl_java_srcs = idl_ctx.idl_java_srcs
77    if resources_ctx:
78        defines_resources = resources_ctx.defines_resources
79        merged_manifest = resources_ctx.merged_manifest
80        resources_apk = resources_ctx.resources_apk
81
82    if not defines_resources:
83        java_package = None
84        merged_manifest = None
85
86    # Extracts idl related classes from the jar and creates a src jar
87    # for the idl generated java.
88    idl_jar = None
89    idl_srcjar = None
90
91    # TODO(djwhang): JavaInfo.outputs.jar.manifest_proto is not created by
92    # Kotlin compile. Determine if this is the same manifest_proto produced
93    # by turbine, this could be pulled during annotation processing.
94    jar = _utils.only(java_info.outputs.jars)
95    if idl_java_srcs and jar.manifest_proto:
96        idl_jar = ctx.actions.declare_file("lib%s-idl.jar" % ctx.label.name)
97        idl_srcjar = \
98            ctx.actions.declare_file("lib%s-idl.srcjar" % ctx.label.name)
99
100        jar = _utils.only(java_info.outputs.jars)
101        _extract_idl_jars(
102            ctx,
103            idl_java_srcs = idl_java_srcs,
104            jar = jar.class_jar,
105            manifest_proto = jar.manifest_proto,
106            out_jar = idl_jar,
107            out_srcjar = idl_srcjar,
108            idlclass = idlclass,
109            host_javabase = host_javabase,
110        )
111
112    return AndroidIdeInfo(
113        java_package,
114        manifest,
115        merged_manifest,
116        idl_import_root,
117        idl_srcs,
118        idl_java_srcs,
119        idl_srcjar,
120        idl_jar,
121        defines_resources,
122        r_jar,
123        resources_apk,
124        signed_apk,
125        aar,
126        apks_under_test,
127        native_libs,
128    )
129
130def _make_legacy_android_provider(android_ide_info):
131    # Create the ClassJar "object" for the target.android.idl.output field.
132    if android_ide_info.idl_class_jar:
133        idl_class_jar = struct(
134            class_jar = android_ide_info.idl_class_jar,
135            ijar = None,
136            source_jar = android_ide_info.idl_source_jar,
137        )
138    else:
139        idl_class_jar = None
140
141    return struct(
142        aar = android_ide_info.aar,
143        apk = android_ide_info.signed_apk,
144        apks_under_test = android_ide_info.apks_under_test,
145        defines_resources = android_ide_info.defines_android_resources,
146        idl = struct(
147            import_root = android_ide_info.idl_import_root,
148            sources = android_ide_info.idl_srcs,
149            generated_java_files = android_ide_info.idl_generated_java_files,
150            output = idl_class_jar,
151        ),
152        java_package = android_ide_info.java_package,
153        manifest = android_ide_info.manifest,
154        merged_manifest = android_ide_info.generated_manifest,
155        native_libs = android_ide_info.native_libs,
156        resource_apk = android_ide_info.resource_apk,
157        resource_jar = android_ide_info.resource_jar,
158    )
159
160intellij = struct(
161    make_android_ide_info = _make_android_ide_info,
162    make_legacy_android_provider = _make_legacy_android_provider,
163)
164
165# Only visible for testing.
166testing = struct(
167    extract_idl_jars = _extract_idl_jars,
168)
169