Skip to content

Commit

Permalink
[feature] AIDL import support | #BAZEL-876 Done
Browse files Browse the repository at this point in the history
Merge-request: BAZEL-MR-989
Merged-by: Lev Leontev <lev.leontev@jetbrains.com>
  • Loading branch information
gottagofaster236 authored and Space Team committed Apr 8, 2024
1 parent 3f128ac commit 7571695
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 7 deletions.
11 changes: 11 additions & 0 deletions aspects/rules/android/android_info.bzl
Expand Up @@ -40,11 +40,22 @@ def extract_android_info(target, ctx, dep_targets, **kwargs):
# Add to set
resource_folders_set[resource_source_dir_location] = None

aidl_binary_jar = None
aidl_source_jar = None
if AndroidIdeInfo in target:
android_ide_info = target[AndroidIdeInfo]
if android_ide_info.idl_class_jar:
aidl_binary_jar = file_location(android_ide_info.idl_class_jar)
if android_ide_info.idl_source_jar:
aidl_source_jar = file_location(android_ide_info.idl_source_jar)

android_target_info_proto = create_struct(
android_jar = android_jar,
manifest = manifest,
resources = resources,
resource_folders = resource_folders_set.keys(),
aidl_binary_jar = aidl_binary_jar,
aidl_source_jar = aidl_source_jar,
)

return create_proto(target, ctx, android_target_info_proto, "android_target_info"), None
Expand Down
Expand Up @@ -73,11 +73,15 @@ class BazelProjectMapper(
val scalaLibrariesMapper = measure("Create scala libraries") {
calculateScalaLibrariesMapper(targetsToImport)
}
val androidLibrariesMapper = measure("Create android libraries") {
calculateAndroidLibrariesMapper(targetsToImport)
}
val librariesFromDeps = measure("Merge libraries from deps") {
concatenateMaps(
annotationProcessorLibraries,
kotlinStdlibsMapper,
scalaLibrariesMapper,
androidLibrariesMapper,
)
}
val librariesFromDepsAndTargets = measure("Libraries from targets and deps") {
Expand Down Expand Up @@ -199,6 +203,38 @@ class BazelProjectMapper(
?.compilerJars
?.toSet().orEmpty()

private fun calculateAndroidLibrariesMapper(targetsToImport: Sequence<TargetInfo>): Map<String, List<Library>> =
targetsToImport.mapNotNull { target ->
val aidlLibrary = createAidlLibrary(target) ?: return@mapNotNull null
target.id to listOf(aidlLibrary)
}.toMap()

private fun createAidlLibrary(target: TargetInfo): Library? {
if (!target.hasAndroidTargetInfo()) return null
val androidTargetInfo = target.androidTargetInfo
if (!androidTargetInfo.hasAidlBinaryJar()) return null

val libraryLabel = target.id + "_aidl"
if (target.sourcesList.isEmpty()) {
// Bazel doesn't create the AIDL jar if there's no sources, since it'd be the same as the output jar
return createLibrary(libraryLabel, target)
}

val outputs = listOf(target.androidTargetInfo.aidlBinaryJar).resolveUris()
val sources = if (target.androidTargetInfo.hasAidlSourceJar()) {
listOf(target.androidTargetInfo.aidlSourceJar).resolveUris()
} else {
emptySet()
}
return Library(
label = libraryLabel,
outputs = outputs,
sources = sources,
dependencies = emptyList(),
interfaceJars = emptySet(),
)
}

/**
* In some cases, the jar dependencies of a target might be injected by bazel or rules and not are not
* available via `deps` field of a target. For this reason, we read JavaOutputInfo's jdeps file and
Expand Down Expand Up @@ -294,17 +330,20 @@ class BazelProjectMapper(

private fun createLibraries(targets: Map<String, TargetInfo>): Map<String, Library> {
return targets.mapValues { (targetId, targetInfo) ->
Library(
label = targetId,
outputs = getTargetJarUris(targetInfo) + getAndroidAarUris(targetInfo),
sources = getSourceJarUris(targetInfo),
dependencies = targetInfo.dependenciesList.map { it.id },
interfaceJars = getTargetInterfaceJars(targetInfo).map { it.toUri() }.toSet(),
)
createLibrary(targetId, targetInfo)
}
.filterValues { it.interfaceJars.isNotEmpty() || it.sources.isNotEmpty() || it.outputs.isNotEmpty() }
}

private fun createLibrary(label: String, targetInfo: TargetInfo): Library =
Library(
label = label,
outputs = getTargetJarUris(targetInfo) + getAndroidAarUris(targetInfo),
sources = getSourceJarUris(targetInfo),
dependencies = targetInfo.dependenciesList.map { it.id },
interfaceJars = getTargetInterfaceJars(targetInfo).map { it.toUri() }.toSet(),
)

private fun List<FileLocation>.resolveUris() =
map { bazelPathsResolver.resolve(it).toUri() }.toSet()

Expand Down
Expand Up @@ -100,6 +100,8 @@ message AndroidTargetInfo {
FileLocation manifest = 2;
repeated FileLocation resources = 3;
repeated FileLocation resource_folders = 4;
FileLocation aidl_binary_jar = 5;
FileLocation aidl_source_jar = 6;
}

message AndroidAarImportInfo {
Expand Down

0 comments on commit 7571695

Please sign in to comment.