@@ -26,11 +26,39 @@ impl ProtoLanguageState {
2626 let package = tree. get_package_name ( content. as_ref ( ) ) . unwrap_or ( "." ) ;
2727 let mut old = identifier. to_string ( ) ;
2828 let mut new = new_text. to_string ( ) ;
29- if current_package != package {
30- old = format ! ( "{current_package}.{old}" ) ;
31- new = format ! ( "{current_package}.{new}" ) ;
29+ let mut v = vec ! [ ] ;
30+
31+ // Global scope: Reference by only . or within global directly
32+ if current_package == "." {
33+ if package == "." {
34+ v. extend ( tree. rename_field ( & old, & new, content. as_str ( ) ) ) ;
35+ }
36+
37+ old = format ! ( ".{old}" ) ;
38+ new = format ! ( ".{new}" ) ;
39+
40+ v. extend ( tree. rename_field ( & old, & new, content. as_str ( ) ) ) ;
41+
42+ if !v. is_empty ( ) {
43+ h. insert ( tree. uri . clone ( ) , v) ;
44+ }
45+ return h;
3246 }
33- let v = tree. rename_field ( & old, & new, content. as_str ( ) ) ;
47+
48+ let full_old = format ! ( "{current_package}.{old}" ) ;
49+ let full_new = format ! ( "{current_package}.{new}" ) ;
50+ let global_full_old = format ! ( ".{current_package}.{old}" ) ;
51+ let global_full_new = format ! ( ".{current_package}.{new}" ) ;
52+
53+ // Current package: Reference by full or relative name or directly
54+ if current_package == package {
55+ v. extend ( tree. rename_field ( & old, & new, content. as_str ( ) ) ) ;
56+ }
57+
58+ // Otherwise, full reference
59+ v. extend ( tree. rename_field ( & full_old, & full_new, content. as_str ( ) ) ) ;
60+ v. extend ( tree. rename_field ( & global_full_old, & global_full_new, content. as_str ( ) ) ) ;
61+
3462 if !v. is_empty ( ) {
3563 h. insert ( tree. uri . clone ( ) , v) ;
3664 }
@@ -54,10 +82,29 @@ impl ProtoLanguageState {
5482 let content = self . get_content ( & tree. uri ) ;
5583 let package = tree. get_package_name ( content. as_ref ( ) ) . unwrap_or ( "." ) ;
5684 let mut old = identifier. to_owned ( ) ;
57- if current_package != package {
58- old = format ! ( "{current_package}.{old}" ) ;
85+ // Global scope: Reference by only . or within global directly
86+ if current_package == "." {
87+ if package == "." {
88+ v. extend ( tree. reference_field ( & old, content. as_str ( ) ) ) ;
89+ }
90+
91+ old = format ! ( ".{old}" ) ;
92+ v. extend ( tree. reference_field ( & old, content. as_str ( ) ) ) ;
93+
94+ return v;
5995 }
60- v. extend ( tree. reference_field ( & old, content. as_str ( ) ) ) ;
96+
97+ let full_old = format ! ( "{current_package}.{old}" ) ;
98+ let global_full_old = format ! ( ".{current_package}.{old}" ) ;
99+
100+ // Current package: Reference by full or relative name or directly
101+ if current_package == package {
102+ v. extend ( tree. reference_field ( & old, content. as_str ( ) ) ) ;
103+ }
104+
105+ // Otherwise, full reference
106+ v. extend ( tree. reference_field ( & full_old, content. as_str ( ) ) ) ;
107+ v. extend ( tree. reference_field ( & global_full_old, content. as_str ( ) ) ) ;
61108 v
62109 } ) ;
63110 if r. is_empty ( ) { None } else { Some ( r) }
0 commit comments