diff options
-rw-r--r-- | android/testing.go | 15 | ||||
-rw-r--r-- | java/sdk_library.go | 8 | ||||
-rw-r--r-- | mk2rbc/mk2rbc.go | 17 | ||||
-rw-r--r-- | mk2rbc/mk2rbc_test.go | 8 | ||||
-rw-r--r-- | sdk/build_release.go | 52 | ||||
-rw-r--r-- | sdk/build_release_test.go | 22 | ||||
-rw-r--r-- | sdk/java_sdk_test.go | 52 |
7 files changed, 150 insertions, 24 deletions
diff --git a/android/testing.go b/android/testing.go index 8daf6b783..39864e103 100644 --- a/android/testing.go +++ b/android/testing.go @@ -781,19 +781,21 @@ func (b baseTestingComponent) buildParamsFromRule(rule string) TestingBuildParam return p } -func (b baseTestingComponent) maybeBuildParamsFromDescription(desc string) TestingBuildParams { +func (b baseTestingComponent) maybeBuildParamsFromDescription(desc string) (TestingBuildParams, []string) { + var searchedDescriptions []string for _, p := range b.provider.BuildParamsForTests() { + searchedDescriptions = append(searchedDescriptions, p.Description) if strings.Contains(p.Description, desc) { - return b.newTestingBuildParams(p) + return b.newTestingBuildParams(p), searchedDescriptions } } - return TestingBuildParams{} + return TestingBuildParams{}, searchedDescriptions } func (b baseTestingComponent) buildParamsFromDescription(desc string) TestingBuildParams { - p := b.maybeBuildParamsFromDescription(desc) + p, searchedDescriptions := b.maybeBuildParamsFromDescription(desc) if p.Rule == nil { - panic(fmt.Errorf("couldn't find description %q", desc)) + panic(fmt.Errorf("couldn't find description %q\nall descriptions:\n%s", desc, strings.Join(searchedDescriptions, "\n"))) } return p } @@ -860,7 +862,8 @@ func (b baseTestingComponent) Rule(rule string) TestingBuildParams { // MaybeDescription finds a call to ctx.Build with BuildParams.Description set to a the given string. Returns an empty // BuildParams if no rule is found. func (b baseTestingComponent) MaybeDescription(desc string) TestingBuildParams { - return b.maybeBuildParamsFromDescription(desc) + p, _ := b.maybeBuildParamsFromDescription(desc) + return p } // Description finds a call to ctx.Build with BuildParams.Description set to a the given string. Panics if no rule is diff --git a/java/sdk_library.go b/java/sdk_library.go index 57ab2686f..6a2a7a845 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -2755,7 +2755,7 @@ type sdkLibrarySdkMemberProperties struct { android.SdkMemberPropertiesBase // Scope to per scope properties. - Scopes map[*apiScope]scopeProperties + Scopes map[*apiScope]*scopeProperties // The Java stubs source files. Stub_srcs []string @@ -2808,14 +2808,14 @@ type scopeProperties struct { StubsSrcJar android.Path CurrentApiFile android.Path RemovedApiFile android.Path - AnnotationsZip android.Path + AnnotationsZip android.Path `supported_build_releases:"T+"` SdkVersion string } func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) { sdk := variant.(*SdkLibrary) - s.Scopes = make(map[*apiScope]scopeProperties) + s.Scopes = make(map[*apiScope]*scopeProperties) for _, apiScope := range allApiScopes { paths := sdk.findScopePaths(apiScope) if paths == nil { @@ -2838,7 +2838,7 @@ func (s *sdkLibrarySdkMemberProperties) PopulateFromVariant(ctx android.SdkMembe if paths.annotationsZip.Valid() { properties.AnnotationsZip = paths.annotationsZip.Path() } - s.Scopes[apiScope] = properties + s.Scopes[apiScope] = &properties } } diff --git a/mk2rbc/mk2rbc.go b/mk2rbc/mk2rbc.go index 90dc46b3a..927427a43 100644 --- a/mk2rbc/mk2rbc.go +++ b/mk2rbc/mk2rbc.go @@ -1733,8 +1733,9 @@ func (ctx *parseContext) parseMakeString(node mkparser.Node, mk *mkparser.MakeSt func (ctx *parseContext) handleSimpleStatement(node mkparser.Node) { switch x := node.(type) { case *mkparser.Comment: - ctx.maybeHandleAnnotation(x) - ctx.insertComment("#" + x.Comment) + if !ctx.maybeHandleAnnotation(x) { + ctx.insertComment("#" + x.Comment) + } case *mkparser.Assignment: ctx.handleAssignment(x) case *mkparser.Variable: @@ -1764,8 +1765,8 @@ func (ctx *parseContext) handleSimpleStatement(node mkparser.Node) { // Processes annotation. An annotation is a comment that starts with #RBC# and provides // a conversion hint -- say, where to look for the dynamically calculated inherit/include -// paths. -func (ctx *parseContext) maybeHandleAnnotation(cnode *mkparser.Comment) { +// paths. Returns true if the comment was a successfully-handled annotation. +func (ctx *parseContext) maybeHandleAnnotation(cnode *mkparser.Comment) bool { maybeTrim := func(s, prefix string) (string, bool) { if strings.HasPrefix(s, prefix) { return strings.TrimSpace(strings.TrimPrefix(s, prefix)), true @@ -1774,21 +1775,21 @@ func (ctx *parseContext) maybeHandleAnnotation(cnode *mkparser.Comment) { } annotation, ok := maybeTrim(cnode.Comment, annotationCommentPrefix) if !ok { - return + return false } if p, ok := maybeTrim(annotation, "include_top"); ok { // Don't allow duplicate include tops, because then we will generate // invalid starlark code. (duplicate keys in the _entry dictionary) for _, top := range ctx.includeTops { if top == p { - return + return true } } ctx.includeTops = append(ctx.includeTops, p) - return + return true } ctx.errorf(cnode, "unsupported annotation %s", cnode.Comment) - + return true } func (ctx *parseContext) insertComment(s string) { diff --git a/mk2rbc/mk2rbc_test.go b/mk2rbc/mk2rbc_test.go index 376ee5e31..1b0753662 100644 --- a/mk2rbc/mk2rbc_test.go +++ b/mk2rbc/mk2rbc_test.go @@ -1071,7 +1071,6 @@ load("//vendor/foo1:cfg.star|init", _cfg_init = "init") def init(g, handle): cfg = rblf.cfg(handle) g["MY_PATH"] = "foo" - #RBC# include_top vendor/foo1 rblf.inherit(handle, "vendor/foo1/cfg", _cfg_init) `, }, @@ -1083,6 +1082,7 @@ MY_PATH:=foo #RBC# include_top vendor/foo1 $(call inherit-product,$(MY_PATH)/cfg.mk) #RBC# include_top vendor/foo1 +#RBC# include_top vendor/foo1 $(call inherit-product,$(MY_PATH)/cfg.mk) `, expected: `load("//build/make/core:product_config.rbc", "rblf") @@ -1091,9 +1091,7 @@ load("//vendor/foo1:cfg.star|init", _cfg_init = "init") def init(g, handle): cfg = rblf.cfg(handle) g["MY_PATH"] = "foo" - #RBC# include_top vendor/foo1 rblf.inherit(handle, "vendor/foo1/cfg", _cfg_init) - #RBC# include_top vendor/foo1 rblf.inherit(handle, "vendor/foo1/cfg", _cfg_init) `, }, @@ -1112,15 +1110,13 @@ $(call inherit-product,$(MY_VAR)/font.mk) $(call inherit-product,$(MY_VAR)/font.mk) `, - expected: `#RBC# include_top foo -load("//build/make/core:product_config.rbc", "rblf") + expected: `load("//build/make/core:product_config.rbc", "rblf") load("//foo:font.star|init", _font_init = "init") load("//bar:font.star|init", _font1_init = "init") def init(g, handle): cfg = rblf.cfg(handle) rblf.inherit(handle, "foo/font", _font_init) - #RBC# include_top foo # There's some space and even this comment between the include_top and the inherit-product rblf.inherit(handle, "foo/font", _font_init) rblf.mkwarning("product.mk:11", "Including a path with a non-constant prefix, please convert this to a simple literal to generate cleaner starlark.") diff --git a/sdk/build_release.go b/sdk/build_release.go index 212582ac6..2bcdc6f57 100644 --- a/sdk/build_release.go +++ b/sdk/build_release.go @@ -269,6 +269,51 @@ func (p *propertyPruner) gatherFields(structType reflect.Type, containingStructA subNamePrefix = name + "." } 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. func newPropertyPruner(propertiesStruct interface{}, selector fieldSelectorFunc) *propertyPruner { 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.gatherFields(structType, nil, "", selector) return pruner diff --git a/sdk/build_release_test.go b/sdk/build_release_test.go index 0ec10409f..6608be4f8 100644 --- a/sdk/build_release_test.go +++ b/sdk/build_release_test.go @@ -126,11 +126,17 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) { F1_only string `supported_build_releases:"F1"` } + type mapped struct { + Default string + T_only string `supported_build_releases:"T"` + } + type testBuildReleasePruner struct { Default string S_and_T_only string `supported_build_releases:"S-T"` T_later string `supported_build_releases:"T+"` Nested nested + Mapped map[string]*mapped } inputFactory := func() testBuildReleasePruner { @@ -141,6 +147,16 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) { Nested: nested{ 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.T_later = "" expected.Nested.F1_only = "" + expected.Mapped["one"].T_only = "" + expected.Mapped["two"].T_only = "" assertJsonEquals(t, expected, testStruct) }) @@ -189,6 +207,8 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) { expected := inputFactory() expected.S_and_T_only = "" + expected.Mapped["one"].T_only = "" + expected.Mapped["two"].T_only = "" assertJsonEquals(t, expected, testStruct) }) @@ -200,6 +220,8 @@ func TestPropertyPrunerByBuildRelease(t *testing.T) { expected := inputFactory() expected.S_and_T_only = "" expected.Nested.F1_only = "" + expected.Mapped["one"].T_only = "" + expected.Mapped["two"].T_only = "" assertJsonEquals(t, expected, testStruct) }) } diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index 0d9b4a063..f0d3b35d7 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -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) { result := android.GroupFixturePreparers(prepareForSdkTestWithJavaSdkLibrary).RunTestWithBp(t, ` sdk { |