@@ -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,24 @@ 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+ // Build reference with the (potentially prefixed) name, preserving constant value.
283+ CelReference .Builder refBuilder = CelReference .newBuilder ().setName (refName );
284+ if (decl .constant ().isPresent ()) {
285+ refBuilder .setValue (decl .constant ().get ());
286+ }
287+ env .setRef (expr , refBuilder .build ());
270288 }
271289 return expr ;
272290 }
@@ -595,8 +613,8 @@ private CelExpr visit(CelExpr expr, CelExpr.CelComprehension compre) {
595613 return expr ;
596614 }
597615
598- private CelReference makeReference (CelIdentDecl decl ) {
599- CelReference .Builder ref = CelReference .newBuilder ().setName (decl . name () );
616+ private CelReference makeReference (String name , CelIdentDecl decl ) {
617+ CelReference .Builder ref = CelReference .newBuilder ().setName (name );
600618 if (decl .constant ().isPresent ()) {
601619 ref .setValue (decl .constant ().get ());
602620 }
0 commit comments