Skip to content

Commit 49faa70

Browse files
l46kokcopybara-github
authored andcommitted
Dedupe enum types by enum descriptor's fully qualified name in ProtoMessageTypeProvider
PiperOrigin-RevId: 626114047
1 parent 141dda8 commit 49faa70

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

bundle/src/test/java/dev/cel/bundle/CelImplTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,15 @@
4141
import com.google.common.util.concurrent.MoreExecutors;
4242
import com.google.protobuf.Any;
4343
import com.google.protobuf.ByteString;
44+
import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
4445
import com.google.protobuf.DescriptorProtos.FileDescriptorSet;
46+
import com.google.protobuf.Descriptors.FileDescriptor;
4547
import com.google.protobuf.Duration;
4648
import com.google.protobuf.FieldMask;
4749
import com.google.protobuf.Message;
4850
import com.google.protobuf.NullValue;
4951
import com.google.protobuf.Struct;
52+
import com.google.protobuf.TextFormat;
5053
import com.google.protobuf.Timestamp;
5154
import com.google.protobuf.util.Timestamps;
5255
import com.google.rpc.context.AttributeContext;
@@ -1021,6 +1024,34 @@ public void compile_enumTypeTransitiveResolutionFailure() {
10211024
assertThat(e).hasMessageThat().contains("undeclared reference to 'NullValue'");
10221025
}
10231026

1027+
@Test
1028+
public void compile_multipleInstancesOfEnumDescriptor_dedupedByFullName() throws Exception {
1029+
String enumTextProto =
1030+
"name: \"standalone_global_enum.proto\"\n"
1031+
+ "package: \"dev.cel.testing.testdata.proto3\"\n"
1032+
+ "enum_type {\n"
1033+
+ " name: \"StandaloneGlobalEnum\"\n"
1034+
+ " value {\n"
1035+
+ " name: \"SGOO\"\n"
1036+
+ " number: 0\n"
1037+
+ " }\n"
1038+
+ "}\n"
1039+
+ "syntax: \"proto3\"\n";
1040+
FileDescriptorProto enumFileDescriptorProto =
1041+
TextFormat.parse(enumTextProto, FileDescriptorProto.class);
1042+
FileDescriptor enumFileDescriptor =
1043+
FileDescriptor.buildFrom(enumFileDescriptorProto, new FileDescriptor[] {});
1044+
Cel cel =
1045+
standardCelBuilderWithMacros()
1046+
.setContainer("dev.cel.testing.testdata")
1047+
.addFileTypes(enumFileDescriptor)
1048+
.addFileTypes(StandaloneGlobalEnum.getDescriptor().getFile())
1049+
.build();
1050+
1051+
assertThat(cel.compile("dev.cel.testing.testdata.proto3.StandaloneGlobalEnum.SGOO").getAst())
1052+
.isNotNull();
1053+
}
1054+
10241055
@Test
10251056
public void program_customVarResolver() throws Exception {
10261057
Cel cel =

common/src/main/java/dev/cel/common/types/ProtoMessageTypeProvider.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,16 +142,19 @@ private ImmutableMap<String, CelType> createProtoMessageTypes(
142142

143143
private ImmutableMap<String, CelType> createEnumTypes(
144144
Collection<EnumDescriptor> enumDescriptors) {
145-
ImmutableMap.Builder<String, CelType> enumTypes = ImmutableMap.builder();
145+
HashMap<String, CelType> enumTypes = new HashMap<>();
146146
for (EnumDescriptor enumDescriptor : enumDescriptors) {
147+
if (enumTypes.containsKey(enumDescriptor.getFullName())) {
148+
continue;
149+
}
147150
ImmutableMap<String, Integer> values =
148151
enumDescriptor.getValues().stream()
149152
.collect(
150153
toImmutableMap(EnumValueDescriptor::getName, EnumValueDescriptor::getNumber));
151154
enumTypes.put(
152155
enumDescriptor.getFullName(), EnumType.create(enumDescriptor.getFullName(), values));
153156
}
154-
return enumTypes.buildOrThrow();
157+
return ImmutableMap.copyOf(enumTypes);
155158
}
156159

157160
private static class FieldResolver {

0 commit comments

Comments
 (0)