@@ -82,38 +82,40 @@ pub enum NameClass {
82
82
Definition ( Definition ) ,
83
83
/// `None` in `if let None = Some(82) {}`
84
84
ConstReference ( Definition ) ,
85
+ FieldShorthand {
86
+ local : Local ,
87
+ field : Definition ,
88
+ } ,
85
89
}
86
90
87
91
impl NameClass {
88
92
pub fn into_definition ( self ) -> Option < Definition > {
89
93
match self {
90
94
NameClass :: Definition ( it) => Some ( it) ,
91
95
NameClass :: ConstReference ( _) => None ,
96
+ NameClass :: FieldShorthand { local, field : _ } => Some ( Definition :: Local ( local) ) ,
92
97
}
93
98
}
94
99
95
100
pub fn definition ( self ) -> Definition {
96
101
match self {
97
102
NameClass :: Definition ( it) | NameClass :: ConstReference ( it) => it,
103
+ NameClass :: FieldShorthand { local : _, field } => field,
98
104
}
99
105
}
100
106
}
101
107
102
108
pub fn classify_name ( sema : & Semantics < RootDatabase > , name : & ast:: Name ) -> Option < NameClass > {
103
109
let _p = profile ( "classify_name" ) ;
104
110
105
- if let Some ( bind_pat) = name. syntax ( ) . parent ( ) . and_then ( ast:: BindPat :: cast) {
111
+ let parent = name. syntax ( ) . parent ( ) ?;
112
+
113
+ if let Some ( bind_pat) = ast:: BindPat :: cast ( parent. clone ( ) ) {
106
114
if let Some ( def) = sema. resolve_bind_pat_to_const ( & bind_pat) {
107
115
return Some ( NameClass :: ConstReference ( Definition :: ModuleDef ( def) ) ) ;
108
116
}
109
117
}
110
118
111
- classify_name_inner ( sema, name) . map ( NameClass :: Definition )
112
- }
113
-
114
- fn classify_name_inner ( sema : & Semantics < RootDatabase > , name : & ast:: Name ) -> Option < Definition > {
115
- let parent = name. syntax ( ) . parent ( ) ?;
116
-
117
119
match_ast ! {
118
120
match parent {
119
121
ast:: Alias ( it) => {
@@ -123,63 +125,71 @@ fn classify_name_inner(sema: &Semantics<RootDatabase>, name: &ast::Name) -> Opti
123
125
let name_ref = path_segment. name_ref( ) ?;
124
126
let name_ref_class = classify_name_ref( sema, & name_ref) ?;
125
127
126
- Some ( name_ref_class. definition( ) )
128
+ Some ( NameClass :: Definition ( name_ref_class. definition( ) ) )
127
129
} ,
128
130
ast:: BindPat ( it) => {
129
131
let local = sema. to_def( & it) ?;
130
- Some ( Definition :: Local ( local) )
132
+
133
+ if let Some ( record_field_pat) = it. syntax( ) . parent( ) . and_then( ast:: RecordFieldPat :: cast) {
134
+ if let Some ( field) = sema. resolve_record_field_pat( & record_field_pat) {
135
+ let field = Definition :: Field ( field) ;
136
+ return Some ( NameClass :: FieldShorthand { local, field } ) ;
137
+ }
138
+ }
139
+
140
+ Some ( NameClass :: Definition ( Definition :: Local ( local) ) )
131
141
} ,
132
142
ast:: RecordFieldDef ( it) => {
133
143
let field: hir:: Field = sema. to_def( & it) ?;
134
- Some ( Definition :: Field ( field) )
144
+ Some ( NameClass :: Definition ( Definition :: Field ( field) ) )
135
145
} ,
136
146
ast:: Module ( it) => {
137
147
let def = sema. to_def( & it) ?;
138
- Some ( Definition :: ModuleDef ( def. into( ) ) )
148
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
139
149
} ,
140
150
ast:: StructDef ( it) => {
141
151
let def: hir:: Struct = sema. to_def( & it) ?;
142
- Some ( Definition :: ModuleDef ( def. into( ) ) )
152
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
143
153
} ,
144
154
ast:: UnionDef ( it) => {
145
155
let def: hir:: Union = sema. to_def( & it) ?;
146
- Some ( Definition :: ModuleDef ( def. into( ) ) )
156
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
147
157
} ,
148
158
ast:: EnumDef ( it) => {
149
159
let def: hir:: Enum = sema. to_def( & it) ?;
150
- Some ( Definition :: ModuleDef ( def. into( ) ) )
160
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
151
161
} ,
152
162
ast:: TraitDef ( it) => {
153
163
let def: hir:: Trait = sema. to_def( & it) ?;
154
- Some ( Definition :: ModuleDef ( def. into( ) ) )
164
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
155
165
} ,
156
166
ast:: StaticDef ( it) => {
157
167
let def: hir:: Static = sema. to_def( & it) ?;
158
- Some ( Definition :: ModuleDef ( def. into( ) ) )
168
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
159
169
} ,
160
170
ast:: EnumVariant ( it) => {
161
171
let def: hir:: EnumVariant = sema. to_def( & it) ?;
162
- Some ( Definition :: ModuleDef ( def. into( ) ) )
172
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
163
173
} ,
164
174
ast:: FnDef ( it) => {
165
175
let def: hir:: Function = sema. to_def( & it) ?;
166
- Some ( Definition :: ModuleDef ( def. into( ) ) )
176
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
167
177
} ,
168
178
ast:: ConstDef ( it) => {
169
179
let def: hir:: Const = sema. to_def( & it) ?;
170
- Some ( Definition :: ModuleDef ( def. into( ) ) )
180
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
171
181
} ,
172
182
ast:: TypeAliasDef ( it) => {
173
183
let def: hir:: TypeAlias = sema. to_def( & it) ?;
174
- Some ( Definition :: ModuleDef ( def. into( ) ) )
184
+ Some ( NameClass :: Definition ( Definition :: ModuleDef ( def. into( ) ) ) )
175
185
} ,
176
186
ast:: MacroCall ( it) => {
177
187
let def = sema. to_def( & it) ?;
178
- Some ( Definition :: Macro ( def) )
188
+ Some ( NameClass :: Definition ( Definition :: Macro ( def) ) )
179
189
} ,
180
190
ast:: TypeParam ( it) => {
181
191
let def = sema. to_def( & it) ?;
182
- Some ( Definition :: TypeParam ( def) )
192
+ Some ( NameClass :: Definition ( Definition :: TypeParam ( def) ) )
183
193
} ,
184
194
_ => None ,
185
195
}
0 commit comments