Skip to content

Commit a12d457

Browse files
maskri17copybara-github
authored andcommitted
AST and checker changes to support comprehensionsV2
PiperOrigin-RevId: 786471983
1 parent 712b265 commit a12d457

15 files changed

Lines changed: 194 additions & 622 deletions

File tree

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.auto.value.AutoValue;
2323
import com.google.common.base.Joiner;
2424
import com.google.common.base.Optional;
25+
import com.google.common.base.Strings;
2526
import com.google.common.collect.ImmutableList;
2627
import com.google.common.collect.Maps;
2728
import com.google.errorprone.annotations.CheckReturnValue;
@@ -510,13 +511,21 @@ private CelExpr visit(CelExpr expr, CelExpr.CelComprehension compre) {
510511
CelType accuType = env.getType(visitedInit);
511512
CelType rangeType = inferenceContext.specialize(env.getType(visitedRange));
512513
CelType varType;
514+
CelType varType2 = null;
513515
switch (rangeType.kind()) {
514516
case LIST:
515517
varType = ((ListType) rangeType).elemType();
518+
if (!Strings.isNullOrEmpty(compre.iterVar2())) {
519+
varType2 = varType;
520+
varType = SimpleType.INT;
521+
}
516522
break;
517523
case MAP:
518524
// Ranges over the keys.
519525
varType = ((MapType) rangeType).keyType();
526+
if (!Strings.isNullOrEmpty(compre.iterVar2())) {
527+
varType2 = ((MapType) rangeType).valueType();
528+
}
520529
break;
521530
case DYN:
522531
case ERROR:
@@ -547,6 +556,9 @@ private CelExpr visit(CelExpr expr, CelExpr.CelComprehension compre) {
547556
// Declare iteration variable on inner scope.
548557
env.enterScope();
549558
env.add(CelIdentDecl.newIdentDeclaration(compre.iterVar(), varType));
559+
if (!Strings.isNullOrEmpty(compre.iterVar2())) {
560+
env.add(CelIdentDecl.newIdentDeclaration(compre.iterVar2(), varType2));
561+
}
550562
CelExpr condition = visit(compre.loopCondition());
551563
assertType(condition, SimpleType.BOOL);
552564
CelExpr visitedStep = visit(compre.loopStep());

common/src/main/java/dev/cel/common/ast/BUILD.bazel

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ java_library(
5252
"@maven//:com_google_errorprone_error_prone_annotations",
5353
"@maven//:com_google_guava_guava",
5454
"@maven//:com_google_protobuf_protobuf_java",
55-
"@maven//:org_jspecify_jspecify",
5655
"@maven_android//:com_google_protobuf_protobuf_javalite",
5756
],
5857
)
@@ -139,7 +138,6 @@ cel_android_library(
139138
"//:auto_value",
140139
"//common/annotations",
141140
"@maven//:com_google_errorprone_error_prone_annotations",
142-
"@maven//:org_jspecify_jspecify",
143141
"@maven_android//:com_google_guava_guava",
144142
"@maven_android//:com_google_protobuf_protobuf_javalite",
145143
],

common/src/main/java/dev/cel/common/ast/CelExpr.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2424
import com.google.errorprone.annotations.CheckReturnValue;
2525
import com.google.errorprone.annotations.Immutable;
26-
import dev.cel.common.ast.CelExpr.ExprKind.Kind;
2726
import java.util.ArrayList;
2827
import java.util.Arrays;
2928
import java.util.Optional;
@@ -902,6 +901,9 @@ public abstract static class CelComprehension implements Expression.Comprehensio
902901
@Override
903902
public abstract String iterVar();
904903

904+
@Override
905+
public abstract String iterVar2();
906+
905907
@Override
906908
public abstract CelExpr iterRange();
907909

@@ -937,6 +939,8 @@ public abstract static class Builder {
937939

938940
public abstract Builder setIterVar(String value);
939941

942+
public abstract Builder setIterVar2(String value);
943+
940944
public abstract Builder setIterRange(CelExpr value);
941945

942946
public abstract Builder setAccuVar(String value);
@@ -958,6 +962,7 @@ public abstract static class Builder {
958962
public static Builder newBuilder() {
959963
return new AutoValue_CelExpr_CelComprehension.Builder()
960964
.setIterVar("")
965+
.setIterVar2("")
961966
.setIterRange(CelExpr.newBuilder().build())
962967
.setAccuVar("")
963968
.setAccuInit(CelExpr.newBuilder().build())
@@ -1073,12 +1078,28 @@ public static CelExpr ofComprehension(
10731078
CelExpr loopCondition,
10741079
CelExpr loopStep,
10751080
CelExpr result) {
1081+
return ofComprehension(
1082+
id, iterVar, "", iterRange, accuVar, accuInit, loopCondition, loopStep, result);
1083+
}
1084+
1085+
@SuppressWarnings("TooManyParameters")
1086+
public static CelExpr ofComprehension(
1087+
long id,
1088+
String iterVar,
1089+
String iterVar2,
1090+
CelExpr iterRange,
1091+
String accuVar,
1092+
CelExpr accuInit,
1093+
CelExpr loopCondition,
1094+
CelExpr loopStep,
1095+
CelExpr result) {
10761096
return newBuilder()
10771097
.setId(id)
10781098
.setExprKind(
10791099
AutoOneOf_CelExpr_ExprKind.comprehension(
10801100
CelComprehension.newBuilder()
10811101
.setIterVar(iterVar)
1102+
.setIterVar2(iterVar2)
10821103
.setIterRange(iterRange)
10831104
.setAccuVar(accuVar)
10841105
.setAccuInit(accuInit)

common/src/main/java/dev/cel/common/ast/CelExprConverter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ public static Expr fromCelExpr(CelExpr celExpr) {
8484
return expr.setComprehensionExpr(
8585
Comprehension.newBuilder()
8686
.setIterVar(celComprehension.iterVar())
87+
.setIterVar2(celComprehension.iterVar2())
8788
.setIterRange(fromCelExpr(celComprehension.iterRange()))
8889
.setAccuVar(celComprehension.accuVar())
8990
.setAccuInit(fromCelExpr(celComprehension.accuInit()))
@@ -132,6 +133,7 @@ public static CelExpr fromExpr(Expr expr) {
132133
return CelExpr.ofComprehension(
133134
expr.getId(),
134135
comprehensionExpr.getIterVar(),
136+
comprehensionExpr.getIterVar2(),
135137
fromExpr(comprehensionExpr.getIterRange()),
136138
comprehensionExpr.getAccuVar(),
137139
fromExpr(comprehensionExpr.getAccuInit()),

0 commit comments

Comments
 (0)