@@ -94,12 +94,16 @@ pub(crate) fn find_all_refs(
94
94
let sema = Semantics :: new ( db) ;
95
95
let syntax = sema. parse ( position. file_id ) . syntax ( ) . clone ( ) ;
96
96
97
- let ( opt_name, search_kind) =
98
- if let Some ( name) = get_struct_def_name_for_struct_literal_search ( & syntax, position) {
99
- ( Some ( name) , ReferenceKind :: StructLiteral )
100
- } else {
101
- ( find_node_at_offset :: < ast:: Name > ( & syntax, position. offset ) , ReferenceKind :: Other )
102
- } ;
97
+ let ( opt_name, search_kind) = if let Some ( name) =
98
+ get_struct_def_name_for_struct_literal_search ( & sema, & syntax, position)
99
+ {
100
+ ( Some ( name) , ReferenceKind :: StructLiteral )
101
+ } else {
102
+ (
103
+ sema. find_node_at_offset_with_descend :: < ast:: Name > ( & syntax, position. offset ) ,
104
+ ReferenceKind :: Other ,
105
+ )
106
+ } ;
103
107
104
108
let RangeInfo { range, info : def } = find_name ( & sema, & syntax, position, opt_name) ?;
105
109
@@ -131,7 +135,8 @@ fn find_name(
131
135
let range = name. syntax ( ) . text_range ( ) ;
132
136
return Some ( RangeInfo :: new ( range, def) ) ;
133
137
}
134
- let name_ref = find_node_at_offset :: < ast:: NameRef > ( & syntax, position. offset ) ?;
138
+ let name_ref =
139
+ sema. find_node_at_offset_with_descend :: < ast:: NameRef > ( & syntax, position. offset ) ?;
135
140
let def = classify_name_ref ( sema, & name_ref) ?. definition ( ) ;
136
141
let range = name_ref. syntax ( ) . text_range ( ) ;
137
142
Some ( RangeInfo :: new ( range, def) )
@@ -157,17 +162,26 @@ fn decl_access(def: &Definition, syntax: &SyntaxNode, range: TextRange) -> Optio
157
162
}
158
163
159
164
fn get_struct_def_name_for_struct_literal_search (
165
+ sema : & Semantics < RootDatabase > ,
160
166
syntax : & SyntaxNode ,
161
167
position : FilePosition ,
162
168
) -> Option < ast:: Name > {
163
169
if let TokenAtOffset :: Between ( ref left, ref right) = syntax. token_at_offset ( position. offset ) {
164
170
if right. kind ( ) != SyntaxKind :: L_CURLY && right. kind ( ) != SyntaxKind :: L_PAREN {
165
171
return None ;
166
172
}
167
- if let Some ( name) = find_node_at_offset :: < ast:: Name > ( & syntax, left. text_range ( ) . start ( ) ) {
173
+ if let Some ( name) =
174
+ sema. find_node_at_offset_with_descend :: < ast:: Name > ( & syntax, left. text_range ( ) . start ( ) )
175
+ {
168
176
return name. syntax ( ) . ancestors ( ) . find_map ( ast:: StructDef :: cast) . and_then ( |l| l. name ( ) ) ;
169
177
}
170
- if find_node_at_offset :: < ast:: TypeParamList > ( & syntax, left. text_range ( ) . start ( ) ) . is_some ( ) {
178
+ if sema
179
+ . find_node_at_offset_with_descend :: < ast:: TypeParamList > (
180
+ & syntax,
181
+ left. text_range ( ) . start ( ) ,
182
+ )
183
+ . is_some ( )
184
+ {
171
185
return left. ancestors ( ) . find_map ( ast:: StructDef :: cast) . and_then ( |l| l. name ( ) ) ;
172
186
}
173
187
}
0 commit comments