diff options
Diffstat (limited to 'rules/intellij.bzl')
-rw-r--r-- | rules/intellij.bzl | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/rules/intellij.bzl b/rules/intellij.bzl new file mode 100644 index 0000000..c870b1b --- /dev/null +++ b/rules/intellij.bzl @@ -0,0 +1,165 @@ +# 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) + args.add("--temp_dir", out_jar.dirname) + 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, +) |