Skip to content

Commit db4306d

Browse files
committed
Rust: avoid duplication for functions and methods
1 parent 0545f78 commit db4306d

File tree

1 file changed

+35
-146
lines changed

1 file changed

+35
-146
lines changed

rust/extractor/src/crate_graph.rs

Lines changed: 35 additions & 146 deletions
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;
@@ -296,7 +296,7 @@ fn emit_module_items(
296296
{
297297
match value {
298298
ModuleDefId::FunctionId(function) => {
299-
items.extend(emit_function(db, name.as_str(), trap, function, vis));
299+
items.push(emit_function(db, trap, function, name).into());
300300
}
301301
ModuleDefId::ConstId(konst) => {
302302
items.extend(emit_const(db, name.as_str(), trap, konst, vis));
@@ -341,18 +341,10 @@ fn emit_module_items(
341341

342342
fn emit_function(
343343
db: &dyn HirDatabase,
344-
name: &str,
345344
trap: &mut TrapFile,
346345
function: ra_ap_hir_def::FunctionId,
347-
visibility: Visibility,
348-
) -> Option<trap::Label<generated::Item>> {
349-
let name = Some(trap.emit(generated::Name {
350-
id: trap::TrapId::Star,
351-
text: Some(name.to_owned()),
352-
}));
353-
let visibility = emit_visibility(db, trap, visibility);
354-
let generic_param_list = emit_generic_param_list(trap, db, function.into());
355-
let data = db.function_data(function);
346+
name: &ra_ap_hir::Name,
347+
) -> trap::Label<generated::Function> {
356348
let sig = db.callable_item_signature(function.into());
357349
let sig = sig.skip_binders();
358350
let params = sig
@@ -381,26 +373,35 @@ fn emit_function(
381373
type_repr: Some(ret_type),
382374
})
383375
});
384-
Some(
385-
trap.emit(generated::Function {
386-
id: trap::TrapId::Star,
387-
name,
388-
attrs: vec![],
389-
body: None,
390-
is_const: data.is_const(),
391-
is_default: data.is_default(),
392-
visibility,
393-
abi: None,
394-
is_async: data.is_async(),
395-
is_gen: false,
396-
is_unsafe: data.is_unsafe(),
397-
generic_param_list,
398-
param_list: Some(param_list),
399-
ret_type,
400-
where_clause: None,
401-
})
402-
.into(),
403-
)
376+
let name = Some(trap.emit(generated::Name {
377+
id: trap::TrapId::Star,
378+
text: Some(name.as_str().to_owned()),
379+
}));
380+
let data = db.function_data(function);
381+
let visibility = emit_visibility(
382+
db,
383+
trap,
384+
data.visibility
385+
.resolve(db.upcast(), &function.resolver(db.upcast())),
386+
);
387+
let generic_param_list = emit_generic_param_list(trap, db, function.into());
388+
trap.emit(generated::Function {
389+
id: trap::TrapId::Star,
390+
name,
391+
attrs: vec![],
392+
body: None,
393+
is_const: data.is_const(),
394+
is_default: data.is_default(),
395+
visibility,
396+
abi: None,
397+
is_async: data.is_async(),
398+
is_gen: false,
399+
is_unsafe: data.is_unsafe(),
400+
generic_param_list,
401+
param_list: Some(param_list),
402+
ret_type,
403+
where_clause: None,
404+
})
404405
}
405406

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

0 commit comments

Comments
 (0)