From 95faaa88a1db8912e73af14a13a61bcbe795538a Mon Sep 17 00:00:00 2001 From: Andrew Parmet Date: Sat, 9 May 2026 09:53:24 -0400 Subject: [PATCH 1/5] Preserve FieldMask as a message in the CelValue runtime path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BaseProtoCelValueConverter.fromWellKnownProto converts FieldMask to a comma-separated string of its paths. That's correct in JSON-assignment contexts (handled separately by CelProtoJsonAdapter), but it breaks CEL expressions that access fields on the FieldMask itself — e.g. `fieldMask.paths` — because the string has no field `paths`. The CEL spec's WKT conversion table does not list FieldMask. cel-go treats it as a regular message, as does cel-java's legacy ProtoLiteAdapter.adaptValueToWellKnownProto for non-JSON contexts. Override fromWellKnownProto in ProtoCelValueConverter to preserve FieldMask as a ProtoMessageValue. JSON-assignment paths (e.g. TestAllTypes{single_value: FieldMask{...}}) are unaffected because EvalCreateStruct and CelValueRuntimeTypeProvider.createMessage both unwrap StructValue results before the outer assignment runs, and the outer assignment goes through CelProtoJsonAdapter.adaptValueToJsonValue which handles FieldMask → string conversion at that layer. --- .../common/values/ProtoCelValueConverter.java | 3 +++ .../common/values/ProtoMessageValueTest.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java b/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java index 948df759c..89d1b708f 100644 --- a/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java @@ -71,6 +71,9 @@ protected Object fromWellKnownProto(MessageLiteOrBuilder msg, WellKnownProto wel "Unpacking failed for message: " + message.getDescriptorForType().getFullName(), e); } return toRuntimeValue(unpackedMessage); + case FIELD_MASK: + return ProtoMessageValue.create( + (Message) message, celDescriptorPool, this, celOptions.enableJsonFieldNames()); default: return super.fromWellKnownProto(message, wellKnownProto); } diff --git a/common/src/test/java/dev/cel/common/values/ProtoMessageValueTest.java b/common/src/test/java/dev/cel/common/values/ProtoMessageValueTest.java index 365dd32b4..c25a8ea06 100644 --- a/common/src/test/java/dev/cel/common/values/ProtoMessageValueTest.java +++ b/common/src/test/java/dev/cel/common/values/ProtoMessageValueTest.java @@ -303,6 +303,24 @@ public void selectField_durationOutOfRange_success(int seconds, int nanos) { .isEqualTo(Duration.ofSeconds(seconds, nanos)); } + @Test + public void selectField_fieldMask_returnsProtoMessageValue() { + TestAllTypes testAllTypes = + TestAllTypes.newBuilder() + .setFieldMask( + com.google.protobuf.FieldMask.newBuilder().addPaths("foo").addPaths("bar")) + .build(); + + ProtoMessageValue protoMessageValue = + ProtoMessageValue.create( + testAllTypes, DefaultDescriptorPool.INSTANCE, PROTO_CEL_VALUE_CONVERTER, false); + + Object selected = protoMessageValue.select("field_mask"); + assertThat(selected).isInstanceOf(ProtoMessageValue.class); + assertThat(((ProtoMessageValue) selected).select("paths")) + .isEqualTo(ImmutableList.of("foo", "bar")); + } + @SuppressWarnings("ImmutableEnumChecker") // Test only private enum SelectFieldJsonValueTestCase { NULL(Value.newBuilder().build(), NullValue.NULL_VALUE), From 984193b7ee46cd7648988248d37c3da111caef4b Mon Sep 17 00:00:00 2001 From: Andrew Parmet Date: Tue, 2 Jun 2026 16:13:23 -0400 Subject: [PATCH 2/5] Wrap FieldMask via shared message-to-struct hook on the base converter Move the FieldMask case into BaseProtoCelValueConverter, delegating to a new fromProtoMessageToStructValue hook that both the full and lite converters implement. This reuses the existing non-well-known message wrapping path (removing the duplicated ProtoMessageValue.create call) and extends the fix to the lite runtime. Adds a lite-converter test. --- .../values/BaseProtoCelValueConverter.java | 20 +++++++------------ .../common/values/ProtoCelValueConverter.java | 12 ++++++----- .../values/ProtoLiteCelValueConverter.java | 12 +++++++++++ .../ProtoLiteCelValueConverterTest.java | 12 +++++++++++ 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java b/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java index 6851deed5..b39fa6831 100644 --- a/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java @@ -17,8 +17,6 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.ImmutableMap.toImmutableMap; -import com.google.common.base.CaseFormat; -import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -29,7 +27,6 @@ import com.google.protobuf.BytesValue; import com.google.protobuf.DoubleValue; import com.google.protobuf.Duration; -import com.google.protobuf.FieldMask; import com.google.protobuf.FloatValue; import com.google.protobuf.Int32Value; import com.google.protobuf.Int64Value; @@ -44,8 +41,6 @@ import dev.cel.common.annotations.Internal; import dev.cel.common.internal.ProtoTimeUtils; import dev.cel.common.internal.WellKnownProto; -import java.util.ArrayList; -import java.util.List; /** * {@code BaseProtoCelValueConverter} contains the common logic for converting between native Java @@ -73,6 +68,12 @@ public Object toRuntimeValue(Object value) { return super.toRuntimeValue(value); } + /** Wraps a protobuf message as a navigable struct value. */ + protected StructValue fromProtoMessageToStructValue(MessageLiteOrBuilder message) { + throw new UnsupportedOperationException( + "This converter does not support wrapping protobuf messages as struct values."); + } + protected Object fromWellKnownProto(MessageLiteOrBuilder message, WellKnownProto wellKnownProto) { switch (wellKnownProto) { case JSON_VALUE: @@ -104,14 +105,7 @@ protected Object fromWellKnownProto(MessageLiteOrBuilder message, WellKnownProto case UINT64_VALUE: return UnsignedLong.fromLongBits(((UInt64Value) message).getValue()); case FIELD_MASK: - FieldMask fieldMask = (FieldMask) message; - List paths = new ArrayList<>(fieldMask.getPathsCount()); - for (String path : fieldMask.getPathsList()) { - if (!path.isEmpty()) { - paths.add(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, path)); - } - } - return normalizePrimitive(Joiner.on(",").join(paths)); + return fromProtoMessageToStructValue(message); case EMPTY: return ImmutableMap.of(); default: diff --git a/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java b/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java index 89d1b708f..20f4ee0d1 100644 --- a/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java @@ -71,14 +71,17 @@ protected Object fromWellKnownProto(MessageLiteOrBuilder msg, WellKnownProto wel "Unpacking failed for message: " + message.getDescriptorForType().getFullName(), e); } return toRuntimeValue(unpackedMessage); - case FIELD_MASK: - return ProtoMessageValue.create( - (Message) message, celDescriptorPool, this, celOptions.enableJsonFieldNames()); default: return super.fromWellKnownProto(message, wellKnownProto); } } + @Override + protected ProtoMessageValue fromProtoMessageToStructValue(MessageLiteOrBuilder message) { + return ProtoMessageValue.create( + (Message) message, celDescriptorPool, this, celOptions.enableJsonFieldNames()); + } + @Override public Object toRuntimeValue(Object value) { if (value instanceof EnumValueDescriptor) { @@ -102,8 +105,7 @@ public Object toRuntimeValue(Object value) { WellKnownProto wellKnownProto = WellKnownProto.getByTypeName(message.getDescriptorForType().getFullName()).orElse(null); if (wellKnownProto == null) { - return ProtoMessageValue.create( - message, celDescriptorPool, this, celOptions.enableJsonFieldNames()); + return fromProtoMessageToStructValue(message); } return fromWellKnownProto(message, wellKnownProto); diff --git a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java index 3fbb0ad75..3c226f7bb 100644 --- a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java @@ -28,6 +28,7 @@ import com.google.protobuf.CodedInputStream; import com.google.protobuf.ExtensionRegistryLite; import com.google.protobuf.MessageLite; +import com.google.protobuf.MessageLiteOrBuilder; import com.google.protobuf.WireFormat; import dev.cel.common.annotations.Internal; import dev.cel.common.internal.CelLiteDescriptorPool; @@ -184,6 +185,17 @@ public Object toRuntimeValue(Object value) { return super.toRuntimeValue(value); } + @Override + protected ProtoMessageLiteValue fromProtoMessageToStructValue(MessageLiteOrBuilder message) { + MessageLite msg = (MessageLite) message; + MessageLiteDescriptor descriptor = + descriptorPool + .findDescriptor(msg) + .orElseThrow( + () -> new NoSuchElementException("Could not find a descriptor for: " + msg)); + return ProtoMessageLiteValue.create(msg, descriptor.getProtoTypeName(), this); + } + private Object getDefaultValue(FieldLiteDescriptor fieldDescriptor) { EncodingType encodingType = fieldDescriptor.getEncodingType(); switch (encodingType) { diff --git a/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java b/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java index cec3e0fbf..3b66171e4 100644 --- a/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java +++ b/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java @@ -27,6 +27,7 @@ import com.google.protobuf.DoubleValue; import com.google.protobuf.Duration; import com.google.protobuf.ExtensionRegistryLite; +import com.google.protobuf.FieldMask; import com.google.protobuf.FloatValue; import com.google.protobuf.Int32Value; import com.google.protobuf.Int64Value; @@ -104,6 +105,17 @@ public void fromProtoMessageToCelValue_withWellKnownProto_convertsToPrimitivesFr assertThat(adaptedValue).isEqualTo(testCase.value); } + @Test + public void fromProtoMessageToCelValue_fieldMask_returnsProtoMessageLiteValue() { + FieldMask fieldMask = FieldMask.newBuilder().addPaths("foo").addPaths("bar").build(); + + Object adaptedValue = PROTO_LITE_CEL_VALUE_CONVERTER.toRuntimeValue(fieldMask); + + assertThat(adaptedValue).isInstanceOf(ProtoMessageLiteValue.class); + assertThat(((ProtoMessageLiteValue) adaptedValue).select("paths")) + .isEqualTo(ImmutableList.of("foo", "bar")); + } + /** Test cases for repeated_int64: 1L,2L,3L */ @SuppressWarnings("ImmutableEnumChecker") // Test only private enum RepeatedFieldBytesTestCase { From b9e76392320dff2157df97824829fa83bbd2eecc Mon Sep 17 00:00:00 2001 From: Andrew Parmet Date: Tue, 2 Jun 2026 19:58:49 -0400 Subject: [PATCH 3/5] Revert "Wrap FieldMask via shared message-to-struct hook on the base converter" This reverts commit 984193b7ee46cd7648988248d37c3da111caef4b. --- .../values/BaseProtoCelValueConverter.java | 20 ++++++++++++------- .../common/values/ProtoCelValueConverter.java | 12 +++++------ .../values/ProtoLiteCelValueConverter.java | 12 ----------- .../ProtoLiteCelValueConverterTest.java | 12 ----------- 4 files changed, 18 insertions(+), 38 deletions(-) diff --git a/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java b/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java index b39fa6831..6851deed5 100644 --- a/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java @@ -17,6 +17,8 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.ImmutableMap.toImmutableMap; +import com.google.common.base.CaseFormat; +import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -27,6 +29,7 @@ import com.google.protobuf.BytesValue; import com.google.protobuf.DoubleValue; import com.google.protobuf.Duration; +import com.google.protobuf.FieldMask; import com.google.protobuf.FloatValue; import com.google.protobuf.Int32Value; import com.google.protobuf.Int64Value; @@ -41,6 +44,8 @@ import dev.cel.common.annotations.Internal; import dev.cel.common.internal.ProtoTimeUtils; import dev.cel.common.internal.WellKnownProto; +import java.util.ArrayList; +import java.util.List; /** * {@code BaseProtoCelValueConverter} contains the common logic for converting between native Java @@ -68,12 +73,6 @@ public Object toRuntimeValue(Object value) { return super.toRuntimeValue(value); } - /** Wraps a protobuf message as a navigable struct value. */ - protected StructValue fromProtoMessageToStructValue(MessageLiteOrBuilder message) { - throw new UnsupportedOperationException( - "This converter does not support wrapping protobuf messages as struct values."); - } - protected Object fromWellKnownProto(MessageLiteOrBuilder message, WellKnownProto wellKnownProto) { switch (wellKnownProto) { case JSON_VALUE: @@ -105,7 +104,14 @@ protected Object fromWellKnownProto(MessageLiteOrBuilder message, WellKnownProto case UINT64_VALUE: return UnsignedLong.fromLongBits(((UInt64Value) message).getValue()); case FIELD_MASK: - return fromProtoMessageToStructValue(message); + FieldMask fieldMask = (FieldMask) message; + List paths = new ArrayList<>(fieldMask.getPathsCount()); + for (String path : fieldMask.getPathsList()) { + if (!path.isEmpty()) { + paths.add(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, path)); + } + } + return normalizePrimitive(Joiner.on(",").join(paths)); case EMPTY: return ImmutableMap.of(); default: diff --git a/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java b/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java index 20f4ee0d1..89d1b708f 100644 --- a/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/ProtoCelValueConverter.java @@ -71,17 +71,14 @@ protected Object fromWellKnownProto(MessageLiteOrBuilder msg, WellKnownProto wel "Unpacking failed for message: " + message.getDescriptorForType().getFullName(), e); } return toRuntimeValue(unpackedMessage); + case FIELD_MASK: + return ProtoMessageValue.create( + (Message) message, celDescriptorPool, this, celOptions.enableJsonFieldNames()); default: return super.fromWellKnownProto(message, wellKnownProto); } } - @Override - protected ProtoMessageValue fromProtoMessageToStructValue(MessageLiteOrBuilder message) { - return ProtoMessageValue.create( - (Message) message, celDescriptorPool, this, celOptions.enableJsonFieldNames()); - } - @Override public Object toRuntimeValue(Object value) { if (value instanceof EnumValueDescriptor) { @@ -105,7 +102,8 @@ public Object toRuntimeValue(Object value) { WellKnownProto wellKnownProto = WellKnownProto.getByTypeName(message.getDescriptorForType().getFullName()).orElse(null); if (wellKnownProto == null) { - return fromProtoMessageToStructValue(message); + return ProtoMessageValue.create( + message, celDescriptorPool, this, celOptions.enableJsonFieldNames()); } return fromWellKnownProto(message, wellKnownProto); diff --git a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java index 3c226f7bb..3fbb0ad75 100644 --- a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java @@ -28,7 +28,6 @@ import com.google.protobuf.CodedInputStream; import com.google.protobuf.ExtensionRegistryLite; import com.google.protobuf.MessageLite; -import com.google.protobuf.MessageLiteOrBuilder; import com.google.protobuf.WireFormat; import dev.cel.common.annotations.Internal; import dev.cel.common.internal.CelLiteDescriptorPool; @@ -185,17 +184,6 @@ public Object toRuntimeValue(Object value) { return super.toRuntimeValue(value); } - @Override - protected ProtoMessageLiteValue fromProtoMessageToStructValue(MessageLiteOrBuilder message) { - MessageLite msg = (MessageLite) message; - MessageLiteDescriptor descriptor = - descriptorPool - .findDescriptor(msg) - .orElseThrow( - () -> new NoSuchElementException("Could not find a descriptor for: " + msg)); - return ProtoMessageLiteValue.create(msg, descriptor.getProtoTypeName(), this); - } - private Object getDefaultValue(FieldLiteDescriptor fieldDescriptor) { EncodingType encodingType = fieldDescriptor.getEncodingType(); switch (encodingType) { diff --git a/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java b/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java index 3b66171e4..cec3e0fbf 100644 --- a/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java +++ b/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java @@ -27,7 +27,6 @@ import com.google.protobuf.DoubleValue; import com.google.protobuf.Duration; import com.google.protobuf.ExtensionRegistryLite; -import com.google.protobuf.FieldMask; import com.google.protobuf.FloatValue; import com.google.protobuf.Int32Value; import com.google.protobuf.Int64Value; @@ -105,17 +104,6 @@ public void fromProtoMessageToCelValue_withWellKnownProto_convertsToPrimitivesFr assertThat(adaptedValue).isEqualTo(testCase.value); } - @Test - public void fromProtoMessageToCelValue_fieldMask_returnsProtoMessageLiteValue() { - FieldMask fieldMask = FieldMask.newBuilder().addPaths("foo").addPaths("bar").build(); - - Object adaptedValue = PROTO_LITE_CEL_VALUE_CONVERTER.toRuntimeValue(fieldMask); - - assertThat(adaptedValue).isInstanceOf(ProtoMessageLiteValue.class); - assertThat(((ProtoMessageLiteValue) adaptedValue).select("paths")) - .isEqualTo(ImmutableList.of("foo", "bar")); - } - /** Test cases for repeated_int64: 1L,2L,3L */ @SuppressWarnings("ImmutableEnumChecker") // Test only private enum RepeatedFieldBytesTestCase { From abbd7cf0ef4b6c4f3fe6f27d0cac41842216fb62 Mon Sep 17 00:00:00 2001 From: Andrew Parmet Date: Tue, 2 Jun 2026 20:00:11 -0400 Subject: [PATCH 4/5] Override fromWellKnownProto in ProtoLiteCelValueConverter for FieldMask Mirror the full converter: intercept FIELD_MASK in the lite converter and wrap it as a ProtoMessageLiteValue so it is navigable as a message on the lite runtime. Adds a lite-converter test. --- .../values/ProtoLiteCelValueConverter.java | 18 +++++++++++++++++- .../values/ProtoLiteCelValueConverterTest.java | 12 ++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java index 3fbb0ad75..64d6ec1d4 100644 --- a/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/ProtoLiteCelValueConverter.java @@ -28,6 +28,7 @@ import com.google.protobuf.CodedInputStream; import com.google.protobuf.ExtensionRegistryLite; import com.google.protobuf.MessageLite; +import com.google.protobuf.MessageLiteOrBuilder; import com.google.protobuf.WireFormat; import dev.cel.common.annotations.Internal; import dev.cel.common.internal.CelLiteDescriptorPool; @@ -178,12 +179,27 @@ public Object toRuntimeValue(Object value) { return ProtoMessageLiteValue.create(msg, descriptor.getProtoTypeName(), this); } - return super.fromWellKnownProto(msg, wellKnownProto); + return fromWellKnownProto(msg, wellKnownProto); } return super.toRuntimeValue(value); } + @Override + protected Object fromWellKnownProto(MessageLiteOrBuilder msg, WellKnownProto wellKnownProto) { + if (wellKnownProto == WellKnownProto.FIELD_MASK) { + MessageLite message = (MessageLite) msg; + MessageLiteDescriptor descriptor = + descriptorPool + .findDescriptor(message) + .orElseThrow( + () -> new NoSuchElementException("Could not find a descriptor for: " + message)); + return ProtoMessageLiteValue.create(message, descriptor.getProtoTypeName(), this); + } + + return super.fromWellKnownProto(msg, wellKnownProto); + } + private Object getDefaultValue(FieldLiteDescriptor fieldDescriptor) { EncodingType encodingType = fieldDescriptor.getEncodingType(); switch (encodingType) { diff --git a/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java b/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java index cec3e0fbf..3b66171e4 100644 --- a/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java +++ b/common/src/test/java/dev/cel/common/values/ProtoLiteCelValueConverterTest.java @@ -27,6 +27,7 @@ import com.google.protobuf.DoubleValue; import com.google.protobuf.Duration; import com.google.protobuf.ExtensionRegistryLite; +import com.google.protobuf.FieldMask; import com.google.protobuf.FloatValue; import com.google.protobuf.Int32Value; import com.google.protobuf.Int64Value; @@ -104,6 +105,17 @@ public void fromProtoMessageToCelValue_withWellKnownProto_convertsToPrimitivesFr assertThat(adaptedValue).isEqualTo(testCase.value); } + @Test + public void fromProtoMessageToCelValue_fieldMask_returnsProtoMessageLiteValue() { + FieldMask fieldMask = FieldMask.newBuilder().addPaths("foo").addPaths("bar").build(); + + Object adaptedValue = PROTO_LITE_CEL_VALUE_CONVERTER.toRuntimeValue(fieldMask); + + assertThat(adaptedValue).isInstanceOf(ProtoMessageLiteValue.class); + assertThat(((ProtoMessageLiteValue) adaptedValue).select("paths")) + .isEqualTo(ImmutableList.of("foo", "bar")); + } + /** Test cases for repeated_int64: 1L,2L,3L */ @SuppressWarnings("ImmutableEnumChecker") // Test only private enum RepeatedFieldBytesTestCase { From c5d86d9c46cdabb35c32bfd098bc6dd3f5b040c4 Mon Sep 17 00:00:00 2001 From: Andrew Parmet Date: Tue, 2 Jun 2026 20:39:10 -0400 Subject: [PATCH 5/5] Remove redundant base FieldMask handler now that both converters intercept it --- .../common/values/BaseProtoCelValueConverter.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java b/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java index 6851deed5..9fc218abe 100644 --- a/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java +++ b/common/src/main/java/dev/cel/common/values/BaseProtoCelValueConverter.java @@ -17,8 +17,6 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.ImmutableMap.toImmutableMap; -import com.google.common.base.CaseFormat; -import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -29,7 +27,6 @@ import com.google.protobuf.BytesValue; import com.google.protobuf.DoubleValue; import com.google.protobuf.Duration; -import com.google.protobuf.FieldMask; import com.google.protobuf.FloatValue; import com.google.protobuf.Int32Value; import com.google.protobuf.Int64Value; @@ -44,8 +41,6 @@ import dev.cel.common.annotations.Internal; import dev.cel.common.internal.ProtoTimeUtils; import dev.cel.common.internal.WellKnownProto; -import java.util.ArrayList; -import java.util.List; /** * {@code BaseProtoCelValueConverter} contains the common logic for converting between native Java @@ -103,15 +98,6 @@ protected Object fromWellKnownProto(MessageLiteOrBuilder message, WellKnownProto return UnsignedLong.valueOf(((UInt32Value) message).getValue()); case UINT64_VALUE: return UnsignedLong.fromLongBits(((UInt64Value) message).getValue()); - case FIELD_MASK: - FieldMask fieldMask = (FieldMask) message; - List paths = new ArrayList<>(fieldMask.getPathsCount()); - for (String path : fieldMask.getPathsList()) { - if (!path.isEmpty()) { - paths.add(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, path)); - } - } - return normalizePrimitive(Joiner.on(",").join(paths)); case EMPTY: return ImmutableMap.of(); default: