@@ -37,6 +37,7 @@ fn should_explore(tcx: ty::ctxt, def_id: ast::DefId) -> bool {
3737 match tcx. items . find ( & def_id. node ) {
3838 Some ( & ast_map:: node_item( ..) )
3939 | Some ( & ast_map:: node_method( ..) )
40+ | Some ( & ast_map:: node_foreign_item( ..) )
4041 | Some ( & ast_map:: node_trait_method( ..) ) => true ,
4142 _ => false
4243 }
@@ -61,11 +62,10 @@ impl MarkSymbolVisitor {
6162 }
6263 }
6364
64- fn lookup_and_handle_definition ( & mut self , id : & ast:: NodeId ,
65- span : codemap:: Span ) {
65+ fn lookup_and_handle_definition ( & mut self , id : & ast:: NodeId ) {
6666 let def = match self . tcx . def_map . find ( id) {
6767 Some ( & def) => def,
68- None => self . tcx . sess . span_bug ( span , "def ID not in def map?!" ) ,
68+ None => return
6969 } ;
7070 let def_id = match def {
7171 ast:: DefVariant ( enum_id, _, _) => Some ( enum_id) ,
@@ -107,8 +107,7 @@ impl MarkSymbolVisitor {
107107 match item. node {
108108 ast:: item_fn( ..)
109109 | ast:: item_ty( ..)
110- | ast:: item_static( ..)
111- | ast:: item_foreign_mod( _) => {
110+ | ast:: item_static( ..) => {
112111 visit:: walk_item ( self , item, ( ) ) ;
113112 }
114113 _ => ( )
@@ -120,6 +119,9 @@ impl MarkSymbolVisitor {
120119 ast_map:: node_method( method, _, _) => {
121120 visit:: walk_block ( self , method. body , ( ) ) ;
122121 }
122+ ast_map:: node_foreign_item( foreign_item, _, _, _) => {
123+ visit:: walk_foreign_item ( self , foreign_item, ( ) ) ;
124+ }
123125 _ => ( )
124126 }
125127 }
@@ -129,9 +131,6 @@ impl Visitor<()> for MarkSymbolVisitor {
129131
130132 fn visit_expr ( & mut self , expr : @ast:: Expr , _: ( ) ) {
131133 match expr. node {
132- ast:: ExprPath ( _) | ast:: ExprStruct ( ..) => {
133- self . lookup_and_handle_definition ( & expr. id , expr. span ) ;
134- }
135134 ast:: ExprMethodCall ( ..) => {
136135 match self . method_map . find ( & expr. id ) {
137136 Some ( & typeck:: method_map_entry {
@@ -160,12 +159,16 @@ impl Visitor<()> for MarkSymbolVisitor {
160159 fn visit_ty ( & mut self , typ : & ast:: Ty , _: ( ) ) {
161160 match typ. node {
162161 ast:: ty_path( _, _, ref id) => {
163- self . lookup_and_handle_definition ( id, typ . span ) ;
162+ self . lookup_and_handle_definition ( id) ;
164163 }
165164 _ => visit:: walk_ty ( self , typ, ( ) ) ,
166165 }
167166 }
168167
168+ fn visit_path ( & mut self , _: & ast:: Path , id : ast:: NodeId , _: ( ) ) {
169+ self . lookup_and_handle_definition ( & id) ;
170+ }
171+
169172 fn visit_item ( & mut self , _item : @ast:: item , _: ( ) ) {
170173 // Do not recurse into items. These items will be added to the
171174 // worklist and recursed into manually if necessary.
@@ -299,19 +302,31 @@ impl DeadVisitor {
299302 }
300303 false
301304 }
305+
306+ fn warn_dead_code ( & mut self , id : ast:: NodeId ,
307+ span : codemap:: Span , ident : & ast:: Ident ) {
308+ self . tcx . sess . add_lint ( dead_code, id, span,
309+ format ! ( "code is never used: `{}`" ,
310+ token:: ident_to_str( ident) ) ) ;
311+ }
302312}
303313
304314impl Visitor < ( ) > for DeadVisitor {
305315 fn visit_item ( & mut self , item : @ast:: item , _: ( ) ) {
306316 let ctor_id = get_struct_ctor_id ( item) ;
307317 if !self . symbol_is_live ( item. id , ctor_id) && should_warn ( item) {
308- self . tcx . sess . add_lint ( dead_code, item. id , item. span ,
309- format ! ( "code is never used: `{}`" ,
310- token:: ident_to_str( & item. ident) ) ) ;
318+ self . warn_dead_code ( item. id , item. span , & item. ident ) ;
311319 }
312320 visit:: walk_item ( self , item, ( ) ) ;
313321 }
314322
323+ fn visit_foreign_item ( & mut self , fi : @ast:: foreign_item , _: ( ) ) {
324+ if !self . symbol_is_live ( fi. id , None ) {
325+ self . warn_dead_code ( fi. id , fi. span , & fi. ident ) ;
326+ }
327+ visit:: walk_foreign_item ( self , fi, ( ) ) ;
328+ }
329+
315330 fn visit_fn ( & mut self , fk : & visit:: fn_kind ,
316331 _: & ast:: fn_decl , block : ast:: P < ast:: Block > ,
317332 span : codemap:: Span , id : ast:: NodeId , _: ( ) ) {
@@ -320,10 +335,7 @@ impl Visitor<()> for DeadVisitor {
320335 visit:: fk_method( ..) => {
321336 let ident = visit:: name_of_fn ( fk) ;
322337 if !self . symbol_is_live ( id, None ) {
323- self . tcx . sess
324- . add_lint ( dead_code, id, span,
325- format ! ( "code is never used: `{}`" ,
326- token:: ident_to_str( & ident) ) ) ;
338+ self . warn_dead_code ( id, span, & ident) ;
327339 }
328340 }
329341 _ => ( )
0 commit comments