Skip to content

Commit 3cae8b0

Browse files
committed
Rust: avoid duplication for functions and methods
1 parent 946e0e0 commit 3cae8b0

File tree

1 file changed

+35
-146
lines changed

1 file changed

+35
-146
lines changed

Diff for: rust/extractor/src/crate_graph.rs

+35-146
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ use crate::{
22
generated::{self},
33
trap::{self, TrapFile},
44
};
5+
use chalk_ir::FloatTy;
56
use chalk_ir::IntTy;
67
use chalk_ir::Scalar;
78
use chalk_ir::UintTy;
8-
use chalk_ir::{FloatTy, Safety};
99
use itertools::Itertools;
1010
use ra_ap_base_db::{Crate, RootQueryDb};
1111
use ra_ap_cfg::CfgAtom;
@@ -291,7 +291,7 @@ fn emit_module_items(
291291
{
292292
match value {
293293
ModuleDefId::FunctionId(function) => {
294-
items.extend(emit_function(db, name.as_str(), trap, function, vis));
294+
items.push(emit_function(db, trap, function, name).into());
295295
}
296296
ModuleDefId::ConstId(konst) => {
297297
items.extend(emit_const(db, name.as_str(), trap, konst, vis));
@@ -336,18 +336,10 @@ fn emit_module_items(
336336

337337
fn emit_function(
338338
db: &dyn HirDatabase,
339-
name: &str,
340339
trap: &mut TrapFile,
341340
function: ra_ap_hir_def::FunctionId,
342-
visibility: Visibility,
343-
) -> Option<trap::Label<generated::Item>> {
344-
let name = Some(trap.emit(generated::Name {
345-
id: trap::TrapId::Star,
346-
text: Some(name.to_owned()),
347-
}));
348-
let visibility = emit_visibility(db, trap, visibility);
349-
let generic_param_list = emit_generic_param_list(trap, db, function.into());
350-
let data = db.function_data(function);
341+
name: &ra_ap_hir::Name,
342+
) -> trap::Label<generated::Function> {
351343
let sig = db.callable_item_signature(function.into());
352344
let sig = sig.skip_binders();
353345
let params = sig
@@ -376,26 +368,35 @@ fn emit_function(
376368
type_repr: Some(ret_type),
377369
})
378370
});
379-
Some(
380-
trap.emit(generated::Function {
381-
id: trap::TrapId::Star,
382-
name,
383-
attrs: vec![],
384-
body: None,
385-
is_const: data.is_const(),
386-
is_default: data.is_default(),
387-
visibility,
388-
abi: None,
389-
is_async: data.is_async(),
390-
is_gen: false,
391-
is_unsafe: data.is_unsafe(),
392-
generic_param_list,
393-
param_list: Some(param_list),
394-
ret_type,
395-
where_clause: None,
396-
})
397-
.into(),
398-
)
371+
let name = Some(trap.emit(generated::Name {
372+
id: trap::TrapId::Star,
373+
text: Some(name.as_str().to_owned()),
374+
}));
375+
let data = db.function_data(function);
376+
let visibility = emit_visibility(
377+
db,
378+
trap,
379+
data.visibility
380+
.resolve(db.upcast(), &function.resolver(db.upcast())),
381+
);
382+
let generic_param_list = emit_generic_param_list(trap, db, function.into());
383+
trap.emit(generated::Function {
384+
id: trap::TrapId::Star,
385+
name,
386+
attrs: vec![],
387+
body: None,
388+
is_const: data.is_const(),
389+
is_default: data.is_default(),
390+
visibility,
391+
abi: None,
392+
is_async: data.is_async(),
393+
is_gen: false,
394+
is_unsafe: data.is_unsafe(),
395+
generic_param_list,
396+
param_list: Some(param_list),
397+
ret_type,
398+
where_clause: None,
399+
})
399400
}
400401

401402
fn emit_const(
@@ -662,60 +663,7 @@ fn emit_trait(
662663
.iter()
663664
.flat_map(|(name, item)| {
664665
if let AssocItemId::FunctionId(function) = item {
665-
let sig = db.callable_item_signature((*function).into());
666-
let sig = sig.skip_binders();
667-
let params = sig
668-
.params()
669-
.iter()
670-
.map(|p| {
671-
let type_repr = emit_hir_ty(trap, db, p);
672-
trap.emit(generated::Param {
673-
id: trap::TrapId::Star,
674-
attrs: vec![],
675-
type_repr,
676-
pat: None,
677-
})
678-
})
679-
.collect();
680-
681-
let ret_type = emit_hir_ty(trap, db, sig.ret());
682-
let param_list = trap.emit(generated::ParamList {
683-
id: trap::TrapId::Star,
684-
params,
685-
self_param: None,
686-
});
687-
let ret_type = ret_type.map(|ret_type| {
688-
trap.emit(generated::RetTypeRepr {
689-
id: trap::TrapId::Star,
690-
type_repr: Some(ret_type),
691-
})
692-
});
693-
let name = Some(trap.emit(generated::Name {
694-
id: trap::TrapId::Star,
695-
text: Some(name.as_str().to_owned()),
696-
}));
697-
let visibility = emit_visibility(db, trap, visibility);
698-
let generic_param_list = emit_generic_param_list(trap, db, (*function).into());
699-
Some(
700-
trap.emit(generated::Function {
701-
id: trap::TrapId::Star,
702-
name,
703-
attrs: vec![],
704-
body: None,
705-
is_const: false,
706-
is_default: false,
707-
visibility,
708-
abi: None,
709-
is_async: false,
710-
is_gen: false,
711-
is_unsafe: matches!(sig.to_fn_ptr().sig.safety, Safety::Unsafe),
712-
generic_param_list,
713-
param_list: Some(param_list),
714-
ret_type,
715-
where_clause: None,
716-
})
717-
.into(),
718-
)
666+
Some(emit_function(db, trap, *function, name).into())
719667
} else {
720668
None
721669
}
@@ -774,66 +722,7 @@ fn emit_module_impls(
774722
.iter()
775723
.flat_map(|item| {
776724
if let (name, AssocItemId::FunctionId(function)) = item {
777-
let sig = db.callable_item_signature((*function).into());
778-
let sig = sig.skip_binders();
779-
let params = sig
780-
.params()
781-
.iter()
782-
.map(|p| {
783-
let type_repr = emit_hir_ty(trap, db, p);
784-
trap.emit(generated::Param {
785-
id: trap::TrapId::Star,
786-
attrs: vec![],
787-
type_repr,
788-
pat: None,
789-
})
790-
})
791-
.collect();
792-
793-
let ret_type = emit_hir_ty(trap, db, sig.ret());
794-
let param_list = trap.emit(generated::ParamList {
795-
id: trap::TrapId::Star,
796-
params,
797-
self_param: None,
798-
});
799-
let ret_type = ret_type.map(|ret_type| {
800-
trap.emit(generated::RetTypeRepr {
801-
id: trap::TrapId::Star,
802-
type_repr: Some(ret_type),
803-
})
804-
});
805-
let name = Some(trap.emit(generated::Name {
806-
id: trap::TrapId::Star,
807-
text: Some(name.as_str().to_owned()),
808-
}));
809-
let data = db.function_data(*function);
810-
let visibility = emit_visibility(
811-
db,
812-
trap,
813-
data.visibility
814-
.resolve(db.upcast(), &function.resolver(db.upcast())),
815-
);
816-
let generic_param_list = emit_generic_param_list(trap, db, (*function).into());
817-
Some(
818-
trap.emit(generated::Function {
819-
id: trap::TrapId::Star,
820-
name,
821-
attrs: vec![],
822-
body: None,
823-
is_const: false,
824-
is_default: false,
825-
visibility,
826-
abi: None,
827-
is_async: false,
828-
is_gen: false,
829-
is_unsafe: matches!(sig.to_fn_ptr().sig.safety, Safety::Unsafe),
830-
generic_param_list,
831-
param_list: Some(param_list),
832-
ret_type,
833-
where_clause: None,
834-
})
835-
.into(),
836-
)
725+
Some(emit_function(db, trap, *function, name).into())
837726
} else {
838727
None
839728
}

0 commit comments

Comments
 (0)