From 409997f551a43fb1caf256bb57de26bcc5d0e1ed Mon Sep 17 00:00:00 2001 From: Sean Huh Date: Thu, 15 Oct 2026 11:00:34 -0700 Subject: [PATCH] Remove unused code and legacy type provider across CEL-Java PiperOrigin-RevId: 1000252391 --- checker/BUILD.bazel | 6 - .../src/main/java/dev/cel/checker/BUILD.bazel | 18 -- .../cel/checker/CelStandardDeclarations.java | 24 --- .../cel/checker/TypeProviderLegacyImpl.java | 121 ----------- .../src/test/java/dev/cel/checker/BUILD.bazel | 1 - .../checker/TypeProviderLegacyImplTest.java | 133 ------------ .../dev/cel/common/CelAbstractSyntaxTree.java | 14 -- .../java/dev/cel/common/CelDescriptors.java | 8 - .../main/java/dev/cel/common/Operator.java | 9 - .../common/ast/CelExprIdGeneratorFactory.java | 5 - .../java/dev/cel/common/internal/Errors.java | 12 -- .../cel/common/internal/ProtoTimeUtils.java | 5 - .../cel/common/internal/WellKnownProto.java | 9 - .../dev/cel/common/types/CelV1AlphaTypes.java | 193 ------------------ .../cel/common/CelAbstractSyntaxTreeTest.java | 83 -------- .../java/dev/cel/common/OperatorTest.java | 18 -- .../dev/cel/common/internal/ErrorsTest.java | 9 - .../common/internal/WellKnownProtoTest.java | 11 - .../java/dev/cel/parser/CelParserBase.java | 8 - .../java/dev/cel/runtime/RuntimeHelpers.java | 4 - 20 files changed, 691 deletions(-) delete mode 100644 checker/src/main/java/dev/cel/checker/TypeProviderLegacyImpl.java delete mode 100644 checker/src/test/java/dev/cel/checker/TypeProviderLegacyImplTest.java diff --git a/checker/BUILD.bazel b/checker/BUILD.bazel index 306aa9a4d..a1e5ecf31 100644 --- a/checker/BUILD.bazel +++ b/checker/BUILD.bazel @@ -27,12 +27,6 @@ java_library( exports = ["//checker/src/main/java/dev/cel/checker:type_provider_legacy"], ) -java_library( - name = "type_provider_legacy_impl", - visibility = ["//:internal"], - exports = ["//checker/src/main/java/dev/cel/checker:type_provider_legacy_impl"], -) - java_library( name = "checker_legacy_environment", deprecation = "See go/cel-java-migration-guide. Please use CEL-Java Fluent APIs //compiler instead", diff --git a/checker/src/main/java/dev/cel/checker/BUILD.bazel b/checker/src/main/java/dev/cel/checker/BUILD.bazel index 1050de508..57f540bea 100644 --- a/checker/src/main/java/dev/cel/checker/BUILD.bazel +++ b/checker/src/main/java/dev/cel/checker/BUILD.bazel @@ -129,24 +129,6 @@ java_library( ], ) -java_library( - name = "type_provider_legacy_impl", - srcs = ["TypeProviderLegacyImpl.java"], - tags = [ - ], - deps = [ - ":type_provider_legacy", - "//common/annotations", - "//common/types", - "//common/types:cel_proto_types", - "//common/types:type_providers", - "@cel_spec//proto/cel/expr:checked_java_proto", - "@maven//:com_google_errorprone_error_prone_annotations", - "@maven//:com_google_guava_guava", - "@maven//:org_jspecify_jspecify", - ], -) - java_library( name = "checker_legacy_environment", srcs = CHECKER_LEGACY_ENV_SOURCES, diff --git a/checker/src/main/java/dev/cel/checker/CelStandardDeclarations.java b/checker/src/main/java/dev/cel/checker/CelStandardDeclarations.java index b02c14c5e..9417bf1d4 100644 --- a/checker/src/main/java/dev/cel/checker/CelStandardDeclarations.java +++ b/checker/src/main/java/dev/cel/checker/CelStandardDeclarations.java @@ -15,11 +15,9 @@ package dev.cel.checker; import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableMap.toImmutableMap; import static com.google.common.collect.ImmutableSet.toImmutableSet; import static java.util.Arrays.stream; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.Immutable; @@ -34,7 +32,6 @@ import dev.cel.common.types.SimpleType; import dev.cel.common.types.TypeParamType; import dev.cel.common.types.TypeType; -import java.util.Optional; /** * Standard declarations for CEL. @@ -606,13 +603,6 @@ public enum Size implements StandardOverload { CelOverloadDecl.newMemberOverload("map_size", "map size", SimpleType.INT, MAP_OF_AB)), ; - private static final ImmutableMap ID_TO_ENUM = - stream(values()).collect(toImmutableMap(e -> e.celOverloadDecl().overloadId(), e -> e)); - - public static Optional fromOverloadId(String overloadId) { - return Optional.ofNullable(ID_TO_ENUM.get(overloadId)); - } - private final CelOverloadDecl celOverloadDecl; Size(CelOverloadDecl overloadDecl) { @@ -1489,16 +1479,6 @@ public boolean isHeterogeneousComparison() { public CelOverloadDecl celOverloadDecl() { return this.celOverloadDecl; } - - /** Finds a Comparison by its overload ID. */ - public static Optional fromOverloadId(String overloadId) { - for (Comparison c : values()) { - if (c.celOverloadDecl().overloadId().equals(overloadId)) { - return Optional.of(c); - } - } - return Optional.empty(); - } } private Overload() {} @@ -1518,10 +1498,6 @@ public String functionName() { return functionName; } - boolean isDeprecated() { - return isDeprecated; - } - StandardFunction(Operator operator, StandardOverload... overloads) { this(false, operator.getFunction(), overloads); } diff --git a/checker/src/main/java/dev/cel/checker/TypeProviderLegacyImpl.java b/checker/src/main/java/dev/cel/checker/TypeProviderLegacyImpl.java deleted file mode 100644 index b2ac51d95..000000000 --- a/checker/src/main/java/dev/cel/checker/TypeProviderLegacyImpl.java +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package dev.cel.checker; - -import dev.cel.expr.Type; -import com.google.common.collect.ImmutableSet; -import com.google.errorprone.annotations.CheckReturnValue; -import dev.cel.common.annotations.Internal; -import dev.cel.common.types.CelProtoTypes; -import dev.cel.common.types.CelType; -import dev.cel.common.types.CelTypeProvider; -import dev.cel.common.types.EnumType; -import dev.cel.common.types.ProtoMessageType; -import dev.cel.common.types.StructType; -import dev.cel.common.types.TypeType; -import java.util.Optional; -import org.jspecify.annotations.Nullable; - -/** - * The {@code TypeProviderLegacyImpl} acts as a bridge between the old and new type provider APIs - * - *

CEL Library Internals. Do Not Use. - */ -@CheckReturnValue -@Internal -final class TypeProviderLegacyImpl implements TypeProvider { - - private final CelTypeProvider celTypeProvider; - - TypeProviderLegacyImpl(CelTypeProvider celTypeProvider) { - this.celTypeProvider = celTypeProvider; - } - - @Override - public @Nullable Type lookupType(String typeName) { - return lookupCelType(typeName).map(CelProtoTypes::celTypeToType).orElse(null); - } - - @Override - public Optional lookupCelType(String typeName) { - return celTypeProvider.findType(typeName).map(TypeType::create); - } - - @Override - public @Nullable FieldType lookupFieldType(CelType type, String fieldName) { - String messageType = type.name(); - StructType structType = - (StructType) - celTypeProvider.findType(messageType).filter(t -> t instanceof StructType).orElse(null); - if (structType == null) { - return null; - } - - return structType - .findField(fieldName) - .map(f -> FieldType.of(CelProtoTypes.celTypeToType(f.type()))) - .orElse(null); - } - - @Override - public @Nullable FieldType lookupFieldType(Type type, String fieldName) { - return lookupFieldType(CelProtoTypes.typeToCelType(type), fieldName); - } - - @Override - public @Nullable ImmutableSet lookupFieldNames(Type type) { - String messageType = type.getMessageType(); - return celTypeProvider - .findType(messageType) - .filter(t -> t instanceof StructType) - .map(t -> ((StructType) t).fieldNames()) - .orElse(null); - } - - @Override - public @Nullable Integer lookupEnumValue(String enumName) { - int dotIndex = enumName.lastIndexOf("."); - if (dotIndex < 0 || dotIndex == enumName.length() - 1) { - return null; - } - String enumTypeName = enumName.substring(0, dotIndex); - String localEnumName = enumName.substring(dotIndex + 1); - return celTypeProvider - .findType(enumTypeName) - .filter(t -> t instanceof EnumType) - .flatMap(t -> ((EnumType) t).findNumberByName(localEnumName)) - .orElse(null); - } - - @Override - public @Nullable ExtensionFieldType lookupExtensionType(String extensionName) { - Optional extension = - celTypeProvider.types().stream() - .filter(t -> t instanceof ProtoMessageType) - .map(t -> (ProtoMessageType) t) - .map(t -> t.findExtension(extensionName)) - .filter(Optional::isPresent) - .map(Optional::get) - .findFirst(); - - return extension - .map( - et -> - ExtensionFieldType.of( - CelProtoTypes.celTypeToType(et.type()), - CelProtoTypes.celTypeToType(et.messageType()))) - .orElse(null); - } -} diff --git a/checker/src/test/java/dev/cel/checker/BUILD.bazel b/checker/src/test/java/dev/cel/checker/BUILD.bazel index 3028d6a2a..9957ab7fb 100644 --- a/checker/src/test/java/dev/cel/checker/BUILD.bazel +++ b/checker/src/test/java/dev/cel/checker/BUILD.bazel @@ -20,7 +20,6 @@ java_library( "//checker:proto_type_mask", "//checker:standard_decl", "//checker:type_inferencer", - "//checker:type_provider_legacy_impl", "//common:cel_ast", "//common:cel_function_decl", "//common:cel_issue", diff --git a/checker/src/test/java/dev/cel/checker/TypeProviderLegacyImplTest.java b/checker/src/test/java/dev/cel/checker/TypeProviderLegacyImplTest.java deleted file mode 100644 index 4569877c3..000000000 --- a/checker/src/test/java/dev/cel/checker/TypeProviderLegacyImplTest.java +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2022 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package dev.cel.checker; - -import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat; - -import dev.cel.expr.Type; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.protobuf.Descriptors.Descriptor; -import dev.cel.common.types.CelProtoTypes; -import dev.cel.common.types.ProtoMessageTypeProvider; -import dev.cel.expr.conformance.proto2.Proto2ExtensionScopedMessage; -import dev.cel.expr.conformance.proto2.TestAllTypes; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public final class TypeProviderLegacyImplTest { - - private static final ImmutableList DESCRIPTORS = - ImmutableList.of(TestAllTypes.getDescriptor(), Proto2ExtensionScopedMessage.getDescriptor()); - - private final ProtoMessageTypeProvider proto2Provider = new ProtoMessageTypeProvider(DESCRIPTORS); - - private final DescriptorTypeProvider descriptorTypeProvider = - new DescriptorTypeProvider(DESCRIPTORS); - - private final TypeProviderLegacyImpl compatTypeProvider = - new TypeProviderLegacyImpl(proto2Provider); - - @Test - public void lookupType() { - assertThat(compatTypeProvider.lookupType("cel.expr.conformance.proto2.TestAllTypes")) - .isEqualTo(descriptorTypeProvider.lookupType("cel.expr.conformance.proto2.TestAllTypes")); - assertThat(compatTypeProvider.lookupType("not.registered.TypeName")) - .isEqualTo(descriptorTypeProvider.lookupType("not.registered.TypeName")); - } - - @Test - public void lookupFieldNames() { - Type nestedTestAllTypes = - compatTypeProvider.lookupType("cel.expr.conformance.proto2.NestedTestAllTypes").getType(); - ImmutableSet fieldNames = compatTypeProvider.lookupFieldNames(nestedTestAllTypes); - assertThat(fieldNames) - .containsExactlyElementsIn(descriptorTypeProvider.lookupFieldNames(nestedTestAllTypes)); - assertThat(fieldNames).containsExactly("payload", "child"); - } - - @Test - public void lookupFieldType() { - Type nestedTestAllTypes = - compatTypeProvider.lookupType("cel.expr.conformance.proto2.NestedTestAllTypes").getType(); - assertThat(compatTypeProvider.lookupFieldType(nestedTestAllTypes, "payload")) - .isEqualTo(descriptorTypeProvider.lookupFieldType(nestedTestAllTypes, "payload")); - assertThat(compatTypeProvider.lookupFieldType(nestedTestAllTypes, "child")) - .isEqualTo(descriptorTypeProvider.lookupFieldType(nestedTestAllTypes, "child")); - } - - @Test - public void lookupFieldType_inputNotMessage() { - Type globalEnumType = - compatTypeProvider.lookupType("cel.expr.conformance.proto2.GlobalEnum").getType(); - assertThat(compatTypeProvider.lookupFieldType(globalEnumType, "payload")).isNull(); - assertThat(compatTypeProvider.lookupFieldType(globalEnumType, "payload")) - .isEqualTo(descriptorTypeProvider.lookupFieldType(globalEnumType, "payload")); - } - - @Test - public void lookupExtension() { - TypeProvider.ExtensionFieldType extensionType = - compatTypeProvider.lookupExtensionType("cel.expr.conformance.proto2.nested_enum_ext"); - assertThat(extensionType.messageType()) - .isEqualTo(CelProtoTypes.createMessage("cel.expr.conformance.proto2.TestAllTypes")); - assertThat(extensionType.fieldType().type()).isEqualTo(CelProtoTypes.INT64); - assertThat(extensionType) - .isEqualTo( - descriptorTypeProvider.lookupExtensionType( - "cel.expr.conformance.proto2.nested_enum_ext")); - } - - @Test - public void lookupEnumValue() { - Integer enumValue = - compatTypeProvider.lookupEnumValue("cel.expr.conformance.proto2.GlobalEnum.GAR"); - assertThat(enumValue).isEqualTo(1); - assertThat(enumValue) - .isEqualTo( - descriptorTypeProvider.lookupEnumValue("cel.expr.conformance.proto2.GlobalEnum.GAR")); - } - - @Test - public void lookupEnumValue_notFoundValue() { - Integer enumValue = - compatTypeProvider.lookupEnumValue("cel.expr.conformance.proto2.GlobalEnum.BAR"); - assertThat(enumValue).isNull(); - assertThat(enumValue) - .isEqualTo( - descriptorTypeProvider.lookupEnumValue("cel.expr.conformance.proto2.GlobalEnum.BAR")); - } - - @Test - public void lookupEnumValue_notFoundEnumType() { - Integer enumValue = - compatTypeProvider.lookupEnumValue("cel.expr.conformance.proto2.InvalidEnum.TEST"); - assertThat(enumValue).isNull(); - assertThat(enumValue) - .isEqualTo( - descriptorTypeProvider.lookupEnumValue("cel.expr.conformance.proto2.InvalidEnum.TEST")); - } - - @Test - public void lookupEnumValue_notFoundBadEnumName() { - assertThat(compatTypeProvider.lookupEnumValue("TEST")).isNull(); - assertThat(compatTypeProvider.lookupEnumValue("TEST.")).isNull(); - assertThat(descriptorTypeProvider.lookupEnumValue("TEST")).isNull(); - assertThat(descriptorTypeProvider.lookupEnumValue("TEST.")).isNull(); - } -} diff --git a/common/src/main/java/dev/cel/common/CelAbstractSyntaxTree.java b/common/src/main/java/dev/cel/common/CelAbstractSyntaxTree.java index b79c67e79..22551176f 100644 --- a/common/src/main/java/dev/cel/common/CelAbstractSyntaxTree.java +++ b/common/src/main/java/dev/cel/common/CelAbstractSyntaxTree.java @@ -15,11 +15,9 @@ package dev.cel.common; import com.google.auto.value.AutoValue; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.errorprone.annotations.Immutable; import dev.cel.common.annotations.Internal; -import dev.cel.common.ast.CelConstant; import dev.cel.common.ast.CelExpr; import dev.cel.common.ast.CelReference; import dev.cel.common.types.CelType; @@ -124,16 +122,4 @@ public CelReference getReferenceOrThrow(long exprId) { return getReference(exprId) .orElseThrow(() -> new NoSuchElementException("Expr Id not found: " + exprId)); } - - Optional findEnumValue(long exprId) { - CelReference ref = references().get(exprId); - return ref != null ? ref.value() : Optional.empty(); - } - - Optional> findOverloadIDs(long exprId) { - CelReference ref = references().get(exprId); - return ref != null && !ref.value().isPresent() - ? Optional.of(ref.overloadIds()) - : Optional.empty(); - } } diff --git a/common/src/main/java/dev/cel/common/CelDescriptors.java b/common/src/main/java/dev/cel/common/CelDescriptors.java index 95eccf115..145cd6b0e 100644 --- a/common/src/main/java/dev/cel/common/CelDescriptors.java +++ b/common/src/main/java/dev/cel/common/CelDescriptors.java @@ -50,14 +50,6 @@ public static Builder builder() { @AutoValue.Builder public abstract static class Builder { - abstract Builder setMessageTypeDescriptors(ImmutableSet value); - - abstract Builder setEnumDescriptors(ImmutableSet value); - - abstract Builder setExtensionDescriptors(ImmutableMultimap value); - - abstract Builder setFileDescriptors(ImmutableSet value); - protected abstract ImmutableSet.Builder messageTypeDescriptorsBuilder(); protected abstract ImmutableSet.Builder enumDescriptorsBuilder(); diff --git a/common/src/main/java/dev/cel/common/Operator.java b/common/src/main/java/dev/cel/common/Operator.java index c49c78267..2054f4d46 100644 --- a/common/src/main/java/dev/cel/common/Operator.java +++ b/common/src/main/java/dev/cel/common/Operator.java @@ -15,7 +15,6 @@ package dev.cel.common; import com.google.common.collect.ImmutableMap; -import java.util.Objects; import java.util.Optional; /** @@ -188,14 +187,6 @@ public static Optional findReverse(String op) { return Optional.ofNullable(REVERSE_OPERATORS.get(op)); } - /** Lookup a binary operator by its mangled name, as used within the AST. */ - static Optional findReverseBinaryOperator(String op) { - if (Objects.equals(op, LOGICAL_NOT.getFunction()) || Objects.equals(op, NEGATE.getFunction())) { - return Optional.empty(); - } - return Optional.ofNullable(REVERSE_OPERATORS.get(op)); - } - /** * Returns the precedence of the operator. * diff --git a/common/src/main/java/dev/cel/common/ast/CelExprIdGeneratorFactory.java b/common/src/main/java/dev/cel/common/ast/CelExprIdGeneratorFactory.java index 9b7bc60fc..9da98232e 100644 --- a/common/src/main/java/dev/cel/common/ast/CelExprIdGeneratorFactory.java +++ b/common/src/main/java/dev/cel/common/ast/CelExprIdGeneratorFactory.java @@ -59,11 +59,6 @@ public static class StableIdGenerator { private final HashMap idSet; private long exprId; - /** Checks if the given ID has been encountered before. */ - public boolean hasId(long id) { - return idSet.containsKey(id); - } - /** Generates the next available ID. */ public long nextExprId() { return ++exprId; diff --git a/common/src/main/java/dev/cel/common/internal/Errors.java b/common/src/main/java/dev/cel/common/internal/Errors.java index 3796b642a..c67959358 100644 --- a/common/src/main/java/dev/cel/common/internal/Errors.java +++ b/common/src/main/java/dev/cel/common/internal/Errors.java @@ -249,18 +249,6 @@ public String getLocationAt(int position) { return String.format("%s:%d:%d", current.description, line, column); } - /** Returns the raw codepoint offset for the given line and column. */ - public int getLocationPosition(int line, int column) { - ImmutableIntArray lineOffsets = getLineOffsets(); - if (line == 1) { - return column - 1; - } - if (line > 1 && line - 1 < lineOffsets.length()) { - return lineOffsets.get(line - 2) + column - 1; - } - return -1; - } - /** Returns the {@code SourceLocation} for the given codepoint offset {@code position}. */ public SourceLocation getPositionLocation(int position) { Context current = context.peekFirst(); diff --git a/common/src/main/java/dev/cel/common/internal/ProtoTimeUtils.java b/common/src/main/java/dev/cel/common/internal/ProtoTimeUtils.java index 124f9dbe1..b5405382b 100644 --- a/common/src/main/java/dev/cel/common/internal/ProtoTimeUtils.java +++ b/common/src/main/java/dev/cel/common/internal/ProtoTimeUtils.java @@ -395,11 +395,6 @@ public static Timestamp subtract(Timestamp ts, Duration dur) { return ProtoTimeUtils.toProtoTimestamp(newInstant); } - /** Calculate the difference between two timestamps. */ - public static Duration between(Timestamp from, Timestamp to) { - return between(from, to, /* validateOverflow= */ true); - } - /** Calculate the difference between two timestamps. */ public static Duration between(Timestamp from, Timestamp to, boolean validateOverflow) { Instant javaFrom = ProtoTimeUtils.toJavaInstant(checkValid(from)); diff --git a/common/src/main/java/dev/cel/common/internal/WellKnownProto.java b/common/src/main/java/dev/cel/common/internal/WellKnownProto.java index 21ee8053e..4eec5536f 100644 --- a/common/src/main/java/dev/cel/common/internal/WellKnownProto.java +++ b/common/src/main/java/dev/cel/common/internal/WellKnownProto.java @@ -118,11 +118,6 @@ public enum WellKnownProto { stream(WellKnownProto.values()) .collect(toImmutableMap(WellKnownProto::typeName, Function.identity())); - private static final ImmutableMap, WellKnownProto> - CLASS_TO_NAME_TO_WELL_KNOWN_PROTO_MAP = - stream(WellKnownProto.values()) - .collect(toImmutableMap(WellKnownProto::messageClass, Function.identity())); - private static final ImmutableMultimap PATH_NAME_TO_WELL_KNOWN_PROTO_MAP = initPathNameMap(); @@ -166,10 +161,6 @@ public static Optional getByTypeName(String typeName) { return Optional.ofNullable(TYPE_NAME_TO_WELL_KNOWN_PROTO_MAP.get(typeName)); } - public static Optional getByClass(Class clazz) { - return Optional.ofNullable(CLASS_TO_NAME_TO_WELL_KNOWN_PROTO_MAP.get(clazz)); - } - /** * Returns true if the provided {@code typeName} is a well known type, and it's a wrapper. False * otherwise. diff --git a/common/src/main/java/dev/cel/common/types/CelV1AlphaTypes.java b/common/src/main/java/dev/cel/common/types/CelV1AlphaTypes.java index 87fe9b6a0..5dbc5327a 100644 --- a/common/src/main/java/dev/cel/common/types/CelV1AlphaTypes.java +++ b/common/src/main/java/dev/cel/common/types/CelV1AlphaTypes.java @@ -19,13 +19,10 @@ import com.google.api.expr.v1alpha1.Type; import com.google.api.expr.v1alpha1.Type.PrimitiveType; import com.google.api.expr.v1alpha1.Type.WellKnownType; -import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.protobuf.Descriptors.Descriptor; import com.google.protobuf.Empty; import com.google.protobuf.NullValue; import dev.cel.common.annotations.Internal; @@ -34,25 +31,6 @@ /** Utility class for working with {@link Type}. */ public final class CelV1AlphaTypes { - // Message type names with well-known type equivalents or special handling. - public static final String ANY_MESSAGE = "google.protobuf.Any"; - public static final String DURATION_MESSAGE = "google.protobuf.Duration"; - public static final String LIST_VALUE_MESSAGE = "google.protobuf.ListValue"; - public static final String STRUCT_MESSAGE = "google.protobuf.Struct"; - public static final String TIMESTAMP_MESSAGE = "google.protobuf.Timestamp"; - public static final String VALUE_MESSAGE = "google.protobuf.Value"; - - // Message names for wrapper types. - public static final String BOOL_WRAPPER_MESSAGE = "google.protobuf.BoolValue"; - public static final String BYTES_WRAPPER_MESSAGE = "google.protobuf.BytesValue"; - public static final String DOUBLE_WRAPPER_MESSAGE = "google.protobuf.DoubleValue"; - public static final String FLOAT_WRAPPER_MESSAGE = "google.protobuf.FloatValue"; - public static final String INT32_WRAPPER_MESSAGE = "google.protobuf.Int32Value"; - public static final String INT64_WRAPPER_MESSAGE = "google.protobuf.Int64Value"; - public static final String STRING_WRAPPER_MESSAGE = "google.protobuf.StringValue"; - public static final String UINT32_WRAPPER_MESSAGE = "google.protobuf.UInt32Value"; - public static final String UINT64_WRAPPER_MESSAGE = "google.protobuf.UInt64Value"; - // Static types. public static final Type ERROR = Type.newBuilder().setError(Empty.getDefaultInstance()).build(); public static final Type DYN = Type.newBuilder().setDyn(Empty.getDefaultInstance()).build(); @@ -67,28 +45,6 @@ public final class CelV1AlphaTypes { public static final Type TIMESTAMP = create(WellKnownType.TIMESTAMP); public static final Type DURATION = create(WellKnownType.DURATION); - /** Map of well-known proto messages and their CEL {@code Type} equivalents. */ - static final ImmutableMap WELL_KNOWN_TYPE_MAP = - ImmutableMap.builder() - .put(DOUBLE_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.DOUBLE)) - .put(FLOAT_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.DOUBLE)) - .put(INT64_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.INT64)) - .put(INT32_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.INT64)) - .put(UINT64_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.UINT64)) - .put(UINT32_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.UINT64)) - .put(BOOL_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.BOOL)) - .put(STRING_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.STRING)) - .put(BYTES_WRAPPER_MESSAGE, CelV1AlphaTypes.createWrapper(CelV1AlphaTypes.BYTES)) - .put(TIMESTAMP_MESSAGE, CelV1AlphaTypes.TIMESTAMP) - .put(DURATION_MESSAGE, CelV1AlphaTypes.DURATION) - .put( - STRUCT_MESSAGE, - CelV1AlphaTypes.createMap(CelV1AlphaTypes.STRING, CelV1AlphaTypes.DYN)) - .put(VALUE_MESSAGE, CelV1AlphaTypes.DYN) - .put(LIST_VALUE_MESSAGE, CelV1AlphaTypes.createList(CelV1AlphaTypes.DYN)) - .put(ANY_MESSAGE, CelV1AlphaTypes.ANY) - .buildOrThrow(); - static final ImmutableMap SIMPLE_CEL_KIND_TO_TYPE = ImmutableMap.builder() .put(CelKind.ERROR, CelV1AlphaTypes.ERROR) @@ -105,24 +61,6 @@ public final class CelV1AlphaTypes { .put(CelKind.UINT, CelV1AlphaTypes.UINT64) .buildOrThrow(); - private static final ImmutableMap WELL_KNOWN_CEL_TYPE_MAP = - ImmutableMap.builder() - .put(BOOL_WRAPPER_MESSAGE, NullableType.create(SimpleType.BOOL)) - .put(BYTES_WRAPPER_MESSAGE, NullableType.create(SimpleType.BYTES)) - .put(FLOAT_WRAPPER_MESSAGE, NullableType.create(SimpleType.DOUBLE)) - .put(DOUBLE_WRAPPER_MESSAGE, NullableType.create(SimpleType.DOUBLE)) - .put(INT32_WRAPPER_MESSAGE, NullableType.create(SimpleType.INT)) - .put(INT64_WRAPPER_MESSAGE, NullableType.create(SimpleType.INT)) - .put(STRING_WRAPPER_MESSAGE, NullableType.create(SimpleType.STRING)) - .put(UINT32_WRAPPER_MESSAGE, NullableType.create(SimpleType.UINT)) - .put(UINT64_WRAPPER_MESSAGE, NullableType.create(SimpleType.UINT)) - .put(ANY_MESSAGE, SimpleType.ANY) - .put(DURATION_MESSAGE, SimpleType.DURATION) - .put(TIMESTAMP_MESSAGE, SimpleType.TIMESTAMP) - .put(LIST_VALUE_MESSAGE, ListType.create(SimpleType.DYN)) - .put(STRUCT_MESSAGE, MapType.create(SimpleType.STRING, SimpleType.DYN)) - .put(VALUE_MESSAGE, SimpleType.DYN) - .buildOrThrow(); private static final ImmutableMap PROTOBUF_TYPE_TO_CEL_TYPE_MAP = ImmutableMap.builder() .put(CelV1AlphaTypes.BOOL, SimpleType.BOOL) @@ -173,11 +111,6 @@ public static Type createMessage(String messageName) { return Type.newBuilder().setMessageType(messageName).build(); } - /** Create a message {@code Type} for {@code Descriptor}. */ - public static Type createMessage(Descriptor descriptor) { - return createMessage(descriptor.getFullName()); - } - /** Create a type param {@code Type}. */ public static Type createTypeParam(String name) { return Type.newBuilder().setTypeParam(name).build(); @@ -194,125 +127,6 @@ public static Type createWrapper(Type type) { return createWrapper(type.getPrimitive()); } - /** - * Method to adapt a simple {@code Type} into a {@code String} representation. - * - *

This method can also format global functions. See the {@link #formatFunction} methods for - * richer control over function formatting. - */ - public static String format(Type type) { - return format(type, /* typeParamToDyn= */ false); - } - - private static String format(Type type, boolean typeParamToDyn) { - switch (type.getTypeKindCase()) { - case DYN: - return "dyn"; - case NULL: - return "null"; - case PRIMITIVE: - switch (type.getPrimitive()) { - case BOOL: - return "bool"; - case INT64: - return "int"; - case UINT64: - return "uint"; - case DOUBLE: - return "double"; - case STRING: - return "string"; - case BYTES: - return "bytes"; - default: - break; - } - break; - case WELL_KNOWN: - switch (type.getWellKnown()) { - case TIMESTAMP: - return "google.protobuf.Timestamp"; - case DURATION: - return "google.protobuf.Duration"; - case ANY: - return "any"; - default: - break; - } - break; - case LIST_TYPE: - return String.format("list(%s)", format(type.getListType().getElemType(), typeParamToDyn)); - case MAP_TYPE: - return String.format( - "map(%s, %s)", - format(type.getMapType().getKeyType(), typeParamToDyn), - format(type.getMapType().getValueType(), typeParamToDyn)); - case TYPE: - return String.format("type(%s)", format(type.getType(), typeParamToDyn)); - case WRAPPER: - return String.format("wrapper(%s)", format(create(type.getWrapper()), typeParamToDyn)); - case ERROR: - return "*error*"; - case MESSAGE_TYPE: - return type.getMessageType(); - case TYPE_PARAM: - return typeParamToDyn ? "dyn" : type.getTypeParam(); - case FUNCTION: - return formatFunction( - type.getFunction().getResultType(), - type.getFunction().getArgTypesList(), - false, - typeParamToDyn); - case ABSTRACT_TYPE: - String result = type.getAbstractType().getName(); - if (type.getAbstractType().getParameterTypesCount() > 0) { - result += formatTypeArgs(type.getAbstractType().getParameterTypesList(), typeParamToDyn); - } - return result; - default: - break; - } - return ""; - } - - /** - * Format a function signature string from the input {@code argTypes} and {@code resultType}. - * - *

When {@code isInstance} is {@code true}, the {@code argTypes[0]} type is used as the - * receiver type. - * - *

When {@code resultType} is {@code null}, the function signature omits the result type. This - * is useful for computing overload signatures. - * - *

When {@code typeParamToDyn} is {@code true}, parameterized type argument are represented as - * {@code Types.DYN} values. - */ - public static String formatFunction( - Type resultType, Iterable argTypes, boolean isInstance, boolean typeParamToDyn) { - String argString; - if (isInstance) { - argString = - format(Iterables.get(argTypes, 0), typeParamToDyn) - + "." - + formatTypeArgs(Iterables.skip(argTypes, 1), typeParamToDyn); - } else { - argString = formatTypeArgs(argTypes, typeParamToDyn); - } - if (resultType == null) { - return argString; - } else { - return argString + " -> " + format(resultType, typeParamToDyn); - } - } - - public static boolean isWellKnownType(String typeName) { - return WELL_KNOWN_TYPE_MAP.containsKey(typeName); - } - - public static Optional getWellKnownCelType(String typeName) { - return Optional.ofNullable(WELL_KNOWN_CEL_TYPE_MAP.getOrDefault(typeName, null)); - } - /** Converts a Protobuf type into CEL native type. */ @Internal public static Type celTypeToType(CelType celType) { @@ -391,11 +205,4 @@ public static CelType typeToCelType(Type type) { throw new IllegalArgumentException(String.format("Unsupported type: %s", type)); } } - - private static String formatTypeArgs(Iterable types, final boolean typeParamToDyn) { - return String.format( - "(%s)", - Joiner.on(", ") - .join(Iterables.transform(types, (Type type) -> format(type, typeParamToDyn)))); - } } diff --git a/common/src/test/java/dev/cel/common/CelAbstractSyntaxTreeTest.java b/common/src/test/java/dev/cel/common/CelAbstractSyntaxTreeTest.java index b04f9f406..ce7d9c1cc 100644 --- a/common/src/test/java/dev/cel/common/CelAbstractSyntaxTreeTest.java +++ b/common/src/test/java/dev/cel/common/CelAbstractSyntaxTreeTest.java @@ -16,19 +16,10 @@ import static com.google.common.truth.Truth.assertThat; -import dev.cel.expr.CheckedExpr; -import dev.cel.expr.Constant; -import dev.cel.expr.Expr; -import dev.cel.expr.Expr.Call; -import dev.cel.expr.Expr.Ident; -import dev.cel.expr.Reference; -import dev.cel.expr.SourceInfo; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.testing.EqualsTester; import dev.cel.common.ast.CelConstant; import dev.cel.common.ast.CelExpr; -import dev.cel.common.types.CelProtoTypes; import dev.cel.common.types.SimpleType; import dev.cel.compiler.CelCompiler; import dev.cel.compiler.CelCompilerFactory; @@ -54,42 +45,6 @@ public final class CelAbstractSyntaxTreeTest { CelAbstractSyntaxTree.newCheckedAst( EXPR, SOURCE_INFO, ImmutableMap.of(), ImmutableMap.of(1L, SimpleType.BOOL)); - private static final CelAbstractSyntaxTree CHECKED_ENUM_AST = - CelProtoAbstractSyntaxTree.fromCheckedExpr( - CheckedExpr.newBuilder() - .putTypeMap(1L, CelProtoTypes.INT64) - .putTypeMap(2L, CelProtoTypes.INT64) - .putTypeMap(3L, CelProtoTypes.BOOL) - .putReferenceMap( - 2L, - Reference.newBuilder() - .setValue(Constant.newBuilder().setInt64Value(2)) - .build()) - .putReferenceMap(3L, Reference.newBuilder().addOverloadId("not_equals").build()) - .setExpr( - Expr.newBuilder() - .setId(3L) - .setCallExpr( - Call.newBuilder() - .setFunction("_!=_") - .addArgs( - Expr.newBuilder() - .setId(1L) - .setConstExpr(Constant.newBuilder().setInt64Value(1))) - .addArgs( - Expr.newBuilder() - .setId(2L) - .setIdentExpr(Ident.newBuilder().setName("ENUM"))))) - .setSourceInfo( - SourceInfo.newBuilder() - .setLocation("test/location.cel") - .putPositions(1L, 0) - .putPositions(2L, 4) - .putPositions(3L, 2) - .addLineOffsets(8)) - .build()) - .getAst(); - @Test public void getResultType_isDynWhenParsedExpr() { CelAbstractSyntaxTree ast = PARSED_AST; @@ -104,44 +59,6 @@ public void getResultType_isStaticWhenCheckedExpr() { assertThat(ast.getResultType()).isEqualTo(SimpleType.BOOL); } - @Test - public void findEnumValue_findsConstantInCheckedExpr() { - CelAbstractSyntaxTree ast = CHECKED_ENUM_AST; - assertThat(ast.findEnumValue(1)).isEmpty(); - assertThat(ast.findEnumValue(2)).hasValue(CelConstant.ofValue(2)); - assertThat(ast.findEnumValue(3)).isEmpty(); - } - - @Test - public void findEnumValue_doesNotFindConstantInParsedExpr() { - CelAbstractSyntaxTree ast = - CelAbstractSyntaxTree.newParsedAst( - CHECKED_ENUM_AST.getExpr(), CHECKED_ENUM_AST.getSource()); - - assertThat(ast.findEnumValue(1)).isEmpty(); - assertThat(ast.findEnumValue(2)).isEmpty(); - assertThat(ast.findEnumValue(3)).isEmpty(); - } - - @Test - public void findOverloadIDs_findsOverloadsInCheckedExpr() { - CelAbstractSyntaxTree ast = CHECKED_ENUM_AST; - assertThat(ast.findOverloadIDs(1)).isEmpty(); - assertThat(ast.findOverloadIDs(2)).isEmpty(); - assertThat(ast.findOverloadIDs(3)).hasValue(ImmutableList.of("not_equals")); - } - - @Test - public void findOverloadIDs_doesNotFindsOverloadsInParsedExpr() { - CelAbstractSyntaxTree ast = - CelAbstractSyntaxTree.newParsedAst( - CHECKED_ENUM_AST.getExpr(), CHECKED_ENUM_AST.getSource()); - - assertThat(ast.findOverloadIDs(1)).isEmpty(); - assertThat(ast.findOverloadIDs(2)).isEmpty(); - assertThat(ast.findOverloadIDs(3)).isEmpty(); - } - @Test public void getSource_hasDescriptionEqualToSourceLocation() { assertThat(PARSED_AST.getSource().getDescription()).isEqualTo("test/location.cel"); diff --git a/common/src/test/java/dev/cel/common/OperatorTest.java b/common/src/test/java/dev/cel/common/OperatorTest.java index 28d941c6e..9f905ba95 100644 --- a/common/src/test/java/dev/cel/common/OperatorTest.java +++ b/common/src/test/java/dev/cel/common/OperatorTest.java @@ -52,24 +52,6 @@ public void findReverse_allOperators(@TestParameter Operator operator) { assertThat(Operator.findReverse(operator.getFunction())).hasValue(operator); } - @Test - public void findReverseBinaryOperator_returnsEmptyWhenNotFound() { - assertThat(Operator.findReverseBinaryOperator("+")).isEmpty(); - } - - @Test - public void findReverseBinaryOperator_returnsEmptyForUnaryOperator() { - assertThat(Operator.findReverse("-_")).hasValue(Operator.NEGATE); - assertThat(Operator.findReverseBinaryOperator("-_")).isEmpty(); - assertThat(Operator.findReverse("!_")).hasValue(Operator.LOGICAL_NOT); - assertThat(Operator.findReverseBinaryOperator("!_")).isEmpty(); - } - - @Test - public void findReverseBinaryOperator_returnsCorrectOperator() { - assertThat(Operator.findReverseBinaryOperator("_+_")).hasValue(Operator.ADD); - } - @Test @TestParameters({ "{operator: '_?_:_', value: 8}", diff --git a/common/src/test/java/dev/cel/common/internal/ErrorsTest.java b/common/src/test/java/dev/cel/common/internal/ErrorsTest.java index ad46f7737..6daba3438 100644 --- a/common/src/test/java/dev/cel/common/internal/ErrorsTest.java +++ b/common/src/test/java/dev/cel/common/internal/ErrorsTest.java @@ -39,15 +39,6 @@ public void getLocationAt() { assertThat(errors.getLocationAt(12)).isEqualTo("test:3:1"); // beyond EOF } - @Test - public void getLocationPosition() { - Errors errors = new Errors("test", "hello\nworld"); - assertThat(errors.getLocationPosition(1, 1)).isEqualTo(0); - assertThat(errors.getLocationPosition(2, 1)).isEqualTo(6); - assertThat(errors.getLocationPosition(2, 6)).isEqualTo(11); - assertThat(errors.getLocationPosition(3, 1)).isEqualTo(-1); - } - @Test public void getPositionLocation() { Errors errors = new Errors("test", "hello\nworld"); diff --git a/common/src/test/java/dev/cel/common/internal/WellKnownProtoTest.java b/common/src/test/java/dev/cel/common/internal/WellKnownProtoTest.java index c12411d95..9c9aa4a45 100644 --- a/common/src/test/java/dev/cel/common/internal/WellKnownProtoTest.java +++ b/common/src/test/java/dev/cel/common/internal/WellKnownProtoTest.java @@ -36,7 +36,6 @@ import com.google.protobuf.Value; import com.google.testing.junit.testparameterinjector.TestParameterInjector; import com.google.testing.junit.testparameterinjector.TestParameters; -import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; @@ -71,16 +70,6 @@ public void isWrapperType_withTypeName_false(String typeName) { assertThat(WellKnownProto.isWrapperType(typeName)).isFalse(); } - @Test - public void getByClass_success() { - assertThat(WellKnownProto.getByClass(FloatValue.class)).hasValue(WellKnownProto.FLOAT_VALUE); - } - - @Test - public void getByClass_unknownClass_returnsEmpty() { - assertThat(WellKnownProto.getByClass(List.class)).isEmpty(); - } - @Test public void getByPathName_singular() { assertThat(WellKnownProto.getByPathName(Any.getDescriptor().getFile().getName())) diff --git a/parser/src/main/java/dev/cel/parser/CelParserBase.java b/parser/src/main/java/dev/cel/parser/CelParserBase.java index 8f528e9f3..38d18d325 100644 --- a/parser/src/main/java/dev/cel/parser/CelParserBase.java +++ b/parser/src/main/java/dev/cel/parser/CelParserBase.java @@ -65,14 +65,6 @@ final ImmutableMap getMacros() { return macros; } - final ImmutableList getStandardMacros() { - return standardMacros; - } - - final ImmutableSet getParserLibraries() { - return parserLibraries; - } - final Optional findMacro(String key) { return Optional.ofNullable(macros.get(key)); } diff --git a/runtime/src/main/java/dev/cel/runtime/RuntimeHelpers.java b/runtime/src/main/java/dev/cel/runtime/RuntimeHelpers.java index 804c30b03..6dbba80cd 100644 --- a/runtime/src/main/java/dev/cel/runtime/RuntimeHelpers.java +++ b/runtime/src/main/java/dev/cel/runtime/RuntimeHelpers.java @@ -330,10 +330,6 @@ public static UnsignedLong uint64Subtract(UnsignedLong x, UnsignedLong y) { // want to avoid to do this conversion eagerly, so we create views on the underlying data. // The below code is the extensive boilerplate to do so. - static Converter identity() { - return (A value) -> value; - } - static final Converter INT32_TO_INT64 = Integer::longValue; static final Converter FLOAT_TO_DOUBLE = Float::doubleValue;