@@ -120,6 +120,46 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
120
120
result
121
121
}
122
122
123
+ pub fn get_extern_item_data ( & self , item : & ast:: ForeignItem ) -> Option < Data > {
124
+ let qualname = format ! ( "::{}" , self . tcx. node_path_str( item. id) ) ;
125
+ match item. node {
126
+ ast:: ForeignItemKind :: Fn ( ref decl, ref generics) => {
127
+ let sub_span = self . span_utils . sub_span_after_keyword ( item. span , keywords:: Fn ) ;
128
+ Some ( Data :: FunctionData ( FunctionData {
129
+ id : item. id ,
130
+ name : item. ident . to_string ( ) ,
131
+ qualname : qualname,
132
+ declaration : None ,
133
+ span : sub_span. unwrap ( ) ,
134
+ scope : self . enclosing_scope ( item. id ) ,
135
+ value : make_signature ( decl, generics) ,
136
+ visibility : From :: from ( & item. vis ) ,
137
+ parent : None ,
138
+ docs : docs_for_attrs ( & item. attrs ) ,
139
+ sig : self . sig_base_extern ( item) ,
140
+ } ) )
141
+ }
142
+ ast:: ForeignItemKind :: Static ( ref ty, m) => {
143
+ let keyword = if m { keywords:: Mut } else { keywords:: Static } ;
144
+ let sub_span = self . span_utils . sub_span_after_keyword ( item. span , keyword) ;
145
+ Some ( Data :: VariableData ( VariableData {
146
+ id : item. id ,
147
+ kind : VariableKind :: Static ,
148
+ name : item. ident . to_string ( ) ,
149
+ qualname : qualname,
150
+ span : sub_span. unwrap ( ) ,
151
+ scope : self . enclosing_scope ( item. id ) ,
152
+ parent : None ,
153
+ value : String :: new ( ) ,
154
+ type_value : ty_to_string ( ty) ,
155
+ visibility : From :: from ( & item. vis ) ,
156
+ docs : docs_for_attrs ( & item. attrs ) ,
157
+ sig : Some ( self . sig_base_extern ( item) ) ,
158
+ } ) )
159
+ }
160
+ }
161
+ }
162
+
123
163
pub fn get_item_data ( & self , item : & ast:: Item ) -> Option < Data > {
124
164
match item. node {
125
165
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