Skip to content

Commit 61d0334

Browse files
jckingcopybara-github
authored andcommitted
Update type checker to handle iter_var2
PiperOrigin-RevId: 693058259
1 parent e6aa211 commit 61d0334

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

checker/internal/type_checker_impl.cc

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -807,13 +807,17 @@ void ResolveVisitor::PostVisitComprehensionSubexpression(
807807
break;
808808
case ComprehensionArg::ITER_RANGE: {
809809
Type range_type = GetTypeOrDyn(&comprehension.iter_range());
810-
Type iter_type = DynType();
810+
Type iter_type = DynType(); // iter_var for non comprehensions v2.
811+
Type iter_type1 = DynType(); // iter_var for comprehensions v2.
812+
Type iter_type2 = DynType(); // iter_var2 for comprehensions v2.
811813
switch (range_type.kind()) {
812814
case TypeKind::kList:
813-
iter_type = range_type.GetList().element();
815+
iter_type1 = IntType();
816+
iter_type = iter_type2 = range_type.GetList().element();
814817
break;
815818
case TypeKind::kMap:
816-
iter_type = range_type.GetMap().key();
819+
iter_type = iter_type1 = range_type.GetMap().key();
820+
iter_type2 = range_type.GetMap().value();
817821
break;
818822
case TypeKind::kDyn:
819823
break;
@@ -827,8 +831,15 @@ void ResolveVisitor::PostVisitComprehensionSubexpression(
827831
"list, map, or dynamic)")));
828832
break;
829833
}
830-
scope.iter_scope->InsertVariableIfAbsent(
831-
MakeVariableDecl(comprehension.iter_var(), iter_type));
834+
if (comprehension.iter_var2().empty()) {
835+
scope.iter_scope->InsertVariableIfAbsent(
836+
MakeVariableDecl(comprehension.iter_var(), iter_type));
837+
} else {
838+
scope.iter_scope->InsertVariableIfAbsent(
839+
MakeVariableDecl(comprehension.iter_var(), iter_type1));
840+
scope.iter_scope->InsertVariableIfAbsent(
841+
MakeVariableDecl(comprehension.iter_var2(), iter_type2));
842+
}
832843
break;
833844
}
834845
case ComprehensionArg::RESULT:

checker/standard_library.cc

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,17 @@ absl::Status AddEnumConstants(TypeCheckerBuilder& builder) {
10581058
return absl::OkStatus();
10591059
}
10601060

1061+
absl::Status AddComprehensionsV2Functions(TypeCheckerBuilder& builder) {
1062+
FunctionDecl map_insert;
1063+
map_insert.set_name("@cel.mapInsert");
1064+
CEL_RETURN_IF_ERROR(map_insert.AddOverload(
1065+
MakeOverloadDecl("@mapInsert_map_key_value", MapOfAB(), MapOfAB(),
1066+
TypeParamA(), TypeParamB())));
1067+
CEL_RETURN_IF_ERROR(map_insert.AddOverload(
1068+
MakeOverloadDecl("@mapInsert_map_map", MapOfAB(), MapOfAB(), MapOfAB())));
1069+
return builder.AddFunction(map_insert);
1070+
}
1071+
10611072
absl::Status AddStandardLibraryDecls(TypeCheckerBuilder& builder) {
10621073
CEL_RETURN_IF_ERROR(AddLogicalOps(builder));
10631074
CEL_RETURN_IF_ERROR(AddArithmeticOps(builder));
@@ -1070,7 +1081,7 @@ absl::Status AddStandardLibraryDecls(TypeCheckerBuilder& builder) {
10701081
CEL_RETURN_IF_ERROR(AddTimeFunctions(builder));
10711082
CEL_RETURN_IF_ERROR(AddTypeConstantVariables(builder));
10721083
CEL_RETURN_IF_ERROR(AddEnumConstants(builder));
1073-
1084+
CEL_RETURN_IF_ERROR(AddComprehensionsV2Functions(builder));
10741085
return absl::OkStatus();
10751086
}
10761087

0 commit comments

Comments
 (0)