@@ -9,10 +9,29 @@ pub fn rename_type_references(
9
9
new_name : String ,
10
10
result : & mut HashMap < Uri , HashMap < lsp_types:: Range , String > > ,
11
11
) -> Option < ( ) > {
12
- let type_decl = semantic_model
13
- . get_db ( )
14
- . get_type_index ( )
15
- . get_type_decl ( & type_decl_id) ?;
12
+ let type_index = semantic_model. get_db ( ) . get_type_index ( ) ;
13
+ let type_decl = type_index. get_type_decl ( & type_decl_id) ?;
14
+ let full_name = type_decl. get_full_name ( ) ;
15
+ let mut reserved_namespace = String :: new ( ) ;
16
+
17
+ // 取出`full_name`在当前文件中使用的命名空间
18
+ if let Some ( file_namespace) = type_index. get_file_namespace ( & semantic_model. get_file_id ( ) ) {
19
+ if full_name. starts_with ( & format ! ( "{}." , file_namespace) ) {
20
+ reserved_namespace = file_namespace. clone ( ) ;
21
+ }
22
+ }
23
+ if reserved_namespace. is_empty ( ) {
24
+ if let Some ( using_namespaces) =
25
+ type_index. get_file_using_namespace ( & semantic_model. get_file_id ( ) )
26
+ {
27
+ for using_namespace in using_namespaces {
28
+ if full_name. starts_with ( & format ! ( "{}." , using_namespace) ) {
29
+ reserved_namespace = using_namespace. clone ( ) ;
30
+ break ;
31
+ }
32
+ }
33
+ }
34
+ }
16
35
17
36
let locations = type_decl. get_locations ( ) ;
18
37
for decl_location in locations {
@@ -39,12 +58,54 @@ pub fn rename_type_references(
39
58
document_cache. insert ( in_filed_reference_range. file_id , document) ;
40
59
document_cache. get ( & in_filed_reference_range. file_id ) ?
41
60
} ;
61
+
62
+ // 根据引用文件的命名空间上下文决定使用简名还是全名
63
+ let actual_new_name = determine_type_name_for_file (
64
+ semantic_model,
65
+ in_filed_reference_range. file_id ,
66
+ & reserved_namespace,
67
+ & new_name,
68
+ ) ;
69
+
42
70
let location = document. to_lsp_location ( in_filed_reference_range. value ) ?;
43
71
result
44
72
. entry ( location. uri )
45
73
. or_insert_with ( HashMap :: new)
46
- . insert ( location. range , new_name . clone ( ) ) ;
74
+ . insert ( location. range , actual_new_name ) ;
47
75
}
48
76
49
77
Some ( ( ) )
50
78
}
79
+
80
+ /// 根据引用文件的命名空间上下文决定使用简名还是全名
81
+ fn determine_type_name_for_file (
82
+ semantic_model : & SemanticModel ,
83
+ reference_file_id : emmylua_code_analysis:: FileId ,
84
+ reserved_namespace : & str ,
85
+ new_simple_name : & str ,
86
+ ) -> String {
87
+ let type_index = semantic_model. get_db ( ) . get_type_index ( ) ;
88
+
89
+ // 检查引用文件是否声明了相同的命名空间
90
+ if let Some ( file_namespace) = type_index. get_file_namespace ( & reference_file_id) {
91
+ if reserved_namespace. starts_with ( & format ! ( "{}." , file_namespace) ) {
92
+ return new_simple_name. to_string ( ) ;
93
+ }
94
+ }
95
+
96
+ // 检查引用文件是否使用了相应的命名空间
97
+ if let Some ( using_namespaces) = type_index. get_file_using_namespace ( & reference_file_id) {
98
+ for using_namespace in using_namespaces {
99
+ if reserved_namespace. starts_with ( & format ! ( "{}." , using_namespace) ) {
100
+ return new_simple_name. to_string ( ) ;
101
+ }
102
+ }
103
+ }
104
+
105
+ // `reserved_namespace`不为空,则使用保留的命名空间与新名称组合
106
+ if !reserved_namespace. is_empty ( ) {
107
+ return format ! ( "{}.{}" , reserved_namespace, new_simple_name) ;
108
+ }
109
+
110
+ new_simple_name. to_string ( )
111
+ }
0 commit comments