@@ -240,12 +240,24 @@ private CelExpr visit(CelExpr expr, CelExpr.CelIdent ident) {
240240 env .setRef (expr , makeReference (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+ // Build reference with the (potentially prefixed) name, preserving constant value if present.
256+ CelReference .Builder refBuilder = CelReference .newBuilder ().setName (refName );
257+ if (decl .constant ().isPresent ()) {
258+ refBuilder .setValue (decl .constant ().get ());
259+ }
260+ env .setRef (expr , refBuilder .build ());
249261 return expr ;
250262 }
251263
@@ -260,13 +272,24 @@ private CelExpr visit(CelExpr expr, CelExpr.CelSelect select) {
260272 env .reportError (expr .id (), getPosition (expr ), "expression does not select a field" );
261273 env .setType (expr , SimpleType .BOOL );
262274 } else {
275+ // Preserve leading dot to signal runtime to bypass local scopes.
276+ String refName = decl .name ();
277+ if (qname .startsWith ("." )) {
278+ refName = "." + refName ;
279+ }
280+
263281 if (namespacedDeclarations ) {
264282 // Rewrite the node to be a variable reference to the resolved fully-qualified
265283 // variable name.
266- expr = replaceIdentSubtree (expr , decl . name () );
284+ expr = replaceIdentSubtree (expr , refName );
267285 }
268286 env .setType (expr , decl .type ());
269- env .setRef (expr , makeReference (decl ));
287+ // Build reference with the (potentially prefixed) name, preserving constant value.
288+ CelReference .Builder refBuilder = CelReference .newBuilder ().setName (refName );
289+ if (decl .constant ().isPresent ()) {
290+ refBuilder .setValue (decl .constant ().get ());
291+ }
292+ env .setRef (expr , refBuilder .build ());
270293 }
271294 return expr ;
272295 }
0 commit comments