Shape sharing for Skylark providers. Add CompactSkylarkInfo, which stores its values as an array instead of a map. The space savings will probably not be dramatic because providers usually have a limited amount of keys. But, there are a lot of them! Change-Id: Idd452a5e3982f773b1c5202c73f3d7031ec022c6 PiperOrigin-RevId: 176995376
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java index bbf3c5b..ccf7309 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -1265,6 +1265,39 @@ } @Test + public void declaredProvidersWithFieldsConcatSuccess() throws Exception { + evalAndExport( + "data = provider(fields=['f1', 'f2'])", + "d1 = data(f1 = 4)", + "d2 = data(f2 = 5)", + "d3 = d1 + d2", + "f1 = d3.f1", + "f2 = d3.f2"); + assertThat(lookup("f1")).isEqualTo(4); + assertThat(lookup("f2")).isEqualTo(5); + } + + @Test + public void declaredProvidersWithFieldsConcatError() throws Exception { + evalAndExport("data1 = provider(fields=['f1', 'f2'])", "data2 = provider(fields=['f3'])"); + checkEvalError( + "Cannot concat data1 with data2", + "d1 = data1(f1=1, f2=2)", + "d2 = data2(f3=3)", + "d = d1 + d2"); + } + + @Test + public void declaredProvidersWithOverlappingFieldsConcatError() throws Exception { + evalAndExport("data = provider(fields=['f1', 'f2'])"); + checkEvalError( + "Cannot concat structs with common field(s): f1", + "d1 = data(f1 = 4)", + "d2 = data(f1 = 5)", + "d1 + d2"); + } + + @Test public void structsAsDeclaredProvidersTest() throws Exception { evalAndExport( "data = struct(x = 1)"