Merge "Prepare to generate "runtime" stubs in droidstubs" into main

This commit is contained in:
Jihoon Kang
2024-01-24 21:30:38 +00:00
committed by Gerrit Code Review
3 changed files with 125 additions and 160 deletions

View File

@@ -587,7 +587,7 @@ func (dstubs *Droidstubs) AndroidMkEntries() []android.AndroidMkEntries {
outputFile = android.OptionalPathForPath(dstubs.apiFile) outputFile = android.OptionalPathForPath(dstubs.apiFile)
} }
if !outputFile.Valid() { if !outputFile.Valid() {
outputFile = android.OptionalPathForPath(dstubs.apiVersionsXml) outputFile = android.OptionalPathForPath(dstubs.everythingArtifacts.apiVersionsXml)
} }
return []android.AndroidMkEntries{android.AndroidMkEntries{ return []android.AndroidMkEntries{android.AndroidMkEntries{
Class: "JAVA_LIBRARIES", Class: "JAVA_LIBRARIES",
@@ -598,14 +598,14 @@ func (dstubs *Droidstubs) AndroidMkEntries() []android.AndroidMkEntries {
if dstubs.Javadoc.stubsSrcJar != nil { if dstubs.Javadoc.stubsSrcJar != nil {
entries.SetPath("LOCAL_DROIDDOC_STUBS_SRCJAR", dstubs.Javadoc.stubsSrcJar) entries.SetPath("LOCAL_DROIDDOC_STUBS_SRCJAR", dstubs.Javadoc.stubsSrcJar)
} }
if dstubs.apiVersionsXml != nil { if dstubs.everythingArtifacts.apiVersionsXml != nil {
entries.SetPath("LOCAL_DROIDDOC_API_VERSIONS_XML", dstubs.apiVersionsXml) entries.SetPath("LOCAL_DROIDDOC_API_VERSIONS_XML", dstubs.everythingArtifacts.apiVersionsXml)
} }
if dstubs.annotationsZip != nil { if dstubs.everythingArtifacts.annotationsZip != nil {
entries.SetPath("LOCAL_DROIDDOC_ANNOTATIONS_ZIP", dstubs.annotationsZip) entries.SetPath("LOCAL_DROIDDOC_ANNOTATIONS_ZIP", dstubs.everythingArtifacts.annotationsZip)
} }
if dstubs.metadataZip != nil { if dstubs.everythingArtifacts.metadataZip != nil {
entries.SetPath("LOCAL_DROIDDOC_METADATA_ZIP", dstubs.metadataZip) entries.SetPath("LOCAL_DROIDDOC_METADATA_ZIP", dstubs.everythingArtifacts.metadataZip)
} }
}, },
}, },

View File

@@ -65,15 +65,22 @@ func RegisterStubsBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("prebuilt_stubs_sources", PrebuiltStubsSourcesFactory) ctx.RegisterModuleType("prebuilt_stubs_sources", PrebuiltStubsSourcesFactory)
} }
type stubsArtifacts struct {
nullabilityWarningsFile android.WritablePath
annotationsZip android.WritablePath
apiVersionsXml android.WritablePath
metadataZip android.WritablePath
metadataDir android.WritablePath
}
// Droidstubs // Droidstubs
type Droidstubs struct { type Droidstubs struct {
Javadoc Javadoc
embeddableInModuleAndImport embeddableInModuleAndImport
properties DroidstubsProperties properties DroidstubsProperties
apiFile android.Path apiFile android.Path
removedApiFile android.Path removedApiFile android.Path
nullabilityWarningsFile android.WritablePath
checkCurrentApiTimestamp android.WritablePath checkCurrentApiTimestamp android.WritablePath
updateCurrentApiTimestamp android.WritablePath updateCurrentApiTimestamp android.WritablePath
@@ -83,22 +90,14 @@ type Droidstubs struct {
checkNullabilityWarningsTimestamp android.WritablePath checkNullabilityWarningsTimestamp android.WritablePath
annotationsZip android.WritablePath everythingArtifacts stubsArtifacts
apiVersionsXml android.WritablePath exportableArtifacts stubsArtifacts
metadataZip android.WritablePath
metadataDir android.WritablePath
// Single aconfig "cache file" merged from this module and all dependencies. // Single aconfig "cache file" merged from this module and all dependencies.
mergedAconfigFiles map[string]android.Paths mergedAconfigFiles map[string]android.Paths
exportableApiFile android.WritablePath exportableApiFile android.WritablePath
exportableRemovedApiFile android.WritablePath exportableRemovedApiFile android.WritablePath
exportableNullabilityWarningsFile android.WritablePath
exportableAnnotationsZip android.WritablePath
exportableApiVersionsXml android.WritablePath
exportableMetadataZip android.WritablePath
exportableMetadataDir android.WritablePath
} }
type DroidstubsProperties struct { type DroidstubsProperties struct {
@@ -192,34 +191,22 @@ type DroidstubsProperties struct {
// Used by xsd_config // Used by xsd_config
type ApiFilePath interface { type ApiFilePath interface {
ApiFilePath() android.Path ApiFilePath(StubsType) (android.Path, error)
} }
type ApiStubsSrcProvider interface { type ApiStubsSrcProvider interface {
StubsSrcJar() android.Path StubsSrcJar(StubsType) (android.Path, error)
}
type ExportableApiStubsSrcProvider interface {
ExportableStubsSrcJar() android.Path
} }
// Provider of information about API stubs, used by java_sdk_library. // Provider of information about API stubs, used by java_sdk_library.
type ApiStubsProvider interface { type ApiStubsProvider interface {
AnnotationsZip() android.Path AnnotationsZip(StubsType) (android.Path, error)
ApiFilePath ApiFilePath
RemovedApiFilePath() android.Path RemovedApiFilePath(StubsType) (android.Path, error)
ApiStubsSrcProvider ApiStubsSrcProvider
} }
type ExportableApiStubsProvider interface {
ExportableAnnotationsZip() android.Path
ExportableApiFilePath() android.Path
ExportableRemovedApiFilePath() android.Path
ExportableApiStubsSrcProvider
}
type currentApiTimestampProvider interface { type currentApiTimestampProvider interface {
CurrentApiTimestamp() android.Path CurrentApiTimestamp() android.Path
} }
@@ -323,112 +310,86 @@ func (d *Droidstubs) OutputFiles(tag string) (android.Paths, error) {
} }
switch prefixRemovedTag { switch prefixRemovedTag {
case "": case "":
return d.StubsSrcJarWithStubsType(stubsType) stubsSrcJar, err := d.StubsSrcJar(stubsType)
return android.Paths{stubsSrcJar}, err
case ".docs.zip": case ".docs.zip":
return d.DocZipWithStubsType(stubsType) docZip, err := d.DocZip(stubsType)
return android.Paths{docZip}, err
case ".api.txt", android.DefaultDistTag: case ".api.txt", android.DefaultDistTag:
// This is the default dist path for dist properties that have no tag property. // This is the default dist path for dist properties that have no tag property.
return d.ApiFilePathWithStubsType(stubsType) apiFilePath, err := d.ApiFilePath(stubsType)
return android.Paths{apiFilePath}, err
case ".removed-api.txt": case ".removed-api.txt":
return d.RemovedApiFilePathWithStubsType(stubsType) removedApiFilePath, err := d.RemovedApiFilePath(stubsType)
return android.Paths{removedApiFilePath}, err
case ".annotations.zip": case ".annotations.zip":
return d.AnnotationsZipWithStubsType(stubsType) annotationsZip, err := d.AnnotationsZip(stubsType)
return android.Paths{annotationsZip}, err
case ".api_versions.xml": case ".api_versions.xml":
return d.ApiVersionsXmlFilePathWithStubsType(stubsType) apiVersionsXmlFilePath, err := d.ApiVersionsXmlFilePath(stubsType)
return android.Paths{apiVersionsXmlFilePath}, err
default: default:
return nil, fmt.Errorf("unsupported module reference tag %q", tag) return nil, fmt.Errorf("unsupported module reference tag %q", tag)
} }
} }
func (d *Droidstubs) AnnotationsZip() android.Path { func (d *Droidstubs) AnnotationsZip(stubsType StubsType) (android.Path, error) {
return d.annotationsZip
}
func (d *Droidstubs) ExportableAnnotationsZip() android.Path {
return d.exportableAnnotationsZip
}
func (d *Droidstubs) AnnotationsZipWithStubsType(stubsType StubsType) (android.Paths, error) {
switch stubsType { switch stubsType {
case Everything: case Everything:
return android.Paths{d.AnnotationsZip()}, nil return d.everythingArtifacts.annotationsZip, nil
case Exportable: case Exportable:
return android.Paths{d.ExportableAnnotationsZip()}, nil return d.exportableArtifacts.annotationsZip, nil
default: default:
return nil, fmt.Errorf("annotations zip not supported for the stub type %s", stubsType.String()) return nil, fmt.Errorf("annotations zip not supported for the stub type %s", stubsType.String())
} }
} }
func (d *Droidstubs) ApiFilePath() android.Path { func (d *Droidstubs) ApiFilePath(stubsType StubsType) (android.Path, error) {
return d.apiFile
}
func (d *Droidstubs) ExportableApiFilePath() android.Path {
return d.exportableApiFile
}
func (d *Droidstubs) ApiFilePathWithStubsType(stubsType StubsType) (android.Paths, error) {
switch stubsType { switch stubsType {
case Everything: case Everything:
return android.Paths{d.ApiFilePath()}, nil return d.apiFile, nil
case Exportable: case Exportable:
return android.Paths{d.ExportableApiFilePath()}, nil return d.exportableApiFile, nil
default: default:
return nil, fmt.Errorf("api file path not supported for the stub type %s", stubsType.String()) return nil, fmt.Errorf("api file path not supported for the stub type %s", stubsType.String())
} }
} }
func (d *Droidstubs) ApiVersionsXmlFilePathWithStubsType(stubsType StubsType) (android.Paths, error) { func (d *Droidstubs) ApiVersionsXmlFilePath(stubsType StubsType) (android.Path, error) {
switch stubsType { switch stubsType {
case Everything: case Everything:
return android.Paths{d.apiVersionsXml}, nil return d.everythingArtifacts.apiVersionsXml, nil
default: default:
return nil, fmt.Errorf("api versions xml file path not supported for the stub type %s", stubsType.String()) return nil, fmt.Errorf("api versions xml file path not supported for the stub type %s", stubsType.String())
} }
} }
func (d *Droidstubs) DocZipWithStubsType(stubsType StubsType) (android.Paths, error) { func (d *Droidstubs) DocZip(stubsType StubsType) (android.Path, error) {
switch stubsType { switch stubsType {
case Everything: case Everything:
return android.Paths{d.docZip}, nil return d.docZip, nil
default: default:
return nil, fmt.Errorf("docs zip not supported for the stub type %s", stubsType.String()) return nil, fmt.Errorf("docs zip not supported for the stub type %s", stubsType.String())
} }
} }
func (d *Droidstubs) RemovedApiFilePath() android.Path { func (d *Droidstubs) RemovedApiFilePath(stubsType StubsType) (android.Path, error) {
return d.removedApiFile
}
func (d *Droidstubs) ExportableRemovedApiFilePath() android.Path {
return d.exportableRemovedApiFile
}
func (d *Droidstubs) RemovedApiFilePathWithStubsType(stubsType StubsType) (android.Paths, error) {
switch stubsType { switch stubsType {
case Everything: case Everything:
return android.Paths{d.RemovedApiFilePath()}, nil return d.removedApiFile, nil
case Exportable: case Exportable:
return android.Paths{d.ExportableRemovedApiFilePath()}, nil return d.exportableRemovedApiFile, nil
default: default:
return nil, fmt.Errorf("removed api file path not supported for the stub type %s", stubsType.String()) return nil, fmt.Errorf("removed api file path not supported for the stub type %s", stubsType.String())
} }
} }
func (d *Droidstubs) StubsSrcJar() android.Path { func (d *Droidstubs) StubsSrcJar(stubsType StubsType) (android.Path, error) {
return d.stubsSrcJar
}
func (d *Droidstubs) ExportableStubsSrcJar() android.Path {
return d.exportableStubsSrcJar
}
func (d *Droidstubs) StubsSrcJarWithStubsType(stubsType StubsType) (android.Paths, error) {
switch stubsType { switch stubsType {
case Everything: case Everything:
return android.Paths{d.StubsSrcJar()}, nil return d.stubsSrcJar, nil
case Exportable: case Exportable:
return android.Paths{d.ExportableStubsSrcJar()}, nil return d.exportableStubsSrcJar, nil
default: default:
return nil, fmt.Errorf("stubs srcjar not supported for the stub type %s", stubsType.String()) return nil, fmt.Errorf("stubs srcjar not supported for the stub type %s", stubsType.String())
} }
@@ -576,11 +537,11 @@ func (d *Droidstubs) apiLevelsAnnotationsFlags(ctx android.ModuleContext, cmd *a
var apiVersions android.Path var apiVersions android.Path
if proptools.Bool(d.properties.Api_levels_annotations_enabled) { if proptools.Bool(d.properties.Api_levels_annotations_enabled) {
d.apiLevelsGenerationFlags(ctx, cmd, stubsType, apiVersionsXml) d.apiLevelsGenerationFlags(ctx, cmd, stubsType, apiVersionsXml)
apiVersions = d.apiVersionsXml apiVersions = d.everythingArtifacts.apiVersionsXml
} else { } else {
ctx.VisitDirectDepsWithTag(metalavaAPILevelsModuleTag, func(m android.Module) { ctx.VisitDirectDepsWithTag(metalavaAPILevelsModuleTag, func(m android.Module) {
if s, ok := m.(*Droidstubs); ok { if s, ok := m.(*Droidstubs); ok {
apiVersions = s.apiVersionsXml apiVersions = s.everythingArtifacts.apiVersionsXml
} else { } else {
ctx.PropertyErrorf("api_levels_module", ctx.PropertyErrorf("api_levels_module",
"module %q is not a droidstubs module", ctx.OtherModuleName(m)) "module %q is not a droidstubs module", ctx.OtherModuleName(m))
@@ -839,28 +800,28 @@ func (d *Droidstubs) everythingStubCmd(ctx android.ModuleContext, params stubsCo
} }
if params.writeSdkValues { if params.writeSdkValues {
d.metadataDir = android.PathForModuleOut(ctx, Everything.String(), "metadata") d.everythingArtifacts.metadataDir = android.PathForModuleOut(ctx, Everything.String(), "metadata")
d.metadataZip = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"-metadata.zip") d.everythingArtifacts.metadataZip = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"-metadata.zip")
} }
if Bool(d.properties.Annotations_enabled) { if Bool(d.properties.Annotations_enabled) {
if params.validatingNullability { if params.validatingNullability {
d.nullabilityWarningsFile = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"_nullability_warnings.txt") d.everythingArtifacts.nullabilityWarningsFile = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"_nullability_warnings.txt")
} }
d.annotationsZip = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"_annotations.zip") d.everythingArtifacts.annotationsZip = android.PathForModuleOut(ctx, Everything.String(), ctx.ModuleName()+"_annotations.zip")
} }
if Bool(d.properties.Api_levels_annotations_enabled) { if Bool(d.properties.Api_levels_annotations_enabled) {
d.apiVersionsXml = android.PathForModuleOut(ctx, Everything.String(), "api-versions.xml") d.everythingArtifacts.apiVersionsXml = android.PathForModuleOut(ctx, Everything.String(), "api-versions.xml")
} }
commonCmdParams := stubsCommandParams{ commonCmdParams := stubsCommandParams{
srcJarDir: srcJarDir, srcJarDir: srcJarDir,
stubsDir: stubsDir, stubsDir: stubsDir,
stubsSrcJar: d.Javadoc.stubsSrcJar, stubsSrcJar: d.Javadoc.stubsSrcJar,
metadataDir: d.metadataDir, metadataDir: d.everythingArtifacts.metadataDir,
apiVersionsXml: d.apiVersionsXml, apiVersionsXml: d.everythingArtifacts.apiVersionsXml,
nullabilityWarningsFile: d.nullabilityWarningsFile, nullabilityWarningsFile: d.everythingArtifacts.nullabilityWarningsFile,
annotationsZip: d.annotationsZip, annotationsZip: d.everythingArtifacts.annotationsZip,
stubConfig: params, stubConfig: params,
} }
@@ -883,9 +844,9 @@ func (d *Droidstubs) everythingStubCmd(ctx android.ModuleContext, params stubsCo
BuiltTool("soong_zip"). BuiltTool("soong_zip").
Flag("-write_if_changed"). Flag("-write_if_changed").
Flag("-d"). Flag("-d").
FlagWithOutput("-o ", d.metadataZip). FlagWithOutput("-o ", d.everythingArtifacts.metadataZip).
FlagWithArg("-C ", d.metadataDir.String()). FlagWithArg("-C ", d.everythingArtifacts.metadataDir.String()).
FlagWithArg("-D ", d.metadataDir.String()) FlagWithArg("-D ", d.everythingArtifacts.metadataDir.String())
} }
// TODO: We don't really need two separate API files, but this is a reminiscence of how // TODO: We don't really need two separate API files, but this is a reminiscence of how
@@ -1018,23 +979,23 @@ func (d *Droidstubs) exportableStubCmd(ctx android.ModuleContext, params stubsCo
d.Javadoc.exportableStubsSrcJar = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"-"+"stubs.srcjar") d.Javadoc.exportableStubsSrcJar = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"-"+"stubs.srcjar")
optionalCmdParams.stubsSrcJar = d.Javadoc.exportableStubsSrcJar optionalCmdParams.stubsSrcJar = d.Javadoc.exportableStubsSrcJar
if params.writeSdkValues { if params.writeSdkValues {
d.exportableMetadataZip = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"-metadata.zip") d.exportableArtifacts.metadataZip = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"-metadata.zip")
d.exportableMetadataDir = android.PathForModuleOut(ctx, params.stubsType.String(), "metadata") d.exportableArtifacts.metadataDir = android.PathForModuleOut(ctx, params.stubsType.String(), "metadata")
optionalCmdParams.metadataZip = d.exportableMetadataZip optionalCmdParams.metadataZip = d.exportableArtifacts.metadataZip
optionalCmdParams.metadataDir = d.exportableMetadataDir optionalCmdParams.metadataDir = d.exportableArtifacts.metadataDir
} }
if Bool(d.properties.Annotations_enabled) { if Bool(d.properties.Annotations_enabled) {
if params.validatingNullability { if params.validatingNullability {
d.exportableNullabilityWarningsFile = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"_nullability_warnings.txt") d.exportableArtifacts.nullabilityWarningsFile = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"_nullability_warnings.txt")
optionalCmdParams.nullabilityWarningsFile = d.exportableNullabilityWarningsFile optionalCmdParams.nullabilityWarningsFile = d.exportableArtifacts.nullabilityWarningsFile
} }
d.exportableAnnotationsZip = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"_annotations.zip") d.exportableArtifacts.annotationsZip = android.PathForModuleOut(ctx, params.stubsType.String(), ctx.ModuleName()+"_annotations.zip")
optionalCmdParams.annotationsZip = d.exportableAnnotationsZip optionalCmdParams.annotationsZip = d.exportableArtifacts.annotationsZip
} }
if Bool(d.properties.Api_levels_annotations_enabled) { if Bool(d.properties.Api_levels_annotations_enabled) {
d.exportableApiVersionsXml = android.PathForModuleOut(ctx, params.stubsType.String(), "api-versions.xml") d.exportableArtifacts.apiVersionsXml = android.PathForModuleOut(ctx, params.stubsType.String(), "api-versions.xml")
optionalCmdParams.apiVersionsXml = d.exportableApiVersionsXml optionalCmdParams.apiVersionsXml = d.exportableArtifacts.apiVersionsXml
} }
if params.checkApi || String(d.properties.Api_filename) != "" { if params.checkApi || String(d.properties.Api_filename) != "" {
@@ -1235,7 +1196,7 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
} }
if String(d.properties.Check_nullability_warnings) != "" { if String(d.properties.Check_nullability_warnings) != "" {
if d.nullabilityWarningsFile == nil { if d.everythingArtifacts.nullabilityWarningsFile == nil {
ctx.PropertyErrorf("check_nullability_warnings", ctx.PropertyErrorf("check_nullability_warnings",
"Cannot specify check_nullability_warnings unless validating nullability") "Cannot specify check_nullability_warnings unless validating nullability")
} }
@@ -1252,13 +1213,13 @@ func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
` 2. Update the file of expected warnings by running:\n`+ ` 2. Update the file of expected warnings by running:\n`+
` cp %s %s\n`+ ` cp %s %s\n`+
` and submitting the updated file as part of your change.`, ` and submitting the updated file as part of your change.`,
d.nullabilityWarningsFile, checkNullabilityWarnings) d.everythingArtifacts.nullabilityWarningsFile, checkNullabilityWarnings)
rule := android.NewRuleBuilder(pctx, ctx) rule := android.NewRuleBuilder(pctx, ctx)
rule.Command(). rule.Command().
Text("("). Text("(").
Text("diff").Input(checkNullabilityWarnings).Input(d.nullabilityWarningsFile). Text("diff").Input(checkNullabilityWarnings).Input(d.everythingArtifacts.nullabilityWarningsFile).
Text("&&"). Text("&&").
Text("touch").Output(d.checkNullabilityWarningsTimestamp). Text("touch").Output(d.checkNullabilityWarningsTimestamp).
Text(") || ("). Text(") || (").
@@ -1352,8 +1313,8 @@ func (p *PrebuiltStubsSources) OutputFiles(tag string) (android.Paths, error) {
} }
} }
func (d *PrebuiltStubsSources) StubsSrcJar() android.Path { func (d *PrebuiltStubsSources) StubsSrcJar(_ StubsType) (android.Path, error) {
return d.stubsSrcJar return d.stubsSrcJar, nil
} }
func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleContext) { func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleContext) {

View File

@@ -15,6 +15,7 @@
package java package java
import ( import (
"errors"
"fmt" "fmt"
"path" "path"
"path/filepath" "path/filepath"
@@ -752,75 +753,78 @@ func (paths *scopePaths) extractExportableStubsLibraryInfoFromDependency(ctx and
} }
} }
func (paths *scopePaths) treatDepAsApiStubsProvider(dep android.Module, action func(provider ApiStubsProvider)) error { func (paths *scopePaths) treatDepAsApiStubsProvider(dep android.Module, action func(provider ApiStubsProvider) error) error {
if apiStubsProvider, ok := dep.(ApiStubsProvider); ok { if apiStubsProvider, ok := dep.(ApiStubsProvider); ok {
action(apiStubsProvider) err := action(apiStubsProvider)
return nil if err != nil {
} else { return err
return fmt.Errorf("expected module that implements ApiStubsProvider, e.g. droidstubs") }
}
}
func (paths *scopePaths) treatDepAsExportableApiStubsProvider(dep android.Module, action func(provider ExportableApiStubsProvider)) error {
if exportableApiStubsProvider, ok := dep.(ExportableApiStubsProvider); ok {
action(exportableApiStubsProvider)
return nil return nil
} else { } else {
return fmt.Errorf("expected module that implements ExportableApiStubsSrcProvider, e.g. droidstubs") return fmt.Errorf("expected module that implements ExportableApiStubsSrcProvider, e.g. droidstubs")
} }
} }
func (paths *scopePaths) treatDepAsApiStubsSrcProvider(dep android.Module, action func(provider ApiStubsSrcProvider)) error { func (paths *scopePaths) treatDepAsApiStubsSrcProvider(dep android.Module, action func(provider ApiStubsSrcProvider) error) error {
if apiStubsProvider, ok := dep.(ApiStubsSrcProvider); ok { if apiStubsProvider, ok := dep.(ApiStubsSrcProvider); ok {
action(apiStubsProvider) err := action(apiStubsProvider)
if err != nil {
return err
}
return nil return nil
} else { } else {
return fmt.Errorf("expected module that implements ApiStubsSrcProvider, e.g. droidstubs") return fmt.Errorf("expected module that implements ApiStubsSrcProvider, e.g. droidstubs")
} }
} }
func (paths *scopePaths) extractApiInfoFromApiStubsProvider(provider ApiStubsProvider) { func (paths *scopePaths) extractApiInfoFromApiStubsProvider(provider ApiStubsProvider, stubsType StubsType) error {
paths.annotationsZip = android.OptionalPathForPath(provider.AnnotationsZip()) var annotationsZip, currentApiFilePath, removedApiFilePath android.Path
paths.currentApiFilePath = android.OptionalPathForPath(provider.ApiFilePath()) annotationsZip, annotationsZipErr := provider.AnnotationsZip(stubsType)
paths.removedApiFilePath = android.OptionalPathForPath(provider.RemovedApiFilePath()) currentApiFilePath, currentApiFilePathErr := provider.ApiFilePath(stubsType)
} removedApiFilePath, removedApiFilePathErr := provider.RemovedApiFilePath(stubsType)
func (paths *scopePaths) extractApiInfoFromExportableApiStubsProvider(provider ExportableApiStubsProvider) { combinedError := errors.Join(annotationsZipErr, currentApiFilePathErr, removedApiFilePathErr)
paths.annotationsZip = android.OptionalPathForPath(provider.ExportableAnnotationsZip())
paths.currentApiFilePath = android.OptionalPathForPath(provider.ExportableApiFilePath()) if combinedError == nil {
paths.removedApiFilePath = android.OptionalPathForPath(provider.ExportableRemovedApiFilePath()) paths.annotationsZip = android.OptionalPathForPath(annotationsZip)
paths.currentApiFilePath = android.OptionalPathForPath(currentApiFilePath)
paths.removedApiFilePath = android.OptionalPathForPath(removedApiFilePath)
}
return combinedError
} }
func (paths *scopePaths) extractApiInfoFromDep(ctx android.ModuleContext, dep android.Module) error { func (paths *scopePaths) extractApiInfoFromDep(ctx android.ModuleContext, dep android.Module) error {
return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) { return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) error {
paths.extractApiInfoFromApiStubsProvider(provider) return paths.extractApiInfoFromApiStubsProvider(provider, Everything)
}) })
} }
func (paths *scopePaths) extractStubsSourceInfoFromApiStubsProviders(provider ApiStubsSrcProvider) { func (paths *scopePaths) extractStubsSourceInfoFromApiStubsProviders(provider ApiStubsSrcProvider, stubsType StubsType) error {
paths.stubsSrcJar = android.OptionalPathForPath(provider.StubsSrcJar()) stubsSrcJar, err := provider.StubsSrcJar(stubsType)
} if err == nil {
paths.stubsSrcJar = android.OptionalPathForPath(stubsSrcJar)
func (paths *scopePaths) extractStubsSourceInfoFromExportableApiStubsProviders(provider ExportableApiStubsSrcProvider) { }
paths.stubsSrcJar = android.OptionalPathForPath(provider.ExportableStubsSrcJar()) return err
} }
func (paths *scopePaths) extractStubsSourceInfoFromDep(ctx android.ModuleContext, dep android.Module) error { func (paths *scopePaths) extractStubsSourceInfoFromDep(ctx android.ModuleContext, dep android.Module) error {
return paths.treatDepAsApiStubsSrcProvider(dep, func(provider ApiStubsSrcProvider) { return paths.treatDepAsApiStubsSrcProvider(dep, func(provider ApiStubsSrcProvider) error {
paths.extractStubsSourceInfoFromApiStubsProviders(provider) return paths.extractStubsSourceInfoFromApiStubsProviders(provider, Everything)
}) })
} }
func (paths *scopePaths) extractStubsSourceAndApiInfoFromApiStubsProvider(ctx android.ModuleContext, dep android.Module) error { func (paths *scopePaths) extractStubsSourceAndApiInfoFromApiStubsProvider(ctx android.ModuleContext, dep android.Module) error {
if ctx.Config().ReleaseHiddenApiExportableStubs() { if ctx.Config().ReleaseHiddenApiExportableStubs() {
return paths.treatDepAsExportableApiStubsProvider(dep, func(provider ExportableApiStubsProvider) { return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) error {
paths.extractApiInfoFromExportableApiStubsProvider(provider) extractApiInfoErr := paths.extractApiInfoFromApiStubsProvider(provider, Exportable)
paths.extractStubsSourceInfoFromExportableApiStubsProviders(provider) extractStubsSourceInfoErr := paths.extractStubsSourceInfoFromApiStubsProviders(provider, Exportable)
return errors.Join(extractApiInfoErr, extractStubsSourceInfoErr)
}) })
} }
return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) { return paths.treatDepAsApiStubsProvider(dep, func(provider ApiStubsProvider) error {
paths.extractApiInfoFromApiStubsProvider(provider) extractApiInfoErr := paths.extractApiInfoFromApiStubsProvider(provider, Everything)
paths.extractStubsSourceInfoFromApiStubsProviders(provider) extractStubsSourceInfoErr := paths.extractStubsSourceInfoFromApiStubsProviders(provider, Everything)
return errors.Join(extractApiInfoErr, extractStubsSourceInfoErr)
}) })
} }