diff options
author | Cole Faust <colefaust@google.com> | 2024-04-23 13:50:40 -0700 |
---|---|---|
committer | Cole Faust <colefaust@google.com> | 2024-04-23 13:55:59 -0700 |
commit | 185cb44befb94a3bbc76e87a853d281103b5be3b (patch) | |
tree | c9f66c29c7b06918f170ed4022d3963b0a8b687d | |
parent | d7474dd743a284d37756c2b5c5716cf2e0d81f07 (diff) | |
download | blueprint-185cb44befb94a3bbc76e87a853d281103b5be3b.tar.gz |
Export ConfigurableCase and add constructors
Some soong code sets arch-variant properties in order to control a
module's default behavior. I'll make this continue to work, but long
term the arch-variant properties should be replaced with selects,
so expose an API for creating select statements in soong code.
Bug: 323382414
Test: m nothing --no-skip-soong-tests
Change-Id: I6c65d6e112b6f826f1027777b6fdf36915d34b1d
-rw-r--r-- | proptools/configurable.go | 73 | ||||
-rw-r--r-- | proptools/extend_test.go | 32 | ||||
-rw-r--r-- | proptools/unpack.go | 8 | ||||
-rw-r--r-- | proptools/unpack_test.go | 34 |
4 files changed, 94 insertions, 53 deletions
diff --git a/proptools/configurable.go b/proptools/configurable.go index b136f59..f521ab4 100644 --- a/proptools/configurable.go +++ b/proptools/configurable.go @@ -14,6 +14,7 @@ package proptools import ( + "fmt" "reflect" "slices" "strconv" @@ -152,13 +153,33 @@ func (v *configurablePatternType) String() string { } } -type configurablePattern struct { +type ConfigurablePattern struct { typ configurablePatternType stringValue string boolValue bool } -func (p *configurablePattern) matchesValue(v ConfigurableValue) bool { +func NewStringConfigurablePattern(s string) ConfigurablePattern { + return ConfigurablePattern{ + typ: configurablePatternTypeString, + stringValue: s, + } +} + +func NewBoolConfigurablePattern(b bool) ConfigurablePattern { + return ConfigurablePattern{ + typ: configurablePatternTypeBool, + boolValue: b, + } +} + +func NewDefaultConfigurablePattern() ConfigurablePattern { + return ConfigurablePattern{ + typ: configurablePatternTypeDefault, + } +} + +func (p *ConfigurablePattern) matchesValue(v ConfigurableValue) bool { if p.typ == configurablePatternTypeDefault { return true } @@ -178,7 +199,7 @@ func (p *configurablePattern) matchesValue(v ConfigurableValue) bool { } } -func (p *configurablePattern) matchesValueType(v ConfigurableValue) bool { +func (p *ConfigurablePattern) matchesValueType(v ConfigurableValue) bool { if p.typ == configurablePatternTypeDefault { return true } @@ -188,25 +209,32 @@ func (p *configurablePattern) matchesValueType(v ConfigurableValue) bool { return p.typ == v.typ.patternType() } -type configurableCase[T ConfigurableElements] struct { - patterns []configurablePattern +type ConfigurableCase[T ConfigurableElements] struct { + patterns []ConfigurablePattern value *T } -func (c *configurableCase[T]) Clone() configurableCase[T] { - return configurableCase[T]{ +func (c *ConfigurableCase[T]) Clone() ConfigurableCase[T] { + return ConfigurableCase[T]{ patterns: slices.Clone(c.patterns), value: copyConfiguredValue(c.value), } } type configurableCaseReflection interface { - initialize(patterns []configurablePattern, value interface{}) + initialize(patterns []ConfigurablePattern, value interface{}) } -var _ configurableCaseReflection = &configurableCase[string]{} +var _ configurableCaseReflection = &ConfigurableCase[string]{} -func (c *configurableCase[T]) initialize(patterns []configurablePattern, value interface{}) { +func NewConfigurableCase[T ConfigurableElements](patterns []ConfigurablePattern, value *T) ConfigurableCase[T] { + return ConfigurableCase[T]{ + patterns: patterns, + value: value, + } +} + +func (c *ConfigurableCase[T]) initialize(patterns []ConfigurablePattern, value interface{}) { c.patterns = patterns c.value = value.(*T) } @@ -217,13 +245,13 @@ func configurableCaseType(configuredType reflect.Type) reflect.Type { // current reflection apis unfortunately switch configuredType.Kind() { case reflect.String: - return reflect.TypeOf(configurableCase[string]{}) + return reflect.TypeOf(ConfigurableCase[string]{}) case reflect.Bool: - return reflect.TypeOf(configurableCase[bool]{}) + return reflect.TypeOf(ConfigurableCase[bool]{}) case reflect.Slice: switch configuredType.Elem().Kind() { case reflect.String: - return reflect.TypeOf(configurableCase[[]string]{}) + return reflect.TypeOf(ConfigurableCase[[]string]{}) } } panic("unimplemented") @@ -259,13 +287,26 @@ type Configurable[T ConfigurableElements] struct { marker configurableMarker propertyName string conditions []ConfigurableCondition - cases []configurableCase[T] + cases []ConfigurableCase[T] appendWrapper *appendWrapper[T] } // Ignore the warning about the unused marker variable, it's used via reflection var _ configurableMarker = Configurable[string]{}.marker +func NewConfigurable[T ConfigurableElements](conditions []ConfigurableCondition, cases []ConfigurableCase[T]) Configurable[T] { + for _, c := range cases { + if len(c.patterns) != len(conditions) { + panic(fmt.Sprintf("All configurables cases must have as many patterns as the configurable has conditions. Expected: %d, found: %d", len(conditions), len(c.patterns))) + } + } + return Configurable[T]{ + conditions: conditions, + cases: cases, + appendWrapper: &appendWrapper[T]{}, + } +} + // appendWrapper exists so that we can set the value of append // from a non-pointer method receiver. (setAppend) type appendWrapper[T ConfigurableElements] struct { @@ -424,7 +465,7 @@ var _ configurablePtrReflection = &Configurable[string]{} func (c *Configurable[T]) initialize(propertyName string, conditions []ConfigurableCondition, cases any) { c.propertyName = propertyName c.conditions = conditions - c.cases = cases.([]configurableCase[T]) + c.cases = cases.([]ConfigurableCase[T]) c.appendWrapper = &appendWrapper[T]{} } @@ -468,7 +509,7 @@ func (c *Configurable[T]) clone() *Configurable[T] { conditionsCopy := make([]ConfigurableCondition, len(c.conditions)) copy(conditionsCopy, c.conditions) - casesCopy := make([]configurableCase[T], len(c.cases)) + casesCopy := make([]ConfigurableCase[T], len(c.cases)) for i, case_ := range c.cases { casesCopy[i] = case_.Clone() } diff --git a/proptools/extend_test.go b/proptools/extend_test.go index 9b07c78..b2920f5 100644 --- a/proptools/extend_test.go +++ b/proptools/extend_test.go @@ -1265,8 +1265,8 @@ func appendPropertiesTestCases() []appendPropertyTestCase { "foo", }, }}, - cases: []configurableCase[[]string]{{ - patterns: []configurablePattern{{ + cases: []ConfigurableCase[[]string]{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "a", }}, @@ -1283,8 +1283,8 @@ func appendPropertiesTestCases() []appendPropertyTestCase { "bar", }, }}, - cases: []configurableCase[[]string]{{ - patterns: []configurablePattern{{ + cases: []ConfigurableCase[[]string]{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "b", }}, @@ -1302,8 +1302,8 @@ func appendPropertiesTestCases() []appendPropertyTestCase { "foo", }, }}, - cases: []configurableCase[[]string]{{ - patterns: []configurablePattern{{ + cases: []ConfigurableCase[[]string]{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "a", }}, @@ -1317,8 +1317,8 @@ func appendPropertiesTestCases() []appendPropertyTestCase { "bar", }, }}, - cases: []configurableCase[[]string]{{ - patterns: []configurablePattern{{ + cases: []ConfigurableCase[[]string]{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "b", }}, @@ -1342,8 +1342,8 @@ func appendPropertiesTestCases() []appendPropertyTestCase { "foo", }, }}, - cases: []configurableCase[[]string]{{ - patterns: []configurablePattern{{ + cases: []ConfigurableCase[[]string]{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "a", }}, @@ -1360,8 +1360,8 @@ func appendPropertiesTestCases() []appendPropertyTestCase { "bar", }, }}, - cases: []configurableCase[[]string]{{ - patterns: []configurablePattern{{ + cases: []ConfigurableCase[[]string]{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "b", }}, @@ -1378,8 +1378,8 @@ func appendPropertiesTestCases() []appendPropertyTestCase { "bar", }, }}, - cases: []configurableCase[[]string]{{ - patterns: []configurablePattern{{ + cases: []ConfigurableCase[[]string]{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "b", }}, @@ -1394,8 +1394,8 @@ func appendPropertiesTestCases() []appendPropertyTestCase { "foo", }, }}, - cases: []configurableCase[[]string]{{ - patterns: []configurablePattern{{ + cases: []ConfigurableCase[[]string]{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "a", }}, diff --git a/proptools/unpack.go b/proptools/unpack.go index 5886cb1..0cddcdb 100644 --- a/proptools/unpack.go +++ b/proptools/unpack.go @@ -356,7 +356,7 @@ func (ctx *unpackContext) unpackToConfigurable(propertyName string, property *pa } result := Configurable[string]{ propertyName: property.Name, - cases: []configurableCase[string]{{ + cases: []ConfigurableCase[string]{{ value: &v.Value, }}, appendWrapper: &appendWrapper[string]{}, @@ -373,7 +373,7 @@ func (ctx *unpackContext) unpackToConfigurable(propertyName string, property *pa } result := Configurable[bool]{ propertyName: property.Name, - cases: []configurableCase[bool]{{ + cases: []ConfigurableCase[bool]{{ value: &v.Value, }}, appendWrapper: &appendWrapper[bool]{}, @@ -407,7 +407,7 @@ func (ctx *unpackContext) unpackToConfigurable(propertyName string, property *pa } result := Configurable[[]string]{ propertyName: property.Name, - cases: []configurableCase[[]string]{{ + cases: []ConfigurableCase[[]string]{{ value: &value, }}, appendWrapper: &appendWrapper[[]string]{}, @@ -446,7 +446,7 @@ func (ctx *unpackContext) unpackToConfigurable(propertyName string, property *pa Value: c.Value, } - patterns := make([]configurablePattern, len(c.Patterns)) + patterns := make([]ConfigurablePattern, len(c.Patterns)) for i, pat := range c.Patterns { switch pat := pat.(type) { case *parser.String: diff --git a/proptools/unpack_test.go b/proptools/unpack_test.go index fee7c9c..009c65b 100644 --- a/proptools/unpack_test.go +++ b/proptools/unpack_test.go @@ -734,7 +734,7 @@ var validUnpackTestCases = []struct { }{ Foo: Configurable[string]{ propertyName: "foo", - cases: []configurableCase[string]{{ + cases: []ConfigurableCase[string]{{ value: StringPtr("bar"), }}, appendWrapper: &appendWrapper[string]{}, @@ -755,7 +755,7 @@ var validUnpackTestCases = []struct { }{ Foo: Configurable[bool]{ propertyName: "foo", - cases: []configurableCase[bool]{{ + cases: []ConfigurableCase[bool]{{ value: BoolPtr(true), }}, appendWrapper: &appendWrapper[bool]{}, @@ -776,7 +776,7 @@ var validUnpackTestCases = []struct { }{ Foo: Configurable[[]string]{ propertyName: "foo", - cases: []configurableCase[[]string]{{ + cases: []ConfigurableCase[[]string]{{ value: &[]string{"a", "b"}, }}, appendWrapper: &appendWrapper[[]string]{}, @@ -808,23 +808,23 @@ var validUnpackTestCases = []struct { "my_variable", }, }}, - cases: []configurableCase[string]{ + cases: []ConfigurableCase[string]{ { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "a", }}, value: StringPtr("a2"), }, { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "b", }}, value: StringPtr("b2"), }, { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeDefault, }}, value: StringPtr("c2"), @@ -863,23 +863,23 @@ var validUnpackTestCases = []struct { "my_variable", }, }}, - cases: []configurableCase[string]{ + cases: []ConfigurableCase[string]{ { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "a", }}, value: StringPtr("a2"), }, { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "b", }}, value: StringPtr("b2"), }, { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeDefault, }}, value: StringPtr("c2"), @@ -895,23 +895,23 @@ var validUnpackTestCases = []struct { "my_2nd_variable", }, }}, - cases: []configurableCase[string]{ + cases: []ConfigurableCase[string]{ { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "d", }}, value: StringPtr("d2"), }, { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeString, stringValue: "e", }}, value: StringPtr("e2"), }, { - patterns: []configurablePattern{{ + patterns: []ConfigurablePattern{{ typ: configurablePatternTypeDefault, }}, value: StringPtr("f2"), @@ -941,7 +941,7 @@ var validUnpackTestCases = []struct { }{ Foo: Configurable[string]{ propertyName: "foo", - cases: []configurableCase[string]{ + cases: []ConfigurableCase[string]{ { value: StringPtr("asdf"), }, @@ -950,7 +950,7 @@ var validUnpackTestCases = []struct { }, Bar: Configurable[bool]{ propertyName: "bar", - cases: []configurableCase[bool]{ + cases: []ConfigurableCase[bool]{ { value: BoolPtr(true), }, |