Handle xsd config more like other partitions

This is prep work to add additional special handling for genrule
generated headers as there will be similar partitioning for those
headers.

Test: go test soong tests
Change-Id: Ib63e7e4f7554b2b7b7bc78b2825b20c05403216a
This commit is contained in:
Liz Kammer
2023-07-17 17:44:08 -04:00
parent 1c535124d5
commit 5f5dbaad65
5 changed files with 250 additions and 110 deletions

View File

@@ -288,6 +288,41 @@ func SubtractBazelLabelList(haystack LabelList, needle LabelList) LabelList {
return result
}
// FirstUniqueBazelLabelListAttribute takes a LabelListAttribute and makes the LabelList for
// each axis/configuration by keeping the first instance of a Label and omitting all subsequent
// repetitions.
func FirstUniqueBazelLabelListAttribute(attr LabelListAttribute) LabelListAttribute {
var result LabelListAttribute
result.Value = FirstUniqueBazelLabelList(attr.Value)
if attr.HasConfigurableValues() {
result.ConfigurableValues = make(configurableLabelLists)
}
for axis, configToLabels := range attr.ConfigurableValues {
for c, l := range configToLabels {
result.SetSelectValue(axis, c, FirstUniqueBazelLabelList(l))
}
}
return result
}
// SubtractBazelLabelListAttribute subtract needle from haystack for LabelList in each
// axis/configuration.
func SubtractBazelLabelListAttribute(haystack LabelListAttribute, needle LabelListAttribute) LabelListAttribute {
var result LabelListAttribute
result.Value = SubtractBazelLabelList(haystack.Value, needle.Value)
if haystack.HasConfigurableValues() {
result.ConfigurableValues = make(configurableLabelLists)
}
for axis, configToLabels := range haystack.ConfigurableValues {
for haystackConfig, haystackLabels := range configToLabels {
result.SetSelectValue(axis, haystackConfig, SubtractBazelLabelList(haystackLabels, needle.SelectValue(axis, haystackConfig)))
}
}
return result
}
type Attribute interface {
HasConfigurableValues() bool
}

View File

@@ -125,6 +125,63 @@ func TestSubtractBazelLabelList(t *testing.T) {
}
}
}
func TestSubtractBazelLabelListAttribute(t *testing.T) {
testCases := []struct {
haystack LabelListAttribute
needle LabelListAttribute
expected LabelListAttribute
}{
{
haystack: LabelListAttribute{
Value: makeLabelList(
[]string{"a", "b", "a", "c"},
[]string{"x", "x", "y", "z"},
),
ConfigurableValues: configurableLabelLists{
ArchConfigurationAxis: labelListSelectValues{
"arm": makeLabelList([]string{"arm_1", "arm_2"}, []string{}),
"x86": makeLabelList([]string{"x86_3", "x86_4", "x86_5"}, []string{"x86_5"}),
},
},
},
needle: LabelListAttribute{
Value: makeLabelList(
[]string{"d", "a"},
[]string{"x", "y2", "z2"},
),
ConfigurableValues: configurableLabelLists{
ArchConfigurationAxis: labelListSelectValues{
"arm": makeLabelList([]string{"arm_1", "arm_3"}, []string{}),
"x86": makeLabelList([]string{"x86_3", "x86_4"}, []string{"x86_6"}),
},
},
},
expected: LabelListAttribute{
Value: makeLabelList(
[]string{"b", "c"},
[]string{"x", "x", "y", "z"},
),
ConfigurableValues: configurableLabelLists{
ArchConfigurationAxis: labelListSelectValues{
"arm": makeLabelList([]string{"arm_2"}, []string{}),
"x86": makeLabelList([]string{"x86_5"}, []string{"x86_5"}),
},
},
ForceSpecifyEmptyList: false,
EmitEmptyList: false,
Prepend: false,
},
},
}
for _, tc := range testCases {
got := SubtractBazelLabelListAttribute(tc.haystack, tc.needle)
if !reflect.DeepEqual(tc.expected, got) {
t.Fatalf("Expected\n%v, but got\n%v", tc.expected, got)
}
}
}
func TestFirstUniqueBazelLabelList(t *testing.T) {
testCases := []struct {
originalLabelList LabelList
@@ -167,6 +224,46 @@ func TestFirstUniqueBazelLabelList(t *testing.T) {
}
}
func TestFirstUniqueBazelLabelListAttribute(t *testing.T) {
testCases := []struct {
originalLabelList LabelListAttribute
expectedUniqueLabelList LabelListAttribute
}{
{
originalLabelList: LabelListAttribute{
Value: makeLabelList(
[]string{"a", "b", "a", "c"},
[]string{"x", "x", "y", "z"},
),
ConfigurableValues: configurableLabelLists{
ArchConfigurationAxis: labelListSelectValues{
"arm": makeLabelList([]string{"1", "2", "1"}, []string{}),
"x86": makeLabelList([]string{"3", "4", "4"}, []string{"5", "5"}),
},
},
},
expectedUniqueLabelList: LabelListAttribute{
Value: makeLabelList(
[]string{"a", "b", "c"},
[]string{"x", "y", "z"},
),
ConfigurableValues: configurableLabelLists{
ArchConfigurationAxis: labelListSelectValues{
"arm": makeLabelList([]string{"1", "2"}, []string{}),
"x86": makeLabelList([]string{"3", "4"}, []string{"5"}),
},
},
},
},
}
for _, tc := range testCases {
actualUniqueLabelList := FirstUniqueBazelLabelListAttribute(tc.originalLabelList)
if !reflect.DeepEqual(tc.expectedUniqueLabelList, actualUniqueLabelList) {
t.Fatalf("Expected %v, got %v", tc.expectedUniqueLabelList, actualUniqueLabelList)
}
}
}
func TestUniqueSortedBazelLabelList(t *testing.T) {
testCases := []struct {
originalLabelList LabelList