aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_def/src/data.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_def/src/data.rs')
-rw-r--r--crates/hir_def/src/data.rs15
1 files changed, 11 insertions, 4 deletions
diff --git a/crates/hir_def/src/data.rs b/crates/hir_def/src/data.rs
index f9bb0c6da..e976e419e 100644
--- a/crates/hir_def/src/data.rs
+++ b/crates/hir_def/src/data.rs
@@ -36,18 +36,25 @@ impl FunctionData {
36 pub(crate) fn fn_data_query(db: &dyn DefDatabase, func: FunctionId) -> Arc<FunctionData> { 36 pub(crate) fn fn_data_query(db: &dyn DefDatabase, func: FunctionId) -> Arc<FunctionData> {
37 let loc = func.lookup(db); 37 let loc = func.lookup(db);
38 let krate = loc.container.module(db).krate; 38 let krate = loc.container.module(db).krate;
39 let crate_graph = db.crate_graph();
40 let cfg_options = &crate_graph[krate].cfg_options;
39 let item_tree = db.item_tree(loc.id.file_id); 41 let item_tree = db.item_tree(loc.id.file_id);
40 let func = &item_tree[loc.id.value]; 42 let func = &item_tree[loc.id.value];
41 let is_varargs = func 43
44 let enabled_params = func
42 .params 45 .params
43 .clone() 46 .clone()
44 .last() 47 .filter(|&param| item_tree.attrs(db, krate, param.into()).is_cfg_enabled(cfg_options));
48
49 // If last cfg-enabled param is a `...` param, it's a varargs function.
50 let is_varargs = enabled_params
51 .clone()
52 .next_back()
45 .map_or(false, |param| matches!(item_tree[param], Param::Varargs)); 53 .map_or(false, |param| matches!(item_tree[param], Param::Varargs));
46 54
47 Arc::new(FunctionData { 55 Arc::new(FunctionData {
48 name: func.name.clone(), 56 name: func.name.clone(),
49 params: func 57 params: enabled_params
50 .params
51 .clone() 58 .clone()
52 .filter_map(|id| match &item_tree[id] { 59 .filter_map(|id| match &item_tree[id] {
53 Param::Normal(ty) => Some(item_tree[*ty].clone()), 60 Param::Normal(ty) => Some(item_tree[*ty].clone()),