AIDEGen: Collect apt generated sources

The Java compiler may generate sources when processing annotations.
These sources are currently not included in the IDE project model, which
results in unresolved symbols when using Hilt and other annotation
processors. These sources are not passed to the Java compiler for
compilation, so they cannot be handled like other Java module sources.

This change archives the generated sources and appends them to the
existing srcjar list in module_bp_java_deps.json.

Test: go test .
Test: Verified that module_bp_java_deps.json contained srcjar entry
Test:   with path/to/android_common/javac/anno.srcjar.
Test: Verified that IntelliJ can resolve generated symbols after
Test:   invoking aidegen.
Change-Id: I6a3011f9140fd25f785178baee0cd6074ad94600
This commit is contained in:
Vadim Spivak
2023-06-08 06:14:59 +00:00
parent e3c11d0aad
commit 3c496f00fa
3 changed files with 36 additions and 13 deletions

View File

@@ -500,6 +500,8 @@ type Module struct {
maxSdkVersion android.ApiLevel maxSdkVersion android.ApiLevel
sourceExtensions []string sourceExtensions []string
annoSrcJars android.Paths
} }
func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error { func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error {
@@ -1255,8 +1257,9 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) {
// this module, or else we could have duplicated errorprone messages. // this module, or else we could have duplicated errorprone messages.
errorproneFlags := enableErrorproneFlags(flags) errorproneFlags := enableErrorproneFlags(flags)
errorprone := android.PathForModuleOut(ctx, "errorprone", jarName) errorprone := android.PathForModuleOut(ctx, "errorprone", jarName)
errorproneAnnoSrcJar := android.PathForModuleOut(ctx, "errorprone", "anno.srcjar")
transformJavaToClasses(ctx, errorprone, -1, uniqueJavaFiles, srcJars, errorproneFlags, nil, transformJavaToClasses(ctx, errorprone, -1, uniqueJavaFiles, srcJars, errorproneAnnoSrcJar, errorproneFlags, nil,
"errorprone", "errorprone") "errorprone", "errorprone")
extraJarDeps = append(extraJarDeps, errorprone) extraJarDeps = append(extraJarDeps, errorprone)
@@ -1657,13 +1660,15 @@ func (j *Module) compileJavaClasses(ctx android.ModuleContext, jarName string, i
srcFiles, srcJars android.Paths, flags javaBuilderFlags, extraJarDeps android.Paths) android.WritablePath { srcFiles, srcJars android.Paths, flags javaBuilderFlags, extraJarDeps android.Paths) android.WritablePath {
kzipName := pathtools.ReplaceExtension(jarName, "kzip") kzipName := pathtools.ReplaceExtension(jarName, "kzip")
annoSrcJar := android.PathForModuleOut(ctx, "javac", "anno.srcjar")
if idx >= 0 { if idx >= 0 {
kzipName = strings.TrimSuffix(jarName, filepath.Ext(jarName)) + strconv.Itoa(idx) + ".kzip" kzipName = strings.TrimSuffix(jarName, filepath.Ext(jarName)) + strconv.Itoa(idx) + ".kzip"
annoSrcJar = android.PathForModuleOut(ctx, "javac", "anno-"+strconv.Itoa(idx)+".srcjar")
jarName += strconv.Itoa(idx) jarName += strconv.Itoa(idx)
} }
classes := android.PathForModuleOut(ctx, "javac", jarName).OutputPath classes := android.PathForModuleOut(ctx, "javac", jarName).OutputPath
TransformJavaToClasses(ctx, classes, idx, srcFiles, srcJars, flags, extraJarDeps) TransformJavaToClasses(ctx, classes, idx, srcFiles, srcJars, annoSrcJar, flags, extraJarDeps)
if ctx.Config().EmitXrefRules() { if ctx.Config().EmitXrefRules() {
extractionFile := android.PathForModuleOut(ctx, kzipName) extractionFile := android.PathForModuleOut(ctx, kzipName)
@@ -1671,6 +1676,10 @@ func (j *Module) compileJavaClasses(ctx android.ModuleContext, jarName string, i
j.kytheFiles = append(j.kytheFiles, extractionFile) j.kytheFiles = append(j.kytheFiles, extractionFile)
} }
if len(flags.processorPath) > 0 {
j.annoSrcJars = append(j.annoSrcJars, annoSrcJar)
}
return classes return classes
} }
@@ -1850,6 +1859,7 @@ func (j *Module) IDEInfo(dpInfo *android.IdeInfo) {
dpInfo.Paths = append(dpInfo.Paths, j.modulePaths...) dpInfo.Paths = append(dpInfo.Paths, j.modulePaths...)
dpInfo.Static_libs = append(dpInfo.Static_libs, j.properties.Static_libs...) dpInfo.Static_libs = append(dpInfo.Static_libs, j.properties.Static_libs...)
dpInfo.Libs = append(dpInfo.Libs, j.properties.Libs...) dpInfo.Libs = append(dpInfo.Libs, j.properties.Libs...)
dpInfo.SrcJars = append(dpInfo.SrcJars, j.annoSrcJars.Strings()...)
} }
func (j *Module) CompilerDeps() []string { func (j *Module) CompilerDeps() []string {

View File

@@ -42,7 +42,8 @@ var (
// TODO(b/143658984): goma can't handle the --system argument to javac. // TODO(b/143658984): goma can't handle the --system argument to javac.
javac, javacRE = pctx.MultiCommandRemoteStaticRules("javac", javac, javacRE = pctx.MultiCommandRemoteStaticRules("javac",
blueprint.RuleParams{ blueprint.RuleParams{
Command: `rm -rf "$outDir" "$annoDir" "$srcJarDir" "$out" && mkdir -p "$outDir" "$annoDir" "$srcJarDir" && ` + Command: `rm -rf "$outDir" "$annoDir" "$annoSrcJar" "$srcJarDir" "$out" && ` +
`mkdir -p "$outDir" "$annoDir" "$srcJarDir" && ` +
`${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` + `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
`(if [ -s $srcJarDir/list ] || [ -s $out.rsp ] ; then ` + `(if [ -s $srcJarDir/list ] || [ -s $out.rsp ] ; then ` +
`${config.SoongJavacWrapper} $javaTemplate${config.JavacCmd} ` + `${config.SoongJavacWrapper} $javaTemplate${config.JavacCmd} ` +
@@ -50,6 +51,7 @@ var (
`$processorpath $processor $javacFlags $bootClasspath $classpath ` + `$processorpath $processor $javacFlags $bootClasspath $classpath ` +
`-source $javaVersion -target $javaVersion ` + `-source $javaVersion -target $javaVersion ` +
`-d $outDir -s $annoDir @$out.rsp @$srcJarDir/list ; fi ) && ` + `-d $outDir -s $annoDir @$out.rsp @$srcJarDir/list ; fi ) && ` +
`$annoSrcJarTemplate${config.SoongZipCmd} -jar -o $annoSrcJar -C $annoDir -D $annoDir && ` +
`$zipTemplate${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir && ` + `$zipTemplate${config.SoongZipCmd} -jar -o $out -C $outDir -D $outDir && ` +
`rm -rf "$srcJarDir"`, `rm -rf "$srcJarDir"`,
CommandDeps: []string{ CommandDeps: []string{
@@ -73,8 +75,15 @@ var (
ExecStrategy: "${config.REJavacExecStrategy}", ExecStrategy: "${config.REJavacExecStrategy}",
Platform: map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"}, Platform: map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
}, },
"$annoSrcJarTemplate": &remoteexec.REParams{
Labels: map[string]string{"type": "tool", "name": "soong_zip"},
Inputs: []string{"${config.SoongZipCmd}", "$annoDir"},
OutputFiles: []string{"$annoSrcJar"},
ExecStrategy: "${config.REJavacExecStrategy}",
Platform: map[string]string{remoteexec.PoolKey: "${config.REJavaPool}"},
},
}, []string{"javacFlags", "bootClasspath", "classpath", "processorpath", "processor", "srcJars", "srcJarDir", }, []string{"javacFlags", "bootClasspath", "classpath", "processorpath", "processor", "srcJars", "srcJarDir",
"outDir", "annoDir", "javaVersion"}, nil) "outDir", "annoDir", "annoSrcJar", "javaVersion"}, nil)
_ = pctx.VariableFunc("kytheCorpus", _ = pctx.VariableFunc("kytheCorpus",
func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() }) func(ctx android.PackageVarContext) string { return ctx.Config().XrefCorpusName() })
@@ -312,7 +321,7 @@ func DefaultJavaBuilderFlags() javaBuilderFlags {
} }
func TransformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath, shardIdx int, func TransformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath, shardIdx int,
srcFiles, srcJars android.Paths, flags javaBuilderFlags, deps android.Paths) { srcFiles, srcJars android.Paths, annoSrcJar android.WritablePath, flags javaBuilderFlags, deps android.Paths) {
// Compile java sources into .class files // Compile java sources into .class files
desc := "javac" desc := "javac"
@@ -320,7 +329,7 @@ func TransformJavaToClasses(ctx android.ModuleContext, outputFile android.Writab
desc += strconv.Itoa(shardIdx) desc += strconv.Itoa(shardIdx)
} }
transformJavaToClasses(ctx, outputFile, shardIdx, srcFiles, srcJars, flags, deps, "javac", desc) transformJavaToClasses(ctx, outputFile, shardIdx, srcFiles, srcJars, annoSrcJar, flags, deps, "javac", desc)
} }
// Emits the rule to generate Xref input file (.kzip file) for the given set of source files and source jars // Emits the rule to generate Xref input file (.kzip file) for the given set of source files and source jars
@@ -494,7 +503,7 @@ func TurbineApt(ctx android.ModuleContext, outputSrcJar, outputResJar android.Wr
// suffix will be appended to various intermediate files and directories to avoid collisions when // suffix will be appended to various intermediate files and directories to avoid collisions when
// this function is called twice in the same module directory. // this function is called twice in the same module directory.
func transformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath, func transformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath,
shardIdx int, srcFiles, srcJars android.Paths, shardIdx int, srcFiles, srcJars android.Paths, annoSrcJar android.WritablePath,
flags javaBuilderFlags, deps android.Paths, flags javaBuilderFlags, deps android.Paths,
intermediatesDir, desc string) { intermediatesDir, desc string) {
@@ -544,6 +553,7 @@ func transformJavaToClasses(ctx android.ModuleContext, outputFile android.Writab
Rule: rule, Rule: rule,
Description: desc, Description: desc,
Output: outputFile, Output: outputFile,
ImplicitOutput: annoSrcJar,
Inputs: srcFiles, Inputs: srcFiles,
Implicits: deps, Implicits: deps,
Args: map[string]string{ Args: map[string]string{
@@ -556,6 +566,7 @@ func transformJavaToClasses(ctx android.ModuleContext, outputFile android.Writab
"srcJarDir": android.PathForModuleOut(ctx, intermediatesDir, srcJarDir).String(), "srcJarDir": android.PathForModuleOut(ctx, intermediatesDir, srcJarDir).String(),
"outDir": android.PathForModuleOut(ctx, intermediatesDir, outDir).String(), "outDir": android.PathForModuleOut(ctx, intermediatesDir, outDir).String(),
"annoDir": android.PathForModuleOut(ctx, intermediatesDir, annoDir).String(), "annoDir": android.PathForModuleOut(ctx, intermediatesDir, annoDir).String(),
"annoSrcJar": annoSrcJar.String(),
"javaVersion": flags.javaVersion.String(), "javaVersion": flags.javaVersion.String(),
}, },
}) })

View File

@@ -1878,8 +1878,10 @@ func (al *ApiLibrary) GenerateAndroidBuildActions(ctx android.ModuleContext) {
flags.javacFlags = strings.Join(al.properties.Javacflags, " ") flags.javacFlags = strings.Join(al.properties.Javacflags, " ")
flags.classpath = classpath(classPaths) flags.classpath = classpath(classPaths)
annoSrcJar := android.PathForModuleOut(ctx, ctx.ModuleName(), "anno.srcjar")
TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{}, TransformJavaToClasses(ctx, al.stubsJarWithoutStaticLibs, 0, android.Paths{},
android.Paths{al.stubsSrcJar}, flags, android.Paths{}) android.Paths{al.stubsSrcJar}, annoSrcJar, flags, android.Paths{})
} }
builder := android.NewRuleBuilder(pctx, ctx) builder := android.NewRuleBuilder(pctx, ctx)