@@ -116,6 +116,46 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
116116 result
117117 }
118118
119+ pub fn get_extern_item_data ( & self , item : & ast:: ForeignItem ) -> Option < Data > {
120+ let qualname = format ! ( "::{}" , self . tcx. node_path_str( item. id) ) ;
121+ match item. node {
122+ ast:: ForeignItemKind :: Fn ( ref decl, ref generics) => {
123+ let sub_span = self . span_utils . sub_span_after_keyword ( item. span , keywords:: Fn ) ;
124+ Some ( Data :: FunctionData ( FunctionData {
125+ id : item. id ,
126+ name : item. ident . to_string ( ) ,
127+ qualname : qualname,
128+ declaration : None ,
129+ span : sub_span. unwrap ( ) ,
130+ scope : self . enclosing_scope ( item. id ) ,
131+ value : make_signature ( decl, generics) ,
132+ visibility : From :: from ( & item. vis ) ,
133+ parent : None ,
134+ docs : docs_for_attrs ( & item. attrs ) ,
135+ sig : self . sig_base_extern ( item) ,
136+ } ) )
137+ }
138+ ast:: ForeignItemKind :: Static ( ref ty, m) => {
139+ let keyword = if m { keywords:: Mut } else { keywords:: Static } ;
140+ let sub_span = self . span_utils . sub_span_after_keyword ( item. span , keyword) ;
141+ Some ( Data :: VariableData ( VariableData {
142+ id : item. id ,
143+ kind : VariableKind :: Static ,
144+ name : item. ident . to_string ( ) ,
145+ qualname : qualname,
146+ span : sub_span. unwrap ( ) ,
147+ scope : self . enclosing_scope ( item. id ) ,
148+ parent : None ,
149+ value : String :: new ( ) ,
150+ type_value : ty_to_string ( ty) ,
151+ visibility : From :: from ( & item. vis ) ,
152+ docs : docs_for_attrs ( & item. attrs ) ,
153+ sig : Some ( self . sig_base_extern ( item) ) ,
154+ } ) )
155+ }
156+ }
157+ }
158+
119159 pub fn get_item_data ( & self , item : & ast:: Item ) -> Option < Data > {
120160 match item. node {
121161 ast:: ItemKind :: Fn ( ref decl, .., ref generics, _) => {
@@ -736,6 +776,21 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
736776 }
737777 }
738778
779+ fn sig_base_extern ( & self , item : & ast:: ForeignItem ) -> Signature {
780+ let text = self . span_utils . signature_string_for_span ( item. span ) ;
781+ let name = item. ident . to_string ( ) ;
782+ let ident_start = text. find ( & name) . expect ( "Name not in signature?" ) ;
783+ let ident_end = ident_start + name. len ( ) ;
784+ Signature {
785+ span : mk_sp ( item. span . lo , item. span . lo + BytePos ( text. len ( ) as u32 ) ) ,
786+ text : text,
787+ ident_start : ident_start,
788+ ident_end : ident_end,
789+ defs : vec ! [ ] ,
790+ refs : vec ! [ ] ,
791+ }
792+ }
793+
739794 #[ inline]
740795 pub fn enclosing_scope ( & self , id : NodeId ) -> NodeId {
741796 self . tcx . hir . get_enclosing_scope ( id) . unwrap_or ( CRATE_NODE_ID )
0 commit comments