Skip to content

Commit f08e00a

Browse files
committed
Rust: extract types in crates
1 parent 70934d3 commit f08e00a

File tree

1 file changed

+93
-169
lines changed

1 file changed

+93
-169
lines changed

rust/extractor/src/main.rs

+93-169
Original file line numberDiff line numberDiff line change
@@ -40,35 +40,11 @@ struct Extractor<'a> {
4040
steps: Vec<ExtractionStep>,
4141
}
4242

43-
fn emit_hir_path(
44-
trap: &mut TrapFile,
45-
path: &ra_ap_hir_def::path::Path,
46-
) -> trap::Label<generated::Path> {
47-
let part = path.segments().last().map(|segment| {
48-
let name_ref = trap.emit(generated::NameRef {
49-
id: trap::TrapId::Star,
50-
text: Some(segment.name.as_str().to_owned()),
51-
});
52-
trap.emit(generated::PathSegment {
53-
id: trap::TrapId::Star,
54-
generic_arg_list: None,
55-
name_ref: Some(name_ref),
56-
param_list: None,
57-
path_type: None,
58-
ret_type: None,
59-
return_type_syntax: None,
60-
type_repr: None,
61-
})
62-
});
63-
let qualifier = path
64-
.mod_path()
65-
.filter(|p| !p.segments().is_empty())
66-
.and_then(|_| path.qualifier().as_ref().map(|p| emit_hir_path(trap, p)));
67-
trap.emit(generated::Path {
68-
id: trap::TrapId::Star,
69-
qualifier,
70-
part,
71-
})
43+
fn emit_hir_path(path: &ra_ap_hir_def::path::Path) -> Vec<String> {
44+
path.segments()
45+
.iter()
46+
.map(|x| x.name.as_str().to_owned())
47+
.collect()
7248
}
7349
fn emit_hir_fn(
7450
trap: &mut TrapFile,
@@ -78,162 +54,113 @@ fn emit_hir_fn(
7854
is_async: bool,
7955
is_const: bool,
8056
is_unsafe: bool,
81-
) -> trap::Label<generated::FnPtrTypeRepr> {
82-
let ret = emit_hir_typeref(trap, ret_type);
57+
) -> trap::Label<generated::FunctionType> {
58+
let ret_type = emit_hir_typeref(trap, ret_type);
8359

84-
let ret = trap.emit(generated::RetTypeRepr {
85-
id: trap::TrapId::Star,
86-
type_repr: ret,
87-
});
88-
let self_param = self_type.map(|ty| {
89-
let type_repr = emit_hir_typeref(trap, ty);
90-
trap.emit(generated::SelfParam {
91-
id: trap::TrapId::Star,
92-
attrs: vec![],
93-
type_repr,
94-
is_mut: false,
95-
lifetime: None,
96-
name: None,
97-
})
98-
});
99-
let params = params
100-
.iter()
101-
.map(|t| {
102-
let type_repr = emit_hir_typeref(trap, t);
103-
trap.emit(generated::Param {
104-
id: trap::TrapId::Star,
105-
attrs: vec![],
106-
type_repr,
107-
pat: None,
108-
})
109-
})
110-
.collect();
111-
let params = trap.emit(generated::ParamList {
112-
id: trap::TrapId::Star,
113-
params,
114-
self_param,
115-
});
116-
trap.emit(generated::FnPtrTypeRepr {
60+
let self_type = self_type.map(|ty| emit_hir_typeref(trap, ty));
61+
let params = params.iter().map(|t| emit_hir_typeref(trap, t)).collect();
62+
63+
trap.emit(generated::FunctionType {
11764
id: trap::TrapId::Star,
118-
abi: None,
11965
is_async,
12066
is_const,
12167
is_unsafe,
122-
param_list: Some(params),
123-
ret_type: Some(ret),
68+
self_type,
69+
ret_type,
70+
params,
71+
has_varargs: false,
12472
})
12573
}
126-
fn emit_hir_typeref(trap: &mut TrapFile, ty: &TypeRef) -> Option<trap::Label<generated::TypeRepr>> {
74+
fn emit_hir_typeref(trap: &mut TrapFile, ty: &TypeRef) -> trap::Label<generated::Type> {
12775
match ty {
128-
TypeRef::Never => Some(
129-
trap.emit(generated::NeverTypeRepr {
76+
TypeRef::Never => trap
77+
.emit(generated::NeverType {
13078
id: trap::TrapId::Star,
13179
})
13280
.into(),
133-
),
134-
TypeRef::Placeholder => Some(
135-
trap.emit(generated::InferTypeRepr {
81+
82+
TypeRef::Placeholder => trap
83+
.emit(generated::PlaceholderType {
13684
id: trap::TrapId::Star,
13785
})
13886
.into(),
139-
),
87+
14088
TypeRef::Tuple(fields) => {
14189
let fields = fields
14290
.iter()
143-
.flat_map(|field| emit_hir_typeref(trap, field))
91+
.map(|field| emit_hir_typeref(trap, field))
14492
.collect();
145-
Some(
146-
trap.emit(generated::TupleTypeRepr {
147-
id: trap::TrapId::Star,
148-
fields,
149-
})
150-
.into(),
151-
)
93+
94+
trap.emit(generated::TupleType {
95+
id: trap::TrapId::Star,
96+
fields,
97+
})
98+
.into()
15299
}
153100
TypeRef::RawPtr(type_ref, mutability) => {
154-
let type_repr = emit_hir_typeref(trap, type_ref);
155-
Some(
156-
trap.emit(generated::PtrTypeRepr {
157-
id: trap::TrapId::Star,
158-
is_const: mutability.is_shared(),
159-
is_mut: mutability.is_mut(),
160-
type_repr,
161-
})
162-
.into(),
163-
)
101+
let type_ = emit_hir_typeref(trap, type_ref);
102+
103+
trap.emit(generated::RawPtrType {
104+
id: trap::TrapId::Star,
105+
is_mut: mutability.is_mut(),
106+
type_,
107+
})
108+
.into()
164109
}
165110
TypeRef::Reference(type_ref, lifetime_ref, mutability) => {
166-
let type_repr = emit_hir_typeref(trap, type_ref);
167-
let lifetime = lifetime_ref.as_ref().map(|x| {
168-
trap.emit(generated::Lifetime {
169-
id: trap::TrapId::Star,
170-
text: Some(x.name.as_str().to_owned()),
171-
})
172-
});
173-
Some(
174-
trap.emit(generated::RefTypeRepr {
175-
id: trap::TrapId::Star,
176-
is_mut: mutability.is_mut(),
177-
type_repr,
178-
lifetime,
179-
})
180-
.into(),
181-
)
111+
let type_ = emit_hir_typeref(trap, type_ref);
112+
let lifetime = lifetime_ref.as_ref().map(|x|x.name.as_str().to_owned());
113+
trap.emit(generated::ReferenceType {
114+
id: trap::TrapId::Star,
115+
is_mut: mutability.is_mut(),
116+
type_,
117+
lifetime,
118+
})
119+
.into()
182120
}
183121
TypeRef::Array(type_ref, _const_ref) => {
184-
let element_type_repr = emit_hir_typeref(trap, type_ref);
122+
let type_ = emit_hir_typeref(trap, type_ref);
185123
// TODO: handle array size constant
186-
let const_arg = None;
187-
Some(
188-
trap.emit(generated::ArrayTypeRepr {
189-
id: trap::TrapId::Star,
190-
element_type_repr,
191-
const_arg,
192-
})
193-
.into(),
194-
)
124+
trap.emit(generated::ArrayType {
125+
id: trap::TrapId::Star,
126+
type_,
127+
})
128+
.into()
195129
}
196130
TypeRef::Slice(type_ref) => {
197-
let type_repr = emit_hir_typeref(trap, type_ref);
198-
Some(
199-
trap.emit(generated::SliceTypeRepr {
200-
id: trap::TrapId::Star,
201-
type_repr,
202-
})
203-
.into(),
204-
)
131+
let type_ = emit_hir_typeref(trap, type_ref);
132+
trap.emit(generated::SliceType {
133+
id: trap::TrapId::Star,
134+
type_,
135+
})
136+
.into()
205137
}
206138
TypeRef::Fn(params, _, is_unsafe, _symbol) => {
207139
let (ret_type, params) = params.split_last().unwrap();
208140
let params: Vec<_> = params.as_ref().iter().map(|x| &x.1).collect();
209-
Some(
210-
emit_hir_fn(
211-
trap,
212-
None,
213-
&params[..],
214-
&ret_type.1,
215-
false,
216-
false,
217-
*is_unsafe,
218-
)
219-
.into(),
141+
emit_hir_fn(
142+
trap,
143+
None,
144+
&params[..],
145+
&ret_type.1,
146+
false,
147+
false,
148+
*is_unsafe,
220149
)
150+
.into()
221151
}
222152
TypeRef::Path(path) => {
223-
let path = Some(emit_hir_path(trap, path));
224-
225-
Some(
226-
trap.emit(generated::PathTypeRepr {
227-
id: trap::TrapId::Star,
228-
path,
229-
})
230-
.into(),
231-
)
153+
let path = emit_hir_path(path);
154+
trap.emit(generated::PathType {
155+
id: trap::TrapId::Star,
156+
path,
157+
})
158+
.into()
232159
}
233-
TypeRef::ImplTrait(_) => None, // TODO handle impl
234-
TypeRef::DynTrait(_) => None, // TODO handle dyn
235-
TypeRef::Macro(_) => None,
236-
TypeRef::Error => None,
160+
TypeRef::ImplTrait(_) | // TODO handle impl
161+
TypeRef::DynTrait(_) | // TODO handle dyn
162+
TypeRef::Macro(_) |
163+
TypeRef::Error => trap.emit(generated::ErrorType { id: trap::TrapId::Star, }) .into(),
237164
}
238165
}
239166

@@ -246,10 +173,9 @@ fn emit_variant_data(
246173
let mut types = Vec::new();
247174
let mut fields = Vec::new();
248175
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-
}
176+
let tp = emit_hir_typeref(trap, &field.type_ref);
177+
fields.push(field.name.as_str().to_owned());
178+
types.push(tp);
253179
}
254180
Some(trap.emit(generated::VariantData {
255181
id: trap::TrapId::Star,
@@ -509,23 +435,21 @@ impl<'a> Extractor<'a> {
509435
}
510436
ModuleDefId::ConstId(konst) => {
511437
let konst = db.const_data(konst);
512-
if let Some(type_) = emit_hir_typeref(trap, &konst.type_ref) {
513-
values.push(trap.emit(generated::ValueItem {
514-
id: trap::TrapId::Star,
515-
name: name.as_str().to_owned(),
516-
type_,
517-
}));
518-
}
438+
let type_ = emit_hir_typeref(trap, &konst.type_ref);
439+
values.push(trap.emit(generated::ValueItem {
440+
id: trap::TrapId::Star,
441+
name: name.as_str().to_owned(),
442+
type_,
443+
}));
519444
}
520445
ModuleDefId::StaticId(statik) => {
521446
let statik = db.static_data(statik);
522-
if let Some(type_) = emit_hir_typeref(trap, &statik.type_ref) {
523-
values.push(trap.emit(generated::ValueItem {
524-
id: trap::TrapId::Star,
525-
name: name.as_str().to_owned(),
526-
type_,
527-
}));
528-
}
447+
let type_ = emit_hir_typeref(trap, &statik.type_ref);
448+
values.push(trap.emit(generated::ValueItem {
449+
id: trap::TrapId::Star,
450+
name: name.as_str().to_owned(),
451+
type_,
452+
}));
529453
}
530454
ModuleDefId::EnumVariantId(variant_id) => {
531455
let variant: Variant = variant_id.into();
@@ -548,7 +472,7 @@ impl<'a> Extractor<'a> {
548472
let variant_data = db.enum_variant_data(variant_id);
549473
let type_ = match variant_data.variant_data.as_ref() {
550474
ra_ap_hir_def::data::adt::VariantData::Unit => {
551-
emit_hir_typeref(trap, &ret_type)
475+
Some(emit_hir_typeref(trap, &ret_type))
552476
}
553477
ra_ap_hir_def::data::adt::VariantData::Tuple(arena) => {
554478
let params: Vec<_> =

0 commit comments

Comments
 (0)