Skip to content

Commit e0ecf47

Browse files
committed
Rust: extract types in crates
1 parent ca8739a commit e0ecf47

File tree

1 file changed

+87
-159
lines changed

1 file changed

+87
-159
lines changed

rust/extractor/src/main.rs

Lines changed: 87 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -41,34 +41,9 @@ struct Extractor<'a> {
4141
}
4242

4343
fn emit_hir_path(
44-
trap: &mut TrapFile,
4544
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-
})
45+
) -> Vec<String> {
46+
path.segments().iter().map(|x| x.name.as_str().to_owned()).collect()
7247
}
7348
fn emit_hir_fn(
7449
trap: &mut TrapFile,
@@ -78,162 +53,116 @@ fn emit_hir_fn(
7853
is_async: bool,
7954
is_const: bool,
8055
is_unsafe: bool,
81-
) -> trap::Label<generated::FnPtrTypeRepr> {
82-
let ret = emit_hir_typeref(trap, ret_type);
56+
) -> trap::Label<generated::FunctionType> {
57+
let ret_type = emit_hir_typeref(trap, ret_type);
8358

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 {
59+
let self_type = self_type.map(|ty| emit_hir_typeref(trap, ty));
60+
let params = params.iter().map(|t| emit_hir_typeref(trap, t)).collect();
61+
62+
trap.emit(generated::FunctionType {
11763
id: trap::TrapId::Star,
118-
abi: None,
11964
is_async,
12065
is_const,
12166
is_unsafe,
122-
param_list: Some(params),
123-
ret_type: Some(ret),
67+
self_type,
68+
ret_type,
69+
params,
70+
has_varargs: false,
12471
})
12572
}
126-
fn emit_hir_typeref(trap: &mut TrapFile, ty: &TypeRef) -> Option<trap::Label<generated::TypeRepr>> {
73+
fn emit_hir_typeref(trap: &mut TrapFile, ty: &TypeRef) -> trap::Label<generated::Type> {
12774
match ty {
128-
TypeRef::Never => Some(
129-
trap.emit(generated::NeverTypeRepr {
75+
TypeRef::Never => trap
76+
.emit(generated::NeverType {
13077
id: trap::TrapId::Star,
13178
})
13279
.into(),
133-
),
134-
TypeRef::Placeholder => Some(
135-
trap.emit(generated::InferTypeRepr {
80+
81+
TypeRef::Placeholder => trap
82+
.emit(generated::PlaceholderType {
13683
id: trap::TrapId::Star,
13784
})
13885
.into(),
139-
),
86+
14087
TypeRef::Tuple(fields) => {
14188
let fields = fields
14289
.iter()
143-
.flat_map(|field| emit_hir_typeref(trap, field))
90+
.map(|field| emit_hir_typeref(trap, field))
14491
.collect();
145-
Some(
146-
trap.emit(generated::TupleTypeRepr {
147-
id: trap::TrapId::Star,
148-
fields,
149-
})
150-
.into(),
151-
)
92+
93+
trap.emit(generated::TupleType {
94+
id: trap::TrapId::Star,
95+
fields,
96+
})
97+
.into()
15298
}
15399
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-
)
100+
let type_ = emit_hir_typeref(trap, type_ref);
101+
102+
trap.emit(generated::RawPtrType {
103+
id: trap::TrapId::Star,
104+
is_mut: mutability.is_mut(),
105+
type_,
106+
})
107+
.into()
164108
}
165109
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-
)
110+
let type_ = emit_hir_typeref(trap, type_ref);
111+
let lifetime = lifetime_ref.as_ref().map(|x|
112+
x.name.as_str().to_owned()
113+
114+
);
115+
trap.emit(generated::ReferenceType {
116+
id: trap::TrapId::Star,
117+
is_mut: mutability.is_mut(),
118+
type_,
119+
lifetime,
120+
})
121+
.into()
182122
}
183123
TypeRef::Array(type_ref, _const_ref) => {
184-
let element_type_repr = emit_hir_typeref(trap, type_ref);
124+
let type_ = emit_hir_typeref(trap, type_ref);
185125
// 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-
)
126+
trap.emit(generated::ArrayType {
127+
id: trap::TrapId::Star,
128+
type_,
129+
})
130+
.into()
195131
}
196132
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-
)
133+
let type_ = emit_hir_typeref(trap, type_ref);
134+
trap.emit(generated::SliceType {
135+
id: trap::TrapId::Star,
136+
type_,
137+
})
138+
.into()
205139
}
206140
TypeRef::Fn(params, _, is_unsafe, _symbol) => {
207141
let (ret_type, params) = params.split_last().unwrap();
208142
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(),
143+
emit_hir_fn(
144+
trap,
145+
None,
146+
&params[..],
147+
&ret_type.1,
148+
false,
149+
false,
150+
*is_unsafe,
220151
)
152+
.into()
221153
}
222154
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-
)
155+
let path = emit_hir_path(path);
156+
trap.emit(generated::PathType {
157+
id: trap::TrapId::Star,
158+
path,
159+
})
160+
.into()
232161
}
233-
TypeRef::ImplTrait(_) => None, // TODO handle impl
234-
TypeRef::DynTrait(_) => None, // TODO handle dyn
235-
TypeRef::Macro(_) => None,
236-
TypeRef::Error => None,
162+
TypeRef::ImplTrait(_) | // TODO handle impl
163+
TypeRef::DynTrait(_) | // TODO handle dyn
164+
TypeRef::Macro(_) |
165+
TypeRef::Error => trap.emit(generated::ErrorType { id: trap::TrapId::Star, }) .into(),
237166
}
238167
}
239168

@@ -246,10 +175,9 @@ fn emit_variant_data(
246175
let mut types = Vec::new();
247176
let mut fields = Vec::new();
248177
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-
}
178+
let tp = emit_hir_typeref(trap, &field.type_ref) ;
179+
fields.push(field.name.as_str().to_owned());
180+
types.push(tp);
253181
}
254182
Some(trap.emit(generated::VariantData {
255183
id: trap::TrapId::Star,
@@ -509,23 +437,23 @@ impl<'a> Extractor<'a> {
509437
}
510438
ModuleDefId::ConstId(konst) => {
511439
let konst = db.const_data(konst);
512-
if let Some(type_) = emit_hir_typeref(trap, &konst.type_ref) {
440+
let type_ = emit_hir_typeref(trap, &konst.type_ref);
513441
values.push(trap.emit(generated::ValueItem {
514442
id: trap::TrapId::Star,
515443
name: name.as_str().to_owned(),
516444
type_,
517445
}));
518-
}
446+
519447
}
520448
ModuleDefId::StaticId(statik) => {
521449
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 {
450+
let type_ = emit_hir_typeref(trap, &statik.type_ref);
451+
values.push(trap.emit(generated::ValueItem {
524452
id: trap::TrapId::Star,
525453
name: name.as_str().to_owned(),
526454
type_,
527-
}));
528-
}
455+
}));
456+
529457
}
530458
ModuleDefId::EnumVariantId(variant_id) => {
531459
let variant: Variant = variant_id.into();
@@ -548,7 +476,7 @@ impl<'a> Extractor<'a> {
548476
let variant_data = db.enum_variant_data(variant_id);
549477
let type_ = match variant_data.variant_data.as_ref() {
550478
ra_ap_hir_def::data::adt::VariantData::Unit => {
551-
emit_hir_typeref(trap, &ret_type)
479+
Some(emit_hir_typeref(trap, &ret_type))
552480
}
553481
ra_ap_hir_def::data::adt::VariantData::Tuple(arena) => {
554482
let params: Vec<_> =

0 commit comments

Comments
 (0)