@@ -237,15 +237,22 @@ private CelExpr visit(CelExpr expr, CelExpr.CelIdent ident) {
237237 if (decl .equals (Env .ERROR_IDENT_DECL )) {
238238 // error reported
239239 env .setType (expr , SimpleType .ERROR );
240- env .setRef (expr , makeReference (decl ));
240+ env .setRef (expr , makeReference (decl . name (), decl ));
241241 return expr ;
242242 }
243- if (!decl .name ().equals (ident .name ())) {
243+
244+ // Preserve leading dot to signal runtime to bypass local scopes.
245+ String refName = decl .name ();
246+ if (ident .name ().startsWith ("." )) {
247+ refName = "." + refName ;
248+ }
249+
250+ if (!refName .equals (ident .name ())) {
244251 // Overwrite the identifier with its fully qualified name.
245- expr = replaceIdentSubtree (expr , decl . name () );
252+ expr = replaceIdentSubtree (expr , refName );
246253 }
247254 env .setType (expr , decl .type ());
248- env .setRef (expr , makeReference (decl ));
255+ env .setRef (expr , makeReference (refName , decl ));
249256 return expr ;
250257 }
251258
@@ -260,13 +267,19 @@ private CelExpr visit(CelExpr expr, CelExpr.CelSelect select) {
260267 env .reportError (expr .id (), getPosition (expr ), "expression does not select a field" );
261268 env .setType (expr , SimpleType .BOOL );
262269 } else {
270+ // Preserve leading dot to signal runtime to bypass local scopes.
271+ String refName = decl .name ();
272+ if (qname .startsWith ("." )) {
273+ refName = "." + refName ;
274+ }
275+
263276 if (namespacedDeclarations ) {
264277 // Rewrite the node to be a variable reference to the resolved fully-qualified
265278 // variable name.
266- expr = replaceIdentSubtree (expr , decl . name () );
279+ expr = replaceIdentSubtree (expr , refName );
267280 }
268281 env .setType (expr , decl .type ());
269- env .setRef (expr , makeReference (decl ));
282+ env .setRef (expr , makeReference (refName , decl ));
270283 }
271284 return expr ;
272285 }
@@ -595,8 +608,8 @@ private CelExpr visit(CelExpr expr, CelExpr.CelComprehension compre) {
595608 return expr ;
596609 }
597610
598- private CelReference makeReference (CelIdentDecl decl ) {
599- CelReference .Builder ref = CelReference .newBuilder ().setName (decl . name () );
611+ private CelReference makeReference (String name , CelIdentDecl decl ) {
612+ CelReference .Builder ref = CelReference .newBuilder ().setName (name );
600613 if (decl .constant ().isPresent ()) {
601614 ref .setValue (decl .constant ().get ());
602615 }
0 commit comments