aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCole Faust <colefaust@google.com>2024-04-23 13:50:40 -0700
committerCole Faust <colefaust@google.com>2024-04-23 13:55:59 -0700
commit185cb44befb94a3bbc76e87a853d281103b5be3b (patch)
treec9f66c29c7b06918f170ed4022d3963b0a8b687d
parentd7474dd743a284d37756c2b5c5716cf2e0d81f07 (diff)
downloadblueprint-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.go73
-rw-r--r--proptools/extend_test.go32
-rw-r--r--proptools/unpack.go8
-rw-r--r--proptools/unpack_test.go34
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),
},