@@ -119,6 +119,46 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
119
119
result
120
120
}
121
121
122
+ pub fn get_extern_item_data ( & self , item : & ast:: ForeignItem ) -> Option < Data > {
123
+ let qualname = format ! ( "::{}" , self . tcx. node_path_str( item. id) ) ;
124
+ match item. node {
125
+ ast:: ForeignItemKind :: Fn ( ref decl, ref generics) => {
126
+ let sub_span = self . span_utils . sub_span_after_keyword ( item. span , keywords:: Fn ) ;
127
+ Some ( Data :: FunctionData ( FunctionData {
128
+ id : item. id ,
129
+ name : item. ident . to_string ( ) ,
130
+ qualname : qualname,
131
+ declaration : None ,
132
+ span : sub_span. unwrap ( ) ,
133
+ scope : self . enclosing_scope ( item. id ) ,
134
+ value : make_signature ( decl, generics) ,
135
+ visibility : From :: from ( & item. vis ) ,
136
+ parent : None ,
137
+ docs : docs_for_attrs ( & item. attrs ) ,
138
+ sig : self . sig_base_extern ( item) ,
139
+ } ) )
140
+ }
141
+ ast:: ForeignItemKind :: Static ( ref ty, m) => {
142
+ let keyword = if m { keywords:: Mut } else { keywords:: Static } ;
143
+ let sub_span = self . span_utils . sub_span_after_keyword ( item. span , keyword) ;
144
+ Some ( Data :: VariableData ( VariableData {
145
+ id : item. id ,
146
+ kind : VariableKind :: Static ,
147
+ name : item. ident . to_string ( ) ,
148
+ qualname : qualname,
149
+ span : sub_span. unwrap ( ) ,
150
+ scope : self . enclosing_scope ( item. id ) ,
151
+ parent : None ,
152
+ value : String :: new ( ) ,
153
+ type_value : ty_to_string ( ty) ,
154
+ visibility : From :: from ( & item. vis ) ,
155
+ docs : docs_for_attrs ( & item. attrs ) ,
156
+ sig : Some ( self . sig_base_extern ( item) ) ,
157
+ } ) )
158
+ }
159
+ }
160
+ }
161
+
122
162
pub fn get_item_data ( & self , item : & ast:: Item ) -> Option < Data > {
123
163
match item. node {
124
164
ast:: ItemKind :: Fn ( ref decl, .., ref generics, _) => {
@@ -751,6 +791,21 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
751
791
}
752
792
}
753
793
794
+ fn sig_base_extern ( & self , item : & ast:: ForeignItem ) -> Signature {
795
+ let text = self . span_utils . signature_string_for_span ( item. span ) ;
796
+ let name = item. ident . to_string ( ) ;
797
+ let ident_start = text. find ( & name) . expect ( "Name not in signature?" ) ;
798
+ let ident_end = ident_start + name. len ( ) ;
799
+ Signature {
800
+ span : mk_sp ( item. span . lo , item. span . lo + BytePos ( text. len ( ) as u32 ) ) ,
801
+ text : text,
802
+ ident_start : ident_start,
803
+ ident_end : ident_end,
804
+ defs : vec ! [ ] ,
805
+ refs : vec ! [ ] ,
806
+ }
807
+ }
808
+
754
809
#[ inline]
755
810
pub fn enclosing_scope ( & self , id : NodeId ) -> NodeId {
756
811
self . tcx . hir . get_enclosing_scope ( id) . unwrap_or ( CRATE_NODE_ID )
0 commit comments