Skip to content

Commit 960ca61

Browse files
committed
Rust: extract TypeItems
1 parent 2c428d6 commit 960ca61

File tree

1 file changed

+86
-1
lines changed

1 file changed

+86
-1
lines changed

rust/extractor/src/main.rs

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use ra_ap_base_db::{CrateId, SourceDatabase};
99
use ra_ap_cfg::CfgAtom;
1010
use ra_ap_hir::db::{DefDatabase, HirDatabase};
1111
use ra_ap_hir::{DefMap, ModPath, ModuleDefId, Semantics, TypeRef, Variant};
12+
use ra_ap_hir_def::data::adt::VariantData;
1213
use ra_ap_hir_def::LocalModuleId;
1314
use ra_ap_ide_db::line_index::{LineCol, LineIndex};
1415
use 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+
}
239264
impl<'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

Comments
 (0)