Skip to content

Commit 5d17cda

Browse files
l46kokcopybara-github
authored andcommitted
Accept a list as an argument to setParameterTypes in function overload decl
PiperOrigin-RevId: 618235574
1 parent 91a7cf7 commit 5d17cda

4 files changed

Lines changed: 56 additions & 6 deletions

File tree

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

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
import static com.google.common.truth.Truth.assertThat;
1818
import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat;
19+
import static dev.cel.common.CelFunctionDecl.newFunctionDeclaration;
20+
import static dev.cel.common.CelOverloadDecl.newGlobalOverload;
21+
import static dev.cel.common.CelOverloadDecl.newMemberOverload;
1922
import static org.junit.Assert.assertThrows;
2023

2124
import dev.cel.expr.CheckedExpr;
@@ -55,10 +58,8 @@
5558
import dev.cel.checker.ProtoTypeMask;
5659
import dev.cel.checker.TypeProvider;
5760
import dev.cel.common.CelAbstractSyntaxTree;
58-
import dev.cel.common.CelFunctionDecl;
5961
import dev.cel.common.CelIssue;
6062
import dev.cel.common.CelOptions;
61-
import dev.cel.common.CelOverloadDecl;
6263
import dev.cel.common.CelProtoAbstractSyntaxTree;
6364
import dev.cel.common.CelValidationException;
6465
import dev.cel.common.CelValidationResult;
@@ -97,6 +98,7 @@
9798
import dev.cel.testing.testdata.proto3.TestAllTypesProto.TestAllTypes;
9899
import java.util.ArrayList;
99100
import java.util.List;
101+
import java.util.Map;
100102
import java.util.Optional;
101103
import java.util.concurrent.ExecutorService;
102104
import java.util.concurrent.Executors;
@@ -1800,9 +1802,9 @@ public boolean isAssignableFrom(CelType other) {
18001802
CelFactory.standardCelBuilder()
18011803
.addVar("x", SimpleType.INT)
18021804
.addFunctionDeclarations(
1803-
CelFunctionDecl.newFunctionDeclaration(
1805+
newFunctionDeclaration(
18041806
"print",
1805-
CelOverloadDecl.newGlobalOverload(
1807+
newGlobalOverload(
18061808
"print_overload",
18071809
SimpleType.STRING,
18081810
customType))) // The overload would accept either Int or CustomType
@@ -1816,6 +1818,36 @@ public boolean isAssignableFrom(CelType other) {
18161818
assertThat(result).isEqualTo("5");
18171819
}
18181820

1821+
@Test
1822+
@SuppressWarnings("unchecked") // test only
1823+
public void program_functionParamWithWellKnownType() throws Exception {
1824+
Cel cel =
1825+
CelFactory.standardCelBuilder()
1826+
.addFunctionDeclarations(
1827+
newFunctionDeclaration(
1828+
"hasStringValue",
1829+
newMemberOverload(
1830+
"struct_hasStringValue_string_string",
1831+
SimpleType.BOOL,
1832+
StructTypeReference.create("google.protobuf.Struct"),
1833+
SimpleType.STRING,
1834+
SimpleType.STRING)))
1835+
.addFunctionBindings(
1836+
CelFunctionBinding.from(
1837+
"struct_hasStringValue_string_string",
1838+
ImmutableList.of(Map.class, String.class, String.class),
1839+
args -> {
1840+
Map<String, String> map = (Map<String, String>) args[0];
1841+
return map.containsKey(args[1]) && map.containsValue(args[2]);
1842+
}))
1843+
.build();
1844+
CelAbstractSyntaxTree ast = cel.compile("{'a': 'b'}.hasStringValue('a', 'b')").getAst();
1845+
1846+
boolean result = (boolean) cel.createProgram(ast).eval();
1847+
1848+
assertThat(result).isTrue();
1849+
}
1850+
18191851
@Test
18201852
public void toBuilder_isImmutable() {
18211853
CelBuilder celBuilder = CelFactory.standardCelBuilder();

checker/src/main/java/dev/cel/checker/Env.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,7 @@ private static CelFunctionDecl sanitizeFunction(CelFunctionDecl func) {
966966
overloadBuilder.setResultType(getWellKnownType(resultType));
967967
}
968968

969-
ImmutableSet.Builder<CelType> parameterTypeBuilder = ImmutableSet.builder();
969+
ImmutableList.Builder<CelType> parameterTypeBuilder = ImmutableList.builder();
970970
for (CelType paramType : overloadBuilder.parameterTypes()) {
971971
if (isWellKnownType(paramType)) {
972972
parameterTypeBuilder.add(getWellKnownType(paramType));

checker/src/test/java/dev/cel/checker/CelOverloadDeclTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static dev.cel.common.CelOverloadDecl.newMemberOverload;
2121

2222
import dev.cel.expr.Decl.FunctionDecl.Overload;
23+
import com.google.common.collect.ImmutableList;
2324
import dev.cel.common.CelOverloadDecl;
2425
import dev.cel.common.types.CelTypes;
2526
import dev.cel.common.types.SimpleType;
@@ -85,4 +86,21 @@ public void toProtoOverload_withTypeParams() {
8586
.containsExactly(CelTypes.STRING, CelTypes.DOUBLE, CelTypes.createTypeParam("B"));
8687
assertThat(protoOverload.getTypeParamsList()).containsExactly("A", "B");
8788
}
89+
90+
@Test
91+
public void setParameterTypes_doesNotDedupe() {
92+
CelOverloadDecl overloadDecl =
93+
CelOverloadDecl.newBuilder()
94+
.setParameterTypes(
95+
ImmutableList.of(
96+
SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.INT))
97+
.setOverloadId("overload_id")
98+
.setIsInstanceFunction(true)
99+
.setResultType(SimpleType.DYN)
100+
.build();
101+
102+
assertThat(overloadDecl.parameterTypes())
103+
.containsExactly(SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.INT)
104+
.inOrder();
105+
}
88106
}

common/src/main/java/dev/cel/common/CelOverloadDecl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public abstract static class Builder {
9393
* Sets the parameter types {@link #parameterTypes()}. Note that this will override any
9494
* parameter types added via the accumulator methods {@link #addParameterTypes}.
9595
*/
96-
public abstract Builder setParameterTypes(ImmutableSet<CelType> value);
96+
public abstract Builder setParameterTypes(ImmutableList<CelType> value);
9797

9898
public abstract CelType resultType();
9999

0 commit comments

Comments
 (0)