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