Skip to content

Commit

Permalink
[feature] aar_import support | #BAZEL-866
Browse files Browse the repository at this point in the history
Merge-request: BAZEL-MR-885
Merged-by: Lev Leontev <lev.leontev@jetbrains.com>
  • Loading branch information
gottagofaster236 authored and Space Team committed Mar 5, 2024
1 parent 689caef commit 3037649
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 6 deletions.
26 changes: 26 additions & 0 deletions aspects/rules/android/android_info.bzl
Expand Up @@ -55,3 +55,29 @@ def extract_android_info(target, ctx, dep_targets, **kwargs):
)

return create_proto(target, ctx, android_target_info_proto, "android_target_info"), None

def extract_android_aar_import_info(target, ctx, dep_targets, **kwargs):
if ctx.rule.kind != "aar_import":
return None, None

if AndroidManifestInfo not in target:
return None, None
manifest = file_location(target[AndroidManifestInfo].manifest)

resource_folder = None
r_txt = None
if AndroidResourcesInfo in target:
direct_android_resources = target[AndroidResourcesInfo].direct_android_resources.to_list()
if direct_android_resources:
direct_android_resource = direct_android_resources[0]
resource_files = direct_android_resource.resources
if resource_files:
resource_folder = file_location(resource_files[0])
r_txt = file_location(direct_android_resource.r_txt)

android_aar_import_info_proto = create_struct(
manifest = manifest,
resource_folder = resource_folder,
r_txt = r_txt,
)
return create_proto(target, ctx, android_aar_import_info_proto, "android_aar_import_info"), None
Expand Up @@ -28,6 +28,9 @@ object BazelFlag {
@JvmStatic fun experimentalGoogleLegacyApi(): String =
flag("experimental_google_legacy_api")

@JvmStatic fun experimentalEnableAndroidMigrationApis(): String =
flag("experimental_enable_android_migration_apis")

@JvmStatic fun device(device: String): String =
arg("device", device)

Expand Down
Expand Up @@ -5,6 +5,7 @@ import org.jetbrains.bsp.bazel.bazelrunner.params.BazelFlag.aspect
import org.jetbrains.bsp.bazel.bazelrunner.params.BazelFlag.buildManualTests
import org.jetbrains.bsp.bazel.bazelrunner.params.BazelFlag.color
import org.jetbrains.bsp.bazel.bazelrunner.params.BazelFlag.curses
import org.jetbrains.bsp.bazel.bazelrunner.params.BazelFlag.experimentalEnableAndroidMigrationApis
import org.jetbrains.bsp.bazel.bazelrunner.params.BazelFlag.experimentalGoogleLegacyApi
import org.jetbrains.bsp.bazel.bazelrunner.params.BazelFlag.keepGoing
import org.jetbrains.bsp.bazel.bazelrunner.params.BazelFlag.outputGroups
Expand Down Expand Up @@ -65,6 +66,7 @@ class BazelBspAspectsManager(
buildManualTests(),
curses(false),
experimentalGoogleLegacyApi(),
experimentalEnableAndroidMigrationApis(),
),
null,
// Setting `CARGO_BAZEL_REPIN=1` updates `cargo_lockfile`
Expand Down
Expand Up @@ -16,7 +16,7 @@ enum class Language(private val fileName: String, val ruleNames: List<String>, v
Cpp("//aspects:rules/cpp/cpp_info.bzl", listOf("rules_cc"), listOf("extract_cpp_info"), false),
Kotlin("//aspects:rules/kt/kt_info.bzl", listOf("io_bazel_rules_kotlin", "rules_kotlin"), listOf("extract_kotlin_info"), true),
Rust("//aspects:rules/rust/rust_info.bzl", listOf("rules_rust"), listOf("extract_rust_crate_info"), false),
Android("//aspects:rules/android/android_info.bzl", listOf(), listOf("extract_android_info"), false);
Android("//aspects:rules/android/android_info.bzl", listOf(), listOf("extract_android_info", "extract_android_aar_import_info"), false);

fun toLoadStatement(): String =
this.functions.joinToString(
Expand Down
Expand Up @@ -289,12 +289,10 @@ class BazelProjectMapper(
}

private fun createLibraries(targets: Map<String, TargetInfo>): Map<String, Library> {
return targets.mapValues { entry ->
val targetId = entry.key
val targetInfo = entry.value
return targets.mapValues { (targetId, targetInfo) ->
Library(
label = targetId,
outputs = getTargetJarUris(targetInfo),
outputs = getTargetJarUris(targetInfo) + getAndroidAarUris(targetInfo),
sources = getSourceJarUris(targetInfo),
dependencies = targetInfo.dependenciesList.map { it.id },
interfaceJars = getTargetInterfaceJars(targetInfo).map { it.toUri() }.toSet(),
Expand All @@ -311,6 +309,21 @@ class BazelProjectMapper(
.flatMap { it.binaryJarsList }
.resolveUris()

private fun getAndroidAarUris(targetInfo: TargetInfo): Set<URI> {
if (!targetInfo.hasAndroidAarImportInfo()) return emptySet()
val androidAarImportInfo = targetInfo.androidAarImportInfo

val result = mutableSetOf<URI>()
result += bazelPathsResolver.resolve(androidAarImportInfo.manifest).toUri()
if (androidAarImportInfo.hasResourceFolder()) {
result += bazelPathsResolver.resolve(androidAarImportInfo.resourceFolder).resolve("res").toUri()
}
if (androidAarImportInfo.hasRTxt()) {
result += bazelPathsResolver.resolve(targetInfo.androidAarImportInfo.rTxt).toUri()
}
return result
}

private fun getSourceJarUris(targetInfo: TargetInfo) =
targetInfo.jvmTargetInfo.jarsList
.flatMap { it.sourceJarsList }
Expand Down
Expand Up @@ -5,6 +5,7 @@ import com.google.protobuf.TextFormat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.runBlocking
import org.jetbrains.bsp.bazel.info.BspTargetInfo.AndroidAarImportInfo
import org.jetbrains.bsp.bazel.info.BspTargetInfo.AndroidTargetInfo
import org.jetbrains.bsp.bazel.info.BspTargetInfo.CppTargetInfo
import org.jetbrains.bsp.bazel.info.BspTargetInfo.JavaRuntimeInfo
Expand Down Expand Up @@ -125,6 +126,12 @@ class TargetInfoReader {
targetInfoBuilder.setAndroidTargetInfo(info)
}

"android_aar_import_info" -> {
val builder = readFromFile(path, AndroidAarImportInfo.newBuilder())
val info = builder.build()
targetInfoBuilder.setAndroidAarImportInfo(info)
}

"general" -> {
val builder: TargetInfo.Builder = readFromFile(path, TargetInfo.newBuilder())
val info = builder.buildPartial()
Expand Down
Expand Up @@ -5,7 +5,10 @@ import org.jetbrains.bsp.bazel.server.sync.model.Tag

class TargetKindResolver {
fun resolveTags(targetInfo: BspTargetInfo.TargetInfo): Set<Tag> {
if (targetInfo.kind == "resources_union" || targetInfo.kind == "java_import") {
if (targetInfo.kind == "resources_union" ||
targetInfo.kind == "java_import" ||
targetInfo.kind == "aar_import"
) {
return LIBRARY
}
val tag = ruleSuffixToTargetType.filterKeys {
Expand Down
Expand Up @@ -103,6 +103,12 @@ message AndroidTargetInfo {
string kotlin_target_id = 5;
}

message AndroidAarImportInfo {
FileLocation manifest = 1;
FileLocation resource_folder = 2;
FileLocation r_txt = 3;
}

message TargetInfo {
string id = 10;
string kind = 20;
Expand All @@ -122,4 +128,5 @@ message TargetInfo {
PythonTargetInfo python_target_info = 8000;
RustCrateInfo rust_crate_info = 9000;
AndroidTargetInfo android_target_info = 10000;
AndroidAarImportInfo android_aar_import_info = 11000;
}

0 comments on commit 3037649

Please sign in to comment.