@@ -32,7 +32,6 @@ use util::nodemap::FnvHashMap;
32
32
33
33
use syntax:: ast;
34
34
use syntax:: attr:: AttrMetaMethods ;
35
- use syntax:: codemap:: { DUMMY_SP , Span } ;
36
35
use syntax:: parse:: token:: InternedString ;
37
36
use rustc_front:: intravisit:: Visitor ;
38
37
use rustc_front:: hir;
@@ -158,7 +157,7 @@ impl<'a, 'v, 'tcx> Visitor<'v> for LanguageItemCollector<'a, 'tcx> {
158
157
let item_index = self . item_refs. get( & value[ ..] ) . cloned( ) ;
159
158
160
159
if let Some ( item_index) = item_index {
161
- self . collect_item( item_index, self . ast_map. local_def_id( item. id) , item . span )
160
+ self . collect_item( item_index, self . ast_map. local_def_id( item. id) )
162
161
}
163
162
}
164
163
}
@@ -180,15 +179,26 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
180
179
}
181
180
182
181
pub fn collect_item( & mut self , item_index: usize ,
183
- item_def_id: DefId , span : Span ) {
182
+ item_def_id: DefId ) {
184
183
// Check for duplicates.
185
184
match self . items. items[ item_index] {
186
185
Some ( original_def_id) if original_def_id != item_def_id => {
187
186
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) ) ;
187
+ let span = self . ast_map. span_if_local( item_def_id)
188
+ . expect( "we should have found local duplicate earlier" ) ;
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( original_def_id) {
195
+ span_note!( & mut err, span,
196
+ "first defined here." ) ;
197
+ } else {
198
+ err. note( & format!( "first defined in crate `{}`." ,
199
+ cstore. crate_name( original_def_id. krate) ) ) ;
200
+ }
201
+ err. emit( ) ;
192
202
}
193
203
_ => {
194
204
// OK.
@@ -205,17 +215,18 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
205
215
206
216
pub fn collect_external_language_items( & mut self ) {
207
217
let cstore = & self . session. cstore;
218
+
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) ;
212
223
}
213
224
}
214
225
}
215
226
216
227
pub fn collect( & mut self , krate: & hir:: Crate ) {
217
- self . collect_local_language_items( krate) ;
218
228
self . collect_external_language_items( ) ;
229
+ self . collect_local_language_items( krate) ;
219
230
}
220
231
}
221
232
0 commit comments