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