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