@@ -116,6 +116,46 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
116
116
result
117
117
}
118
118
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
+
119
159
pub fn get_item_data ( & self , item : & ast:: Item ) -> Option < Data > {
120
160
match item. node {
121
161
ast:: ItemKind :: Fn ( ref decl, .., ref generics, _) => {
@@ -736,6 +776,21 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
736
776
}
737
777
}
738
778
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
+
739
794
#[ inline]
740
795
pub fn enclosing_scope ( & self , id : NodeId ) -> NodeId {
741
796
self . tcx . hir . get_enclosing_scope ( id) . unwrap_or ( CRATE_NODE_ID )
0 commit comments