Skip to content

Commit b674946

Browse files
maskri17copybara-github
authored andcommitted
Checker and parser changes to support comprehensionsV2
PiperOrigin-RevId: 788649636
1 parent 99508b0 commit b674946

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

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/CelExprFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public final CelExpr.CelStruct.Entry newMessageField(String field, CelExpr value
143143
.build();
144144
}
145145

146-
/** Fold creates a fold comprehension instruction. */
146+
/** Fold creates a fold for one variable comprehension instruction. */
147147
public final CelExpr fold(
148148
String iterVar,
149149
CelExpr iterRange,

parser/src/main/java/dev/cel/parser/CelMacroExprFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ public final CelExpr copy(CelExpr expr) {
133133
builder.setComprehension(
134134
CelExpr.CelComprehension.newBuilder()
135135
.setIterVar(expr.comprehension().iterVar())
136+
.setIterVar2(expr.comprehension().iterVar2())
136137
.setIterRange(copy(expr.comprehension().iterRange()))
137138
.setAccuVar(expr.comprehension().accuVar())
138139
.setAccuInit(copy(expr.comprehension().accuInit()))

0 commit comments

Comments
 (0)