@@ -32,7 +32,7 @@ use util::nodemap::FnvHashMap;
32
32
33
33
use syntax:: ast;
34
34
use syntax:: attr:: AttrMetaMethods ;
35
- use syntax:: codemap:: { DUMMY_SP , Span } ;
35
+ use syntax:: codemap:: Span ;
36
36
use syntax:: parse:: token:: InternedString ;
37
37
use rustc_front:: intravisit:: Visitor ;
38
38
use rustc_front:: hir;
@@ -185,10 +185,21 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
185
185
match self . items. items[ item_index] {
186
186
Some ( original_def_id) if original_def_id != item_def_id => {
187
187
let cstore = & self . session. cstore;
188
- span_err!( self . session, span, E0152 ,
189
- "duplicate entry for `{}`, first definition found in `{}`" ,
190
- LanguageItems :: item_name( item_index) ,
191
- cstore. crate_name( item_def_id. krate) ) ;
188
+ let span = self . ast_map. span_if_local( original_def_id) . unwrap_or( span) ;
189
+ let mut err = struct_span_err!( self . session,
190
+ span,
191
+ E0152 ,
192
+ "Duplicate lang item found: `{}`." ,
193
+ LanguageItems :: item_name( item_index) ) ;
194
+ if let Some ( span) = self . ast_map. span_if_local( item_def_id) {
195
+ span_note!( & mut err, span,
196
+ "First defined here." ) ;
197
+ } else {
198
+ span_note!( & mut err, span,
199
+ "First defined in crate `{}`." ,
200
+ cstore. crate_name( item_def_id. krate) ) ;
201
+ }
202
+ err. emit( ) ;
192
203
}
193
204
_ => {
194
205
// OK.
@@ -203,19 +214,19 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
203
214
krate. visit_all_items( self ) ;
204
215
}
205
216
206
- pub fn collect_external_language_items( & mut self ) {
217
+ pub fn collect_external_language_items( & mut self , krate : & hir :: Crate ) {
207
218
let cstore = & self . session. cstore;
208
219
for cnum in cstore. crates( ) {
209
220
for ( index, item_index) in cstore. lang_items( cnum) {
210
221
let def_id = DefId { krate: cnum, index: index } ;
211
- self . collect_item( item_index, def_id, DUMMY_SP ) ;
222
+ self . collect_item( item_index, def_id, krate . span ) ;
212
223
}
213
224
}
214
225
}
215
226
216
227
pub fn collect( & mut self , krate: & hir:: Crate ) {
217
228
self . collect_local_language_items( krate) ;
218
- self . collect_external_language_items( ) ;
229
+ self . collect_external_language_items( krate ) ;
219
230
}
220
231
}
221
232
0 commit comments