diff --git a/java/base.go b/java/base.go index da9293ce6..78aaa19cf 100644 --- a/java/base.go +++ b/java/base.go @@ -643,6 +643,11 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) { } else if j.shouldInstrumentStatic(ctx) { ctx.AddVariationDependencies(nil, staticLibTag, "jacocoagent") } + + if j.useCompose() { + ctx.AddVariationDependencies(ctx.Config().BuildOSCommonTarget.Variations(), kotlinPluginTag, + "androidx.compose.compiler_compiler-hosted") + } } func hasSrcExt(srcs []string, ext string) bool { @@ -911,6 +916,12 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) { if ctx.Device() { kotlincFlags = append(kotlincFlags, "-no-jdk") } + + for _, plugin := range deps.kotlinPlugins { + kotlincFlags = append(kotlincFlags, "-Xplugin="+plugin.String()) + } + flags.kotlincDeps = append(flags.kotlincDeps, deps.kotlinPlugins...) + if len(kotlincFlags) > 0 { // optimization. ctx.Variable(pctx, "kotlincFlags", strings.Join(kotlincFlags, " ")) @@ -1325,6 +1336,10 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) { j.outputFile = outputFile.WithoutRel() } +func (j *Module) useCompose() bool { + return android.InList("androidx.compose.runtime_runtime", j.properties.Static_libs) +} + // Returns a copy of the supplied flags, but with all the errorprone-related // fields copied to the regular build's fields. func enableErrorproneFlags(flags javaBuilderFlags) javaBuilderFlags { @@ -1755,6 +1770,8 @@ func (j *Module) collectDeps(ctx android.ModuleContext) deps { deps.kotlinStdlib = append(deps.kotlinStdlib, dep.HeaderJars...) case kotlinAnnotationsTag: deps.kotlinAnnotations = dep.HeaderJars + case kotlinPluginTag: + deps.kotlinPlugins = append(deps.kotlinPlugins, dep.ImplementationAndResourcesJars...) case syspropPublicStubDepTag: // This is a sysprop implementation library, forward the JavaInfoProvider from // the corresponding sysprop public stub library as SyspropPublicStubInfoProvider. diff --git a/java/builder.go b/java/builder.go index ea011b8e1..ae124a3e7 100644 --- a/java/builder.go +++ b/java/builder.go @@ -263,6 +263,7 @@ type javaBuilderFlags struct { kotlincFlags string kotlincClasspath classpath + kotlincDeps android.Paths proto android.ProtoFlags } diff --git a/java/java.go b/java/java.go index e2665ef04..2ca4ac8f0 100644 --- a/java/java.go +++ b/java/java.go @@ -286,6 +286,7 @@ var ( frameworkResTag = dependencyTag{name: "framework-res"} kotlinStdlibTag = dependencyTag{name: "kotlin-stdlib"} kotlinAnnotationsTag = dependencyTag{name: "kotlin-annotations"} + kotlinPluginTag = dependencyTag{name: "kotlin-plugin"} proguardRaiseTag = dependencyTag{name: "proguard-raise"} certificateTag = dependencyTag{name: "certificate"} instrumentationForTag = dependencyTag{name: "instrumentation_for"} @@ -380,6 +381,7 @@ type deps struct { aidlPreprocess android.OptionalPath kotlinStdlib android.Paths kotlinAnnotations android.Paths + kotlinPlugins android.Paths disableTurbine bool } diff --git a/java/kotlin.go b/java/kotlin.go index 3a6fc0f48..e4f1bc198 100644 --- a/java/kotlin.go +++ b/java/kotlin.go @@ -81,6 +81,7 @@ func kotlinCompile(ctx android.ModuleContext, outputFile android.WritablePath, var deps android.Paths deps = append(deps, flags.kotlincClasspath...) + deps = append(deps, flags.kotlincDeps...) deps = append(deps, srcJars...) deps = append(deps, commonSrcFiles...) diff --git a/java/kotlin_test.go b/java/kotlin_test.go index db3069693..cac0af3b9 100644 --- a/java/kotlin_test.go +++ b/java/kotlin_test.go @@ -281,3 +281,46 @@ func TestKaptEncodeFlags(t *testing.T) { }) } } + +func TestKotlinCompose(t *testing.T) { + result := android.GroupFixturePreparers( + PrepareForTestWithJavaDefaultModules, + ).RunTestWithBp(t, ` + java_library { + name: "androidx.compose.runtime_runtime", + } + + java_library_host { + name: "androidx.compose.compiler_compiler-hosted", + } + + java_library { + name: "withcompose", + srcs: ["a.kt"], + static_libs: ["androidx.compose.runtime_runtime"], + } + + java_library { + name: "nocompose", + srcs: ["a.kt"], + } + `) + + buildOS := result.Config.BuildOS.String() + + composeCompiler := result.ModuleForTests("androidx.compose.compiler_compiler-hosted", buildOS+"_common").Rule("combineJar").Output + withCompose := result.ModuleForTests("withcompose", "android_common") + noCompose := result.ModuleForTests("nocompose", "android_common") + + android.AssertStringListContains(t, "missing compose compiler dependency", + withCompose.Rule("kotlinc").Implicits.Strings(), composeCompiler.String()) + + android.AssertStringDoesContain(t, "missing compose compiler plugin", + withCompose.VariablesForTestsRelativeToTop()["kotlincFlags"], "-Xplugin="+composeCompiler.String()) + + android.AssertStringListDoesNotContain(t, "unexpected compose compiler dependency", + noCompose.Rule("kotlinc").Implicits.Strings(), composeCompiler.String()) + + android.AssertStringDoesNotContain(t, "unexpected compose compiler plugin", + noCompose.VariablesForTestsRelativeToTop()["kotlincFlags"], "-Xplugin="+composeCompiler.String()) +}