Merge changes Ie5939628,Id103f70f am: d519b331f2
am: 6aa1338f6c
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1963154 Change-Id: I5c8fbed7690dd4e39ed0314df9a2004794b9ce90
This commit is contained in:
@@ -2755,7 +2755,7 @@ type sdkLibrarySdkMemberProperties struct {
|
|||||||
android.SdkMemberPropertiesBase
|
android.SdkMemberPropertiesBase
|
||||||
|
|
||||||
// Scope to per scope properties.
|
// Scope to per scope properties.
|
||||||
Scopes map[*apiScope]scopeProperties
|
Scopes map[*apiScope]*scopeProperties
|
||||||
|
|
||||||
// The Java stubs source files.
|
// The Java stubs source files.
|
||||||
Stub_srcs []string
|
Stub_srcs []string
|
||||||
@@ -2808,14 +2808,14 @@ type scopeProperties struct {
|
|||||||
StubsSrcJar android.Path
|
StubsSrcJar android.Path
|
||||||
CurrentApiFile android.Path
|
CurrentApiFile android.Path
|
||||||
RemovedApiFile android.Path
|
RemovedApiFile android.Path
|
||||||
AnnotationsZip android.Path
|
AnnotationsZip android.Path `supported_build_releases:"T+"`
|
||||||
SdkVersion string
|
SdkVersion string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
|
func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
|
||||||
sdk := variant.(*SdkLibrary)
|
sdk := variant.(*SdkLibrary)
|
||||||
|
|
||||||
s.Scopes = make(map[*apiScope]scopeProperties)
|
s.Scopes = make(map[*apiScope]*scopeProperties)
|
||||||
for _, apiScope := range allApiScopes {
|
for _, apiScope := range allApiScopes {
|
||||||
paths := sdk.findScopePaths(apiScope)
|
paths := sdk.findScopePaths(apiScope)
|
||||||
if paths == nil {
|
if paths == nil {
|
||||||
@@ -2838,7 +2838,7 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe
|
|||||||
if paths.annotationsZip.Valid() {
|
if paths.annotationsZip.Valid() {
|
||||||
properties.AnnotationsZip = paths.annotationsZip.Path()
|
properties.AnnotationsZip = paths.annotationsZip.Path()
|
||||||
}
|
}
|
||||||
s.Scopes[apiScope] = properties
|
s.Scopes[apiScope] = &properties
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -269,6 +269,51 @@ func (p *propertyPruner) gatherFields(structType reflect.Type, containingStructA
|
|||||||
subNamePrefix = name + "."
|
subNamePrefix = name + "."
|
||||||
}
|
}
|
||||||
p.gatherFields(fieldType, fieldGetter, subNamePrefix, selector)
|
p.gatherFields(fieldType, fieldGetter, subNamePrefix, selector)
|
||||||
|
|
||||||
|
case reflect.Map:
|
||||||
|
// Get the type of the values stored in the map.
|
||||||
|
valueType := fieldType.Elem()
|
||||||
|
// Skip over * types.
|
||||||
|
if valueType.Kind() == reflect.Ptr {
|
||||||
|
valueType = valueType.Elem()
|
||||||
|
}
|
||||||
|
if valueType.Kind() == reflect.Struct {
|
||||||
|
// If this is not referenced by a pointer then it is an error as it is impossible to
|
||||||
|
// modify a struct that is stored directly as a value in a map.
|
||||||
|
if fieldType.Elem().Kind() != reflect.Ptr {
|
||||||
|
panic(fmt.Errorf("Cannot prune struct %s stored by value in map %s, map values must"+
|
||||||
|
" be pointers to structs",
|
||||||
|
fieldType.Elem(), name))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new pruner for the values of the map.
|
||||||
|
valuePruner := newPropertyPrunerForStructType(valueType, selector)
|
||||||
|
|
||||||
|
// Create a new fieldPruner that will iterate over all the items in the map and call the
|
||||||
|
// pruner on them.
|
||||||
|
fieldPruner := func(container reflect.Value) {
|
||||||
|
mapValue := fieldGetter(container)
|
||||||
|
|
||||||
|
for _, keyValue := range mapValue.MapKeys() {
|
||||||
|
itemValue := mapValue.MapIndex(keyValue)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
panic(fmt.Errorf("%s\n\tfor key %q", r, keyValue))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
valuePruner.pruneProperties(itemValue.Interface())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the map field pruner to the list of property pruners.
|
||||||
|
property := prunerProperty{
|
||||||
|
name + "[*]",
|
||||||
|
fieldPruner,
|
||||||
|
}
|
||||||
|
p.properties = append(p.properties, property)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -304,6 +349,13 @@ type fieldSelectorFunc func(name string, field reflect.StructField) bool
|
|||||||
// of properties.
|
// of properties.
|
||||||
func newPropertyPruner(propertiesStruct interface{}, selector fieldSelectorFunc) *propertyPruner {
|
func newPropertyPruner(propertiesStruct interface{}, selector fieldSelectorFunc) *propertyPruner {
|
||||||
structType := getStructValue(reflect.ValueOf(propertiesStruct)).Type()
|
structType := getStructValue(reflect.ValueOf(propertiesStruct)).Type()
|
||||||
|
return newPropertyPrunerForStructType(structType, selector)
|
||||||
|
}
|
||||||
|
|
||||||
|
// newPropertyPruner creates a new property pruner for the supplied properties struct type.
|
||||||
|
//
|
||||||
|
// The returned pruner can be used on any properties structure of the supplied type.
|
||||||
|
func newPropertyPrunerForStructType(structType reflect.Type, selector fieldSelectorFunc) *propertyPruner {
|
||||||
pruner := &propertyPruner{}
|
pruner := &propertyPruner{}
|
||||||
pruner.gatherFields(structType, nil, "", selector)
|
pruner.gatherFields(structType, nil, "", selector)
|
||||||
return pruner
|
return pruner
|
||||||
|
@@ -126,11 +126,17 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) {
|
|||||||
F1_only string `supported_build_releases:"F1"`
|
F1_only string `supported_build_releases:"F1"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type mapped struct {
|
||||||
|
Default string
|
||||||
|
T_only string `supported_build_releases:"T"`
|
||||||
|
}
|
||||||
|
|
||||||
type testBuildReleasePruner struct {
|
type testBuildReleasePruner struct {
|
||||||
Default string
|
Default string
|
||||||
S_and_T_only string `supported_build_releases:"S-T"`
|
S_and_T_only string `supported_build_releases:"S-T"`
|
||||||
T_later string `supported_build_releases:"T+"`
|
T_later string `supported_build_releases:"T+"`
|
||||||
Nested nested
|
Nested nested
|
||||||
|
Mapped map[string]*mapped
|
||||||
}
|
}
|
||||||
|
|
||||||
inputFactory := func() testBuildReleasePruner {
|
inputFactory := func() testBuildReleasePruner {
|
||||||
@@ -141,6 +147,16 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) {
|
|||||||
Nested: nested{
|
Nested: nested{
|
||||||
F1_only: "F1_only",
|
F1_only: "F1_only",
|
||||||
},
|
},
|
||||||
|
Mapped: map[string]*mapped{
|
||||||
|
"one": {
|
||||||
|
Default: "one-default",
|
||||||
|
T_only: "one-t-only",
|
||||||
|
},
|
||||||
|
"two": {
|
||||||
|
Default: "two-default",
|
||||||
|
T_only: "two-t-only",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,6 +185,8 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) {
|
|||||||
expected := inputFactory()
|
expected := inputFactory()
|
||||||
expected.T_later = ""
|
expected.T_later = ""
|
||||||
expected.Nested.F1_only = ""
|
expected.Nested.F1_only = ""
|
||||||
|
expected.Mapped["one"].T_only = ""
|
||||||
|
expected.Mapped["two"].T_only = ""
|
||||||
assertJsonEquals(t, expected, testStruct)
|
assertJsonEquals(t, expected, testStruct)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -189,6 +207,8 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) {
|
|||||||
|
|
||||||
expected := inputFactory()
|
expected := inputFactory()
|
||||||
expected.S_and_T_only = ""
|
expected.S_and_T_only = ""
|
||||||
|
expected.Mapped["one"].T_only = ""
|
||||||
|
expected.Mapped["two"].T_only = ""
|
||||||
assertJsonEquals(t, expected, testStruct)
|
assertJsonEquals(t, expected, testStruct)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -200,6 +220,8 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) {
|
|||||||
expected := inputFactory()
|
expected := inputFactory()
|
||||||
expected.S_and_T_only = ""
|
expected.S_and_T_only = ""
|
||||||
expected.Nested.F1_only = ""
|
expected.Nested.F1_only = ""
|
||||||
|
expected.Mapped["one"].T_only = ""
|
||||||
|
expected.Mapped["two"].T_only = ""
|
||||||
assertJsonEquals(t, expected, testStruct)
|
assertJsonEquals(t, expected, testStruct)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@@ -1319,6 +1319,58 @@ java_sdk_library_import {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSnapshotWithJavaSdkLibrary_AnnotationsZip_PreT(t *testing.T) {
|
||||||
|
result := android.GroupFixturePreparers(
|
||||||
|
prepareForSdkTestWithJavaSdkLibrary,
|
||||||
|
android.FixtureMergeEnv(map[string]string{
|
||||||
|
"SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE": "S",
|
||||||
|
}),
|
||||||
|
).RunTestWithBp(t, `
|
||||||
|
sdk {
|
||||||
|
name: "mysdk",
|
||||||
|
java_sdk_libs: ["myjavalib"],
|
||||||
|
}
|
||||||
|
|
||||||
|
java_sdk_library {
|
||||||
|
name: "myjavalib",
|
||||||
|
srcs: ["Test.java"],
|
||||||
|
sdk_version: "current",
|
||||||
|
shared_library: false,
|
||||||
|
annotations_enabled: true,
|
||||||
|
public: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
|
||||||
|
CheckSnapshot(t, result, "mysdk", "",
|
||||||
|
checkUnversionedAndroidBpContents(`
|
||||||
|
// This is auto-generated. DO NOT EDIT.
|
||||||
|
|
||||||
|
java_sdk_library_import {
|
||||||
|
name: "myjavalib",
|
||||||
|
prefer: false,
|
||||||
|
visibility: ["//visibility:public"],
|
||||||
|
apex_available: ["//apex_available:platform"],
|
||||||
|
shared_library: false,
|
||||||
|
public: {
|
||||||
|
jars: ["sdk_library/public/myjavalib-stubs.jar"],
|
||||||
|
stub_srcs: ["sdk_library/public/myjavalib_stub_sources"],
|
||||||
|
current_api: "sdk_library/public/myjavalib.txt",
|
||||||
|
removed_api: "sdk_library/public/myjavalib-removed.txt",
|
||||||
|
sdk_version: "current",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`),
|
||||||
|
checkAllCopyRules(`
|
||||||
|
.intermediates/myjavalib.stubs/android_common/javac/myjavalib.stubs.jar -> sdk_library/public/myjavalib-stubs.jar
|
||||||
|
.intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_api.txt -> sdk_library/public/myjavalib.txt
|
||||||
|
.intermediates/myjavalib.stubs.source/android_common/metalava/myjavalib.stubs.source_removed.txt -> sdk_library/public/myjavalib-removed.txt
|
||||||
|
`),
|
||||||
|
checkMergeZips(".intermediates/mysdk/common_os/tmp/sdk_library/public/myjavalib_stub_sources.zip"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
func TestSnapshotWithJavaSdkLibrary_CompileDex(t *testing.T) {
|
func TestSnapshotWithJavaSdkLibrary_CompileDex(t *testing.T) {
|
||||||
result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, `
|
result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, `
|
||||||
sdk {
|
sdk {
|
||||||
|
Reference in New Issue
Block a user