@@ -297,6 +297,7 @@ static CelExtensionLibrary<CelOptionalLibrary> library() {
297297 public static final CelOptionalLibrary INSTANCE = CelOptionalLibrary .library ().latest ();
298298
299299 private static final String UNUSED_ITER_VAR = "#unused" ;
300+ private static final String OPTIONAL_MAP_VAR = "@target" ;
300301
301302 private final int version ;
302303 private final ImmutableSet <CelFunctionDecl > functions ;
@@ -524,21 +525,51 @@ private static Optional<CelExpr> expandOptMap(
524525 CelExpr mapExpr = checkNotNull (arguments .get (1 ));
525526 String varName = varIdent .ident ().name ();
526527
527- return Optional .of (
528+ if (target .exprKind ().getKind () == CelExpr .ExprKind .Kind .IDENT ) {
529+ return Optional .of (
530+ exprFactory .newGlobalCall (
531+ Operator .CONDITIONAL .getFunction (),
532+ exprFactory .newReceiverCall (HAS_VALUE .getFunction (), target ),
533+ exprFactory .newGlobalCall (
534+ OPTIONAL_OF .getFunction (),
535+ exprFactory .fold (
536+ UNUSED_ITER_VAR ,
537+ exprFactory .newList (),
538+ varName ,
539+ exprFactory .newReceiverCall (VALUE .getFunction (), exprFactory .copy (target )),
540+ exprFactory .newBoolLiteral (true ),
541+ exprFactory .newIdentifier (varName ),
542+ mapExpr )),
543+ exprFactory .newGlobalCall (OPTIONAL_NONE .getFunction ())));
544+ }
545+
546+ CelExpr localVar = exprFactory .newIdentifier (OPTIONAL_MAP_VAR );
547+ CelExpr localVarCopy = exprFactory .copy (localVar );
548+ CelExpr conditionalExpr =
528549 exprFactory .newGlobalCall (
529550 Operator .CONDITIONAL .getFunction (),
530- exprFactory .newReceiverCall (HAS_VALUE .getFunction (), target ),
551+ exprFactory .newReceiverCall (HAS_VALUE .getFunction (), localVar ),
531552 exprFactory .newGlobalCall (
532553 OPTIONAL_OF .getFunction (),
533554 exprFactory .fold (
534555 UNUSED_ITER_VAR ,
535556 exprFactory .newList (),
536557 varName ,
537- exprFactory .newReceiverCall (VALUE .getFunction (), exprFactory . copy ( target ) ),
558+ exprFactory .newReceiverCall (VALUE .getFunction (), localVarCopy ),
538559 exprFactory .newBoolLiteral (true ),
539560 exprFactory .newIdentifier (varName ),
540561 mapExpr )),
541- exprFactory .newGlobalCall (OPTIONAL_NONE .getFunction ())));
562+ exprFactory .newGlobalCall (OPTIONAL_NONE .getFunction ()));
563+
564+ return Optional .of (
565+ exprFactory .fold (
566+ UNUSED_ITER_VAR ,
567+ exprFactory .newList (),
568+ OPTIONAL_MAP_VAR ,
569+ target ,
570+ exprFactory .newBoolLiteral (false ),
571+ exprFactory .newIdentifier (OPTIONAL_MAP_VAR ),
572+ conditionalExpr ));
542573 }
543574
544575 private static Optional <CelExpr > expandOptFlatMap (
@@ -558,19 +589,47 @@ private static Optional<CelExpr> expandOptFlatMap(
558589 CelExpr mapExpr = checkNotNull (arguments .get (1 ));
559590 String varName = varIdent .ident ().name ();
560591
561- return Optional .of (
592+ if (target .exprKind ().getKind () == CelExpr .ExprKind .Kind .IDENT ) {
593+ return Optional .of (
594+ exprFactory .newGlobalCall (
595+ Operator .CONDITIONAL .getFunction (),
596+ exprFactory .newReceiverCall (HAS_VALUE .getFunction (), target ),
597+ exprFactory .fold (
598+ UNUSED_ITER_VAR ,
599+ exprFactory .newList (),
600+ varName ,
601+ exprFactory .newReceiverCall (VALUE .getFunction (), exprFactory .copy (target )),
602+ exprFactory .newBoolLiteral (true ),
603+ exprFactory .newIdentifier (varName ),
604+ mapExpr ),
605+ exprFactory .newGlobalCall (OPTIONAL_NONE .getFunction ())));
606+ }
607+
608+ CelExpr localVar = exprFactory .newIdentifier (OPTIONAL_MAP_VAR );
609+ CelExpr localVarCopy = exprFactory .copy (localVar );
610+ CelExpr conditionalExpr =
562611 exprFactory .newGlobalCall (
563612 Operator .CONDITIONAL .getFunction (),
564- exprFactory .newReceiverCall (HAS_VALUE .getFunction (), target ),
613+ exprFactory .newReceiverCall (HAS_VALUE .getFunction (), localVar ),
565614 exprFactory .fold (
566615 UNUSED_ITER_VAR ,
567616 exprFactory .newList (),
568617 varName ,
569- exprFactory .newReceiverCall (VALUE .getFunction (), exprFactory . copy ( target ) ),
618+ exprFactory .newReceiverCall (VALUE .getFunction (), localVarCopy ),
570619 exprFactory .newBoolLiteral (true ),
571620 exprFactory .newIdentifier (varName ),
572621 mapExpr ),
573- exprFactory .newGlobalCall (OPTIONAL_NONE .getFunction ())));
622+ exprFactory .newGlobalCall (OPTIONAL_NONE .getFunction ()));
623+
624+ return Optional .of (
625+ exprFactory .fold (
626+ UNUSED_ITER_VAR ,
627+ exprFactory .newList (),
628+ OPTIONAL_MAP_VAR ,
629+ target ,
630+ exprFactory .newBoolLiteral (false ),
631+ exprFactory .newIdentifier (OPTIONAL_MAP_VAR ),
632+ conditionalExpr ));
574633 }
575634
576635 private static Object indexOptionalMap (
0 commit comments