@@ -9,6 +9,7 @@ use ra_ap_base_db::{CrateId, SourceDatabase};
99use ra_ap_cfg:: CfgAtom ;
1010use ra_ap_hir:: db:: { DefDatabase , HirDatabase } ;
1111use ra_ap_hir:: { DefMap , ModPath , ModuleDefId , Semantics , TypeRef , Variant } ;
12+ use ra_ap_hir_def:: data:: adt:: VariantData ;
1213use ra_ap_hir_def:: LocalModuleId ;
1314use ra_ap_ide_db:: line_index:: { LineCol , LineIndex } ;
1415use ra_ap_ide_db:: RootDatabase ;
@@ -236,6 +237,30 @@ fn emit_hir_typeref(trap: &mut TrapFile, ty: &TypeRef) -> Option<trap::Label<gen
236237 }
237238}
238239
240+ fn emit_variant_data (
241+ trap : & mut TrapFile ,
242+ variant : & VariantData ,
243+ ) -> Option < trap:: Label < generated:: VariantData > > {
244+ match variant {
245+ VariantData :: Record ( field_data) | VariantData :: Tuple ( field_data) => {
246+ let mut types = Vec :: new ( ) ;
247+ let mut fields = Vec :: new ( ) ;
248+ for field in field_data. values ( ) {
249+ if let Some ( tp) = emit_hir_typeref ( trap, & field. type_ref ) {
250+ fields. push ( field. name . as_str ( ) . to_owned ( ) ) ;
251+ types. push ( tp) ;
252+ }
253+ }
254+ Some ( trap. emit ( generated:: VariantData {
255+ id : trap:: TrapId :: Star ,
256+ types,
257+ fields,
258+ is_record : matches ! ( variant, VariantData :: Record ( _) ) ,
259+ } ) )
260+ }
261+ VariantData :: Unit => None ,
262+ }
263+ }
239264impl < ' a > Extractor < ' a > {
240265 pub fn new ( archiver : & ' a Archiver , traps : & ' a trap:: TrapFileProvider ) -> Self {
241266 Self {
@@ -444,6 +469,7 @@ impl<'a> Extractor<'a> {
444469 let module = & map. modules [ module] ;
445470 let items = & module. scope ;
446471 let mut values = Vec :: new ( ) ;
472+ let mut types = Vec :: new ( ) ;
447473
448474 for ( name, item) in items. entries ( ) {
449475 let def = item. with_visibility ( ra_ap_hir:: Visibility :: Public ) ;
@@ -551,13 +577,72 @@ impl<'a> Extractor<'a> {
551577 _ => ( ) ,
552578 }
553579 }
554- if let Some ( ( _type_id, _, _import) ) = def. types { }
580+ if let Some ( ( type_id, _, _import) ) = def. types {
581+ if let ModuleDefId :: AdtId ( adt_id) = type_id {
582+ match adt_id {
583+ ra_ap_hir:: AdtId :: StructId ( struct_id) => {
584+ let data = db. struct_data ( struct_id) ;
585+ let content =
586+ emit_variant_data ( trap, data. variant_data . as_ref ( ) ) ;
587+ types. push (
588+ trap. emit ( generated:: StructItem {
589+ id : trap:: TrapId :: Star ,
590+ name : name. as_str ( ) . to_owned ( ) ,
591+ content,
592+ is_union : false ,
593+ } )
594+ . into ( ) ,
595+ ) ;
596+ }
597+ ra_ap_hir:: AdtId :: EnumId ( enum_id) => {
598+ let data = db. enum_data ( enum_id) ;
599+ let variants = data
600+ . variants
601+ . iter ( )
602+ . map ( |( enum_id, name) | {
603+ let data = db. enum_variant_data ( * enum_id) ;
604+ let content =
605+ emit_variant_data ( trap, data. variant_data . as_ref ( ) ) ;
606+ trap. emit ( generated:: EnumVariant {
607+ id : trap:: TrapId :: Star ,
608+ name : name. as_str ( ) . to_owned ( ) ,
609+ content,
610+ } )
611+ } )
612+ . collect ( ) ;
613+ types. push (
614+ trap. emit ( generated:: EnumItem {
615+ id : trap:: TrapId :: Star ,
616+ name : name. as_str ( ) . to_owned ( ) ,
617+ variants,
618+ } )
619+ . into ( ) ,
620+ ) ;
621+ }
622+ ra_ap_hir:: AdtId :: UnionId ( union_id) => {
623+ let data = db. union_data ( union_id) ;
624+ let content =
625+ emit_variant_data ( trap, data. variant_data . as_ref ( ) ) ;
626+ types. push (
627+ trap. emit ( generated:: StructItem {
628+ id : trap:: TrapId :: Star ,
629+ name : name. as_str ( ) . to_owned ( ) ,
630+ content,
631+ is_union : true ,
632+ } )
633+ . into ( ) ,
634+ ) ;
635+ }
636+ }
637+ }
638+ }
555639 }
556640 let label = trap. emit ( generated:: CrateModule {
557641 id : trap:: TrapId :: Star ,
558642 name : name. to_owned ( ) ,
559643 parent,
560644 values,
645+ types,
561646 } ) ;
562647 for ( name, child) in module
563648 . children
0 commit comments