@@ -4,6 +4,7 @@ use rustc_ast::*;
44use rustc_expand:: expand:: AstFragment ;
55use rustc_hir:: def:: { CtorKind , CtorOf , DefKind } ;
66use rustc_hir:: def_id:: LocalDefId ;
7+ use rustc_middle:: hir:: map:: { named_span, until_within} ;
78use rustc_span:: hygiene:: LocalExpnId ;
89use rustc_span:: symbol:: { kw, sym, Symbol } ;
910use rustc_span:: Span ;
@@ -31,18 +32,20 @@ impl<'a, 'b, 'tcx> DefCollector<'a, 'b, 'tcx> {
3132 node_id : NodeId ,
3233 name : Symbol ,
3334 def_kind : DefKind ,
35+ def_span : Span ,
3436 span : Span ,
3537 ) -> LocalDefId {
3638 let parent_def = self . parent_def ;
3739 debug ! (
38- "create_def(node_id={:?}, def_kind={:?}, parent_def={:?})" ,
39- node_id, def_kind, parent_def
40+ "create_def(node_id={:?}, def_kind={:?}, parent_def={:?}, def_span={:?} )" ,
41+ node_id, def_kind, parent_def, def_span
4042 ) ;
4143 self . resolver . create_def (
4244 parent_def,
4345 node_id,
4446 name,
4547 def_kind,
48+ def_span,
4649 self . expansion . to_expn_id ( ) ,
4750 span. with_parent ( None ) ,
4851 )
@@ -78,7 +81,7 @@ impl<'a, 'b, 'tcx> DefCollector<'a, 'b, 'tcx> {
7881 self . visit_macro_invoc ( field. id ) ;
7982 } else {
8083 let name = field. ident . map_or_else ( || sym:: integer ( index ( self ) ) , |ident| ident. name ) ;
81- let def = self . create_def ( field. id , name, DefKind :: Field , field. span ) ;
84+ let def = self . create_def ( field. id , name, DefKind :: Field , field. span , field . span ) ;
8285 self . with_parent ( def, |this| visit:: walk_field_def ( this, field) ) ;
8386 }
8487 }
@@ -91,6 +94,33 @@ impl<'a, 'b, 'tcx> DefCollector<'a, 'b, 'tcx> {
9194 }
9295}
9396
97+ fn def_span_for_item ( i : & Item ) -> Span {
98+ match & i. kind {
99+ ItemKind :: ForeignMod ( _) => i. span ,
100+ ItemKind :: GlobalAsm ( _) => i. span ,
101+ ItemKind :: Fn ( f) => f. sig . span . find_ancestor_in_same_ctxt ( i. span ) . unwrap_or ( i. span ) ,
102+ ItemKind :: Static ( s) => until_within ( i. span , s. ty . span ) ,
103+ ItemKind :: Const ( c) => until_within ( i. span , c. ty . span ) ,
104+ ItemKind :: Impl ( im) => until_within ( i. span , im. generics . where_clause . span ) ,
105+ ItemKind :: MacroDef ( _) => named_span ( i. span , i. ident , i. kind . generics ( ) . map ( |g| g. span ) ) ,
106+ ItemKind :: Mod ( _, _) => named_span ( i. span , i. ident , i. kind . generics ( ) . map ( |g| g. span ) ) ,
107+ ItemKind :: TyAlias ( _) => named_span ( i. span , i. ident , i. kind . generics ( ) . map ( |g| g. span ) ) ,
108+ ItemKind :: TraitAlias ( _, _) => {
109+ named_span ( i. span , i. ident , i. kind . generics ( ) . map ( |g| g. span ) )
110+ }
111+ ItemKind :: ExternCrate ( _) => named_span ( i. span , i. ident , i. kind . generics ( ) . map ( |g| g. span ) ) ,
112+ ItemKind :: Union ( _, _) => named_span ( i. span , i. ident , i. kind . generics ( ) . map ( |g| g. span ) ) ,
113+ ItemKind :: Enum ( ..) => named_span ( i. span , i. ident , i. kind . generics ( ) . map ( |g| g. span ) ) ,
114+ ItemKind :: Struct ( ..) => named_span ( i. span , i. ident , i. kind . generics ( ) . map ( |g| g. span ) ) ,
115+ ItemKind :: Trait ( t) => {
116+ let end = if let Some ( b) = t. bounds . last ( ) { b. span ( ) } else { t. generics . span } ;
117+ until_within ( i. span , end)
118+ }
119+ ItemKind :: Use ( _) => unreachable ! ( ) ,
120+ ItemKind :: MacCall ( _) => unreachable ! ( ) ,
121+ }
122+ }
123+
94124impl < ' a , ' b , ' tcx > visit:: Visitor < ' a > for DefCollector < ' a , ' b , ' tcx > {
95125 fn visit_item ( & mut self , i : & ' a Item ) {
96126 debug ! ( "visit_item: {:?}" , i) ;
@@ -127,7 +157,7 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
127157 return visit:: walk_item ( self , i) ;
128158 }
129159 } ;
130- let def_id = self . create_def ( i. id , i. ident . name , def_kind, i. span ) ;
160+ let def_id = self . create_def ( i. id , i. ident . name , def_kind, def_span_for_item ( i ) , i. span ) ;
131161
132162 if let Some ( macro_data) = opt_macro_data {
133163 self . resolver . macro_map . insert ( def_id. to_def_id ( ) , macro_data) ;
@@ -143,6 +173,7 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
143173 ctor_node_id,
144174 kw:: Empty ,
145175 DefKind :: Ctor ( CtorOf :: Struct , ctor_kind) ,
176+ this. resolver . tcx . def_span ( this. parent_def ) ,
146177 i. span ,
147178 ) ;
148179 }
@@ -176,6 +207,7 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
176207 coroutine_kind. closure_id ( ) ,
177208 kw:: Empty ,
178209 DefKind :: Closure ,
210+ body. span . find_ancestor_in_same_ctxt ( span) . unwrap_or ( span) ,
179211 span,
180212 ) ;
181213 self . with_parent ( closure_def, |this| this. visit_block ( body) ) ;
@@ -190,19 +222,27 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
190222 }
191223
192224 fn visit_use_tree ( & mut self , use_tree : & ' a UseTree , id : NodeId , _nested : bool ) {
193- self . create_def ( id, kw:: Empty , DefKind :: Use , use_tree. span ) ;
225+ let def_span =
226+ use_tree. prefix . span . find_ancestor_in_same_ctxt ( use_tree. span ) . unwrap_or ( use_tree. span ) ;
227+ self . create_def ( id, kw:: Empty , DefKind :: Use , def_span, use_tree. span ) ;
194228 visit:: walk_use_tree ( self , use_tree, id) ;
195229 }
196230
197231 fn visit_foreign_item ( & mut self , fi : & ' a ForeignItem ) {
198- let def_kind = match fi. kind {
199- ForeignItemKind :: Static ( _, mt, _) => DefKind :: Static ( mt) ,
200- ForeignItemKind :: Fn ( _) => DefKind :: Fn ,
201- ForeignItemKind :: TyAlias ( _) => DefKind :: ForeignTy ,
232+ let ( def_kind, def_span) = match & fi. kind {
233+ ForeignItemKind :: Static ( ty, mt, _) => {
234+ ( DefKind :: Static ( * mt) , until_within ( fi. span , ty. span ) )
235+ }
236+ ForeignItemKind :: Fn ( f) => {
237+ ( DefKind :: Fn , until_within ( fi. span , f. sig . decl . output . span ( ) ) )
238+ }
239+ ForeignItemKind :: TyAlias ( _) => {
240+ ( DefKind :: ForeignTy , named_span ( fi. span , fi. ident , None ) )
241+ }
202242 ForeignItemKind :: MacCall ( _) => return self . visit_macro_invoc ( fi. id ) ,
203243 } ;
204244
205- let def = self . create_def ( fi. id , fi. ident . name , def_kind, fi. span ) ;
245+ let def = self . create_def ( fi. id , fi. ident . name , def_kind, def_span , fi. span ) ;
206246
207247 self . with_parent ( def, |this| visit:: walk_foreign_item ( this, fi) ) ;
208248 }
@@ -211,13 +251,20 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
211251 if v. is_placeholder {
212252 return self . visit_macro_invoc ( v. id ) ;
213253 }
214- let def = self . create_def ( v. id , v. ident . name , DefKind :: Variant , v. span ) ;
254+ let def = self . create_def (
255+ v. id ,
256+ v. ident . name ,
257+ DefKind :: Variant ,
258+ named_span ( v. span , v. ident , None ) ,
259+ v. span ,
260+ ) ;
215261 self . with_parent ( def, |this| {
216262 if let Some ( ( ctor_kind, ctor_node_id) ) = CtorKind :: from_ast ( & v. data ) {
217263 this. create_def (
218264 ctor_node_id,
219265 kw:: Empty ,
220266 DefKind :: Ctor ( CtorOf :: Variant , ctor_kind) ,
267+ this. resolver . tcx . def_span ( this. parent_def ) ,
221268 v. span ,
222269 ) ;
223270 }
@@ -244,7 +291,7 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
244291 GenericParamKind :: Type { .. } => DefKind :: TyParam ,
245292 GenericParamKind :: Const { .. } => DefKind :: ConstParam ,
246293 } ;
247- self . create_def ( param. id , param. ident . name , def_kind, param. ident . span ) ;
294+ self . create_def ( param. id , param. ident . name , def_kind, param. span ( ) , param . ident . span ) ;
248295
249296 // impl-Trait can happen inside generic parameters, like
250297 // ```
@@ -258,14 +305,19 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
258305 }
259306
260307 fn visit_assoc_item ( & mut self , i : & ' a AssocItem , ctxt : visit:: AssocCtxt ) {
261- let def_kind = match & i. kind {
262- AssocItemKind :: Fn ( ..) => DefKind :: AssocFn ,
263- AssocItemKind :: Const ( ..) => DefKind :: AssocConst ,
264- AssocItemKind :: Type ( ..) => DefKind :: AssocTy ,
308+ let ( def_kind, def_span) = match & i. kind {
309+ AssocItemKind :: Fn ( f) => {
310+ ( DefKind :: AssocFn , f. sig . span . find_ancestor_in_same_ctxt ( i. span ) . unwrap_or ( i. span ) )
311+ }
312+ AssocItemKind :: Const ( c) => ( DefKind :: AssocConst , until_within ( i. span , c. ty . span ) ) ,
313+ AssocItemKind :: Type ( ty) => ( DefKind :: AssocTy , {
314+ let end = if let Some ( b) = ty. bounds . last ( ) { b. span ( ) } else { ty. generics . span } ;
315+ until_within ( i. span , end)
316+ } ) ,
265317 AssocItemKind :: MacCall ( ..) => return self . visit_macro_invoc ( i. id ) ,
266318 } ;
267319
268- let def = self . create_def ( i. id , i. ident . name , def_kind, i. span ) ;
320+ let def = self . create_def ( i. id , i. ident . name , def_kind, def_span , i. span ) ;
269321 self . with_parent ( def, |this| visit:: walk_assoc_item ( this, i, ctxt) ) ;
270322 }
271323
@@ -277,7 +329,13 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
277329 }
278330
279331 fn visit_anon_const ( & mut self , constant : & ' a AnonConst ) {
280- let def = self . create_def ( constant. id , kw:: Empty , DefKind :: AnonConst , constant. value . span ) ;
332+ let def = self . create_def (
333+ constant. id ,
334+ kw:: Empty ,
335+ DefKind :: AnonConst ,
336+ constant. value . span ,
337+ constant. value . span ,
338+ ) ;
281339 self . with_parent ( def, |this| visit:: walk_anon_const ( this, constant) ) ;
282340 }
283341
@@ -287,26 +345,35 @@ impl<'a, 'b, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'b, 'tcx> {
287345 ExprKind :: Closure ( ref closure) => {
288346 // Async closures desugar to closures inside of closures, so
289347 // we must create two defs.
290- let closure_def = self . create_def ( expr. id , kw:: Empty , DefKind :: Closure , expr. span ) ;
348+ let def_span =
349+ closure. fn_decl_span . find_ancestor_inside ( expr. span ) . unwrap_or ( expr. span ) ;
350+ let closure_def =
351+ self . create_def ( expr. id , kw:: Empty , DefKind :: Closure , def_span, expr. span ) ;
291352 match closure. coroutine_kind {
292353 Some ( coroutine_kind) => self . create_def (
293354 coroutine_kind. closure_id ( ) ,
294355 kw:: Empty ,
295356 DefKind :: Closure ,
357+ closure
358+ . body
359+ . span
360+ . find_ancestor_in_same_ctxt ( expr. span )
361+ . unwrap_or ( expr. span ) ,
296362 expr. span ,
297363 ) ,
298364 None => closure_def,
299365 }
300366 }
301367 ExprKind :: Gen ( _, _, _) => {
302- self . create_def ( expr. id , kw:: Empty , DefKind :: Closure , expr. span )
368+ self . create_def ( expr. id , kw:: Empty , DefKind :: Closure , expr. span , expr . span )
303369 }
304370 ExprKind :: ConstBlock ( ref constant) => {
305371 let def = self . create_def (
306372 constant. id ,
307373 kw:: Empty ,
308374 DefKind :: InlineConst ,
309375 constant. value . span ,
376+ constant. value . span ,
310377 ) ;
311378 self . with_parent ( def, |this| visit:: walk_anon_const ( this, constant) ) ;
312379 return ;
0 commit comments