@@ -32,7 +32,6 @@ use util::nodemap::FnvHashMap;
3232
3333use syntax:: ast;
3434use syntax:: attr:: AttrMetaMethods ;
35- use syntax:: codemap:: { DUMMY_SP , Span } ;
3635use syntax:: parse:: token:: InternedString ;
3736use rustc_front:: intravisit:: Visitor ;
3837use rustc_front:: hir;
@@ -158,7 +157,7 @@ impl<'a, 'v, 'tcx> Visitor<'v> for LanguageItemCollector<'a, 'tcx> {
158157 let item_index = self . item_refs. get( & value[ ..] ) . cloned( ) ;
159158
160159 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) )
162161 }
163162 }
164163 }
@@ -180,15 +179,26 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
180179 }
181180
182181 pub fn collect_item( & mut self , item_index: usize ,
183- item_def_id: DefId , span : Span ) {
182+ item_def_id: DefId ) {
184183 // Check for duplicates.
185184 match self . items. items[ item_index] {
186185 Some ( original_def_id) if original_def_id != item_def_id => {
187186 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( ) ;
192202 }
193203 _ => {
194204 // OK.
@@ -205,17 +215,18 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
205215
206216 pub fn collect_external_language_items( & mut self ) {
207217 let cstore = & self . session. cstore;
218+
208219 for cnum in cstore. crates( ) {
209220 for ( index, item_index) in cstore. lang_items( cnum) {
210221 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) ;
212223 }
213224 }
214225 }
215226
216227 pub fn collect( & mut self , krate: & hir:: Crate ) {
217- self . collect_local_language_items( krate) ;
218228 self . collect_external_language_items( ) ;
229+ self . collect_local_language_items( krate) ;
219230 }
220231}
221232
0 commit comments