Skip to content

Commit e85f675

Browse files
l46kokcopybara-github
authored andcommitted
Fix optional type resolution
PiperOrigin-RevId: 620939578
1 parent 423e8bb commit e85f675

File tree

4 files changed

+31
-0
lines changed

4 files changed

+31
-0
lines changed

extensions/src/main/java/dev/cel/extensions/CelOptionalLibrary.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@
2828
import dev.cel.common.CelFunctionDecl;
2929
import dev.cel.common.CelIssue;
3030
import dev.cel.common.CelOverloadDecl;
31+
import dev.cel.common.CelVarDecl;
3132
import dev.cel.common.ast.CelExpr;
3233
import dev.cel.common.types.ListType;
3334
import dev.cel.common.types.MapType;
3435
import dev.cel.common.types.OptionalType;
3536
import dev.cel.common.types.SimpleType;
3637
import dev.cel.common.types.TypeParamType;
38+
import dev.cel.common.types.TypeType;
3739
import dev.cel.compiler.CelCompilerLibrary;
3840
import dev.cel.parser.CelMacro;
3941
import dev.cel.parser.CelMacroExprFactory;
@@ -93,6 +95,11 @@ public void setCheckerOptions(CelCheckerBuilder checkerBuilder) {
9395
OptionalType optionalTypeV = OptionalType.create(paramTypeV);
9496
ListType listTypeV = ListType.create(paramTypeV);
9597
MapType mapTypeKv = MapType.create(paramTypeK, paramTypeV);
98+
99+
// Type declaration for optional_type -> type(optional_type(V))
100+
checkerBuilder.addVarDeclarations(
101+
CelVarDecl.newVarDeclaration(OptionalType.NAME, TypeType.create(optionalTypeV)));
102+
96103
checkerBuilder.addFunctionDeclarations(
97104
CelFunctionDecl.newFunctionDeclaration(
98105
Function.OPTIONAL_OF.getFunction(),

extensions/src/test/java/dev/cel/extensions/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ java_library(
2727
"//parser:macro",
2828
"//runtime",
2929
"//runtime:interpreter_util",
30+
"@cel_spec//proto/cel/expr:expr_java_proto",
3031
"@maven//:com_google_guava_guava",
3132
"@maven//:com_google_protobuf_protobuf_java",
3233
"@maven//:com_google_protobuf_protobuf_java_util",

extensions/src/test/java/dev/cel/extensions/CelOptionalLibraryTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static com.google.common.truth.Truth.assertThat;
1818
import static org.junit.Assert.assertThrows;
1919

20+
import dev.cel.expr.Value;
2021
import com.google.common.collect.ImmutableList;
2122
import com.google.common.collect.ImmutableMap;
2223
import com.google.common.primitives.UnsignedLong;
@@ -1409,4 +1410,23 @@ public void optionalFlatMapMacro_withNonIdent_throws() {
14091410
.hasMessageThat()
14101411
.contains("optFlatMap() variable name must be a simple identifier");
14111412
}
1413+
1414+
@Test
1415+
public void optionalType_typeResolution() throws Exception {
1416+
Cel cel = newCelBuilder().build();
1417+
1418+
CelAbstractSyntaxTree ast = cel.compile("optional_type").getAst();
1419+
1420+
assertThat(cel.createProgram(ast).eval())
1421+
.isEqualTo(Value.newBuilder().setTypeValue("optional_type").build());
1422+
}
1423+
1424+
@Test
1425+
public void optionalType_typeComparison() throws Exception {
1426+
Cel cel = newCelBuilder().build();
1427+
1428+
CelAbstractSyntaxTree ast = cel.compile("type(optional.none()) == optional_type").getAst();
1429+
1430+
assertThat(cel.createProgram(ast).eval()).isEqualTo(true);
1431+
}
14121432
}

runtime/src/main/java/dev/cel/runtime/StandardTypeResolver.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import dev.cel.common.types.TypeType;
3535
import java.util.Collection;
3636
import java.util.Map;
37+
import java.util.Optional;
3738
import org.jspecify.nullness.Nullable;
3839

3940
/**
@@ -76,6 +77,8 @@ private static ImmutableMap<Value, Class<?>> commonTypes(boolean unsignedLongs)
7677
// Aggregate types.
7778
.put(createType("list"), Collection.class)
7879
.put(createType("map"), Map.class)
80+
// Optional type
81+
.put(createType("optional_type"), Optional.class)
7982
.buildOrThrow();
8083
}
8184

0 commit comments

Comments
 (0)