| # Copyright 2018 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. |
| |
| """Common methods for use by the IntelliJ Aspect.""" |
| |
| load(":java.bzl", _java = "java") |
| load(":utils.bzl", _utils = "utils") |
| |
| def _extract_idl_jars( |
| ctx, |
| idl_java_srcs = [], |
| jar = None, |
| manifest_proto = None, |
| out_srcjar = None, |
| out_jar = None, |
| idlclass = None, |
| host_javabase = None): |
| """Extracts the idl class and src jars.""" |
| args = ctx.actions.args() |
| args.add("--class_jar", jar) |
| args.add("--manifest_proto", manifest_proto) |
| args.add("--output_class_jar", out_jar) |
| args.add("--output_source_jar", out_srcjar) |
| |
| # tmp directory is removed by the idl tool before each invocation so create a unique dir. |
| # See src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java |
| args.add("--temp_dir", "%s/%s_idl_tmp" % (out_jar.dirname, ctx.label.name)) |
| args.add_all(idl_java_srcs) |
| |
| _java.run( |
| ctx = ctx, |
| host_javabase = host_javabase, |
| executable = idlclass, |
| arguments = [args], |
| inputs = idl_java_srcs + [jar, manifest_proto], |
| outputs = [out_srcjar, out_jar], |
| mnemonic = "AndroidIdlJars", |
| progress_message = "Building idl jars %s" % out_jar.path, |
| ) |
| |
| def _make_android_ide_info( |
| ctx, |
| idl_ctx = None, |
| resources_ctx = None, |
| defines_resources = False, |
| java_package = None, |
| manifest = None, |
| merged_manifest = None, |
| resources_apk = None, |
| idl_import_root = None, |
| idl_srcs = [], |
| idl_java_srcs = [], |
| java_info = None, |
| r_jar = None, |
| signed_apk = None, |
| aar = None, |
| apks_under_test = [], |
| native_libs = dict(), |
| idlclass = None, |
| host_javabase = None): |
| # TODO(b/154513292): Clean up bad usages of context objects. |
| if idl_ctx: |
| idl_import_root = idl_ctx.idl_import_root |
| idl_srcs = idl_ctx.idl_srcs |
| idl_java_srcs = idl_ctx.idl_java_srcs |
| if resources_ctx: |
| defines_resources = resources_ctx.defines_resources |
| merged_manifest = resources_ctx.merged_manifest |
| resources_apk = resources_ctx.resources_apk |
| |
| if not defines_resources: |
| java_package = None |
| merged_manifest = None |
| |
| # Extracts idl related classes from the jar and creates a src jar |
| # for the idl generated java. |
| idl_jar = None |
| idl_srcjar = None |
| |
| # TODO(djwhang): JavaInfo.outputs.jar.manifest_proto is not created by |
| # Kotlin compile. Determine if this is the same manifest_proto produced |
| # by turbine, this could be pulled during annotation processing. |
| jar = _utils.only(java_info.outputs.jars) |
| if idl_java_srcs and jar.manifest_proto: |
| idl_jar = ctx.actions.declare_file("lib%s-idl.jar" % ctx.label.name) |
| idl_srcjar = \ |
| ctx.actions.declare_file("lib%s-idl.srcjar" % ctx.label.name) |
| |
| jar = _utils.only(java_info.outputs.jars) |
| _extract_idl_jars( |
| ctx, |
| idl_java_srcs = idl_java_srcs, |
| jar = jar.class_jar, |
| manifest_proto = jar.manifest_proto, |
| out_jar = idl_jar, |
| out_srcjar = idl_srcjar, |
| idlclass = idlclass, |
| host_javabase = host_javabase, |
| ) |
| |
| return AndroidIdeInfo( |
| java_package, |
| manifest, |
| merged_manifest, |
| idl_import_root, |
| idl_srcs, |
| idl_java_srcs, |
| idl_srcjar, |
| idl_jar, |
| defines_resources, |
| r_jar, |
| resources_apk, |
| signed_apk, |
| aar, |
| apks_under_test, |
| native_libs, |
| ) |
| |
| def _make_legacy_android_provider(android_ide_info): |
| # Create the ClassJar "object" for the target.android.idl.output field. |
| if android_ide_info.idl_class_jar: |
| idl_class_jar = struct( |
| class_jar = android_ide_info.idl_class_jar, |
| ijar = None, |
| source_jar = android_ide_info.idl_source_jar, |
| ) |
| else: |
| idl_class_jar = None |
| |
| return struct( |
| aar = android_ide_info.aar, |
| apk = android_ide_info.signed_apk, |
| apks_under_test = android_ide_info.apks_under_test, |
| defines_resources = android_ide_info.defines_android_resources, |
| idl = struct( |
| import_root = android_ide_info.idl_import_root, |
| sources = android_ide_info.idl_srcs, |
| generated_java_files = android_ide_info.idl_generated_java_files, |
| output = idl_class_jar, |
| ), |
| java_package = android_ide_info.java_package, |
| manifest = android_ide_info.manifest, |
| merged_manifest = android_ide_info.generated_manifest, |
| native_libs = android_ide_info.native_libs, |
| resource_apk = android_ide_info.resource_apk, |
| resource_jar = android_ide_info.resource_jar, |
| ) |
| |
| intellij = struct( |
| make_android_ide_info = _make_android_ide_info, |
| make_legacy_android_provider = _make_legacy_android_provider, |
| ) |
| |
| # Only visible for testing. |
| testing = struct( |
| extract_idl_jars = _extract_idl_jars, |
| ) |