@@ -237,15 +237,18 @@ 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+ String refName = maybeDisambiguate (ident .name (), decl .name ());
245+
246+ if (!refName .equals (ident .name ())) {
244247 // Overwrite the identifier with its fully qualified name.
245- expr = replaceIdentSubtree (expr , decl . name () );
248+ expr = replaceIdentSubtree (expr , refName );
246249 }
247250 env .setType (expr , decl .type ());
248- env .setRef (expr , makeReference (decl ));
251+ env .setRef (expr , makeReference (refName , decl ));
249252 return expr ;
250253 }
251254
@@ -260,13 +263,15 @@ private CelExpr visit(CelExpr expr, CelExpr.CelSelect select) {
260263 env .reportError (expr .id (), getPosition (expr ), "expression does not select a field" );
261264 env .setType (expr , SimpleType .BOOL );
262265 } else {
266+ String refName = maybeDisambiguate (qname , decl .name ());
267+
263268 if (namespacedDeclarations ) {
264269 // Rewrite the node to be a variable reference to the resolved fully-qualified
265270 // variable name.
266- expr = replaceIdentSubtree (expr , decl . name () );
271+ expr = replaceIdentSubtree (expr , refName );
267272 }
268273 env .setType (expr , decl .type ());
269- env .setRef (expr , makeReference (decl ));
274+ env .setRef (expr , makeReference (refName , decl ));
270275 }
271276 return expr ;
272277 }
@@ -595,14 +600,32 @@ private CelExpr visit(CelExpr expr, CelExpr.CelComprehension compre) {
595600 return expr ;
596601 }
597602
598- private CelReference makeReference (CelIdentDecl decl ) {
599- CelReference .Builder ref = CelReference .newBuilder ().setName (decl . name () );
603+ private CelReference makeReference (String name , CelIdentDecl decl ) {
604+ CelReference .Builder ref = CelReference .newBuilder ().setName (name );
600605 if (decl .constant ().isPresent ()) {
601606 ref .setValue (decl .constant ().get ());
602607 }
603608 return ref .build ();
604609 }
605610
611+ /**
612+ * Returns the reference name, prefixed with a leading dot only if disambiguation is needed.
613+ * Disambiguation is needed when: the original name had a leading dot, and there's a local
614+ * variable that would shadow the resolved name.
615+ */
616+ private String maybeDisambiguate (String originalName , String resolvedName ) {
617+ if (!originalName .startsWith ("." )) {
618+ return resolvedName ;
619+ }
620+ String simpleName = originalName .substring (1 );
621+ int dotIndex = simpleName .indexOf ('.' );
622+ String localName = dotIndex > 0 ? simpleName .substring (0 , dotIndex ) : simpleName ;
623+ if (env .tryLookupCelIdentFromLocalScopes (localName ) != null ) {
624+ return "." + resolvedName ;
625+ }
626+ return resolvedName ;
627+ }
628+
606629 private OverloadResolution resolveOverload (
607630 long callExprId ,
608631 int position ,
0 commit comments