Skip to content

Commit 0800ca4

Browse files
l46kokcopybara-github
authored andcommitted
Override environment's expected result type during constant folding
PiperOrigin-RevId: 807744200
1 parent 45d550b commit 0800ca4

File tree

3 files changed

+20
-1
lines changed

3 files changed

+20
-1
lines changed

optimizer/src/main/java/dev/cel/optimizer/optimizers/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ java_library(
2626
"//common/ast",
2727
"//common/ast:mutable_expr",
2828
"//common/navigation:mutable_navigation",
29+
"//common/types",
2930
"//extensions:optional_library",
3031
"//optimizer:ast_optimizer",
3132
"//optimizer:mutable_ast",

optimizer/src/main/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import dev.cel.common.ast.CelMutableExprConverter;
3939
import dev.cel.common.navigation.CelNavigableMutableAst;
4040
import dev.cel.common.navigation.CelNavigableMutableExpr;
41+
import dev.cel.common.types.SimpleType;
4142
import dev.cel.extensions.CelOptionalLibrary.Function;
4243
import dev.cel.optimizer.AstMutator;
4344
import dev.cel.optimizer.CelAstOptimizer;
@@ -88,6 +89,9 @@ private static CelMutableExpr newOptionalNoneExpr() {
8889
@Override
8990
public OptimizationResult optimize(CelAbstractSyntaxTree ast, Cel cel)
9091
throws CelOptimizationException {
92+
// Override the environment's expected type to generally allow all subtrees to be folded.
93+
Cel optimizerEnv = cel.toCelBuilder().setResultType(SimpleType.DYN).build();
94+
9195
CelMutableAst mutableAst = CelMutableAst.fromCelAst(ast);
9296
int iterCount = 0;
9397
boolean continueFolding = true;
@@ -112,7 +116,7 @@ public OptimizationResult optimize(CelAbstractSyntaxTree ast, Cel cel)
112116
mutatedResult = maybePruneBranches(mutableAst, foldableExpr.expr());
113117
if (!mutatedResult.isPresent()) {
114118
// Evaluate the call then fold
115-
mutatedResult = maybeFold(cel, mutableAst, foldableExpr);
119+
mutatedResult = maybeFold(optimizerEnv, mutableAst, foldableExpr);
116120
}
117121

118122
if (!mutatedResult.isPresent()) {

optimizer/src/test/java/dev/cel/optimizer/optimizers/ConstantFoldingOptimizerTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,20 @@ public void constantFold_addFoldableFunction_success() throws Exception {
347347
assertThat(CEL_UNPARSER.unparse(optimizedAst)).isEqualTo("true");
348348
}
349349

350+
@Test
351+
public void constantFold_withExpectedResultTypeSet_success() throws Exception {
352+
Cel cel = CelFactory.standardCelBuilder().setResultType(SimpleType.STRING).build();
353+
CelOptimizer optimizer =
354+
CelOptimizerFactory.standardCelOptimizerBuilder(cel)
355+
.addAstOptimizers(ConstantFoldingOptimizer.getInstance())
356+
.build();
357+
CelAbstractSyntaxTree ast = cel.compile("string(!true)").getAst();
358+
359+
CelAbstractSyntaxTree optimizedAst = optimizer.optimize(ast);
360+
361+
assertThat(CEL_UNPARSER.unparse(optimizedAst)).isEqualTo("\"false\"");
362+
}
363+
350364
@Test
351365
public void constantFold_withMacroCallPopulated_comprehensionsAreReplacedWithNotSet()
352366
throws Exception {

0 commit comments

Comments
 (0)