From b4cd5df5736b0561471d0861a2d8a6b0d1cdf118 Mon Sep 17 00:00:00 2001 From: Spandan Das Date: Thu, 8 Aug 2024 21:57:22 +0000 Subject: [PATCH] Make IdeInfo aware of jarjar-ing jarjar can be used to repackage a java_library. e.g. Foo.java in package com.android might get repackaged to prefix.com.android.Foo in the resultant jar. To allow code completion of rdeps, we should use the repackaged jar instead of the src files. This CL sets dpInfo.Jars to the header jar _only_ when jarjar_rules is not empty. We could probably set `Jars` to the header jar even for non jarjar-d libraries and get rid of `Srcs`, `SrcJars` altogether, but that would likely slow down any tools that index out/soong/module_bp_java_deps.json for code completion. Test: go test ./java Bug: 356572093 Change-Id: Ib45810799a479cb315aed011a34351d386a21357 --- java/base.go | 14 +++++++++----- java/jdeps_test.go | 21 ++++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/java/base.go b/java/base.go index f820629e9..49ff22f93 100644 --- a/java/base.go +++ b/java/base.go @@ -2027,16 +2027,20 @@ func (j *Module) ClassLoaderContexts() dexpreopt.ClassLoaderContextMap { // Collect information for opening IDE project files in java/jdeps.go. func (j *Module) IDEInfo(dpInfo *android.IdeInfo) { - dpInfo.Deps = append(dpInfo.Deps, j.CompilerDeps()...) - dpInfo.Srcs = append(dpInfo.Srcs, j.expandIDEInfoCompiledSrcs...) - dpInfo.SrcJars = append(dpInfo.SrcJars, j.compiledSrcJars.Strings()...) - dpInfo.Aidl_include_dirs = append(dpInfo.Aidl_include_dirs, j.deviceProperties.Aidl.Include_dirs...) + // jarjar rules will repackage the sources. To prevent misleading results, IdeInfo should contain the + // repackaged jar instead of the input sources. if j.expandJarjarRules != nil { dpInfo.Jarjar_rules = append(dpInfo.Jarjar_rules, j.expandJarjarRules.String()) + dpInfo.Jars = append(dpInfo.Jars, j.headerJarFile.String()) + } else { + dpInfo.Srcs = append(dpInfo.Srcs, j.expandIDEInfoCompiledSrcs...) + dpInfo.SrcJars = append(dpInfo.SrcJars, j.compiledSrcJars.Strings()...) + dpInfo.SrcJars = append(dpInfo.SrcJars, j.annoSrcJars.Strings()...) } + dpInfo.Deps = append(dpInfo.Deps, j.CompilerDeps()...) + dpInfo.Aidl_include_dirs = append(dpInfo.Aidl_include_dirs, j.deviceProperties.Aidl.Include_dirs...) dpInfo.Static_libs = append(dpInfo.Static_libs, j.properties.Static_libs...) dpInfo.Libs = append(dpInfo.Libs, j.properties.Libs...) - dpInfo.SrcJars = append(dpInfo.SrcJars, j.annoSrcJars.Strings()...) } func (j *Module) CompilerDeps() []string { diff --git a/java/jdeps_test.go b/java/jdeps_test.go index 47bfac16c..ff54da92a 100644 --- a/java/jdeps_test.go +++ b/java/jdeps_test.go @@ -91,16 +91,23 @@ func TestCollectJavaLibraryPropertiesAddAidlIncludeDirs(t *testing.T) { } } -func TestCollectJavaLibraryPropertiesAddJarjarRules(t *testing.T) { - expected := "Jarjar_rules.txt" - module := LibraryFactory().(*Library) - module.expandJarjarRules = android.PathForTesting(expected) +func TestCollectJavaLibraryWithJarJarRules(t *testing.T) { + ctx, _ := testJava(t, + ` + java_library { + name: "javalib", + srcs: ["foo.java"], + jarjar_rules: "jarjar_rules.txt", + } + `) + module := ctx.ModuleForTests("javalib", "android_common").Module().(*Library) dpInfo := &android.IdeInfo{} module.IDEInfo(dpInfo) - - if dpInfo.Jarjar_rules[0] != expected { - t.Errorf("Library.IDEInfo() Jarjar_rules = %v, want %v", dpInfo.Jarjar_rules[0], expected) + android.AssertBoolEquals(t, "IdeInfo.Srcs of repackaged library should be empty", true, len(dpInfo.Srcs) == 0) + android.AssertStringEquals(t, "IdeInfo.Jar_rules of repackaged library should not be empty", "jarjar_rules.txt", dpInfo.Jarjar_rules[0]) + if !android.SubstringInList(dpInfo.Jars, "soong/.intermediates/javalib/android_common/jarjar/turbine/javalib.jar") { + t.Errorf("IdeInfo.Jars of repackaged library should contain the output of jarjar-ing. All outputs: %v\n", dpInfo.Jars) } }