mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-28 21:05:13 +00:00
Auto merge of #13380 - Veykril:cfg-pat-params, r=Veykril
Honor cfg attributes on params when lowering their patterns Closes https://github.com/rust-lang/rust-analyzer/issues/13375
This commit is contained in:
commit
deddad347b
4 changed files with 38 additions and 8 deletions
|
@ -311,7 +311,20 @@ impl Body {
|
||||||
DefWithBodyId::FunctionId(f) => {
|
DefWithBodyId::FunctionId(f) => {
|
||||||
let f = f.lookup(db);
|
let f = f.lookup(db);
|
||||||
let src = f.source(db);
|
let src = f.source(db);
|
||||||
params = src.value.param_list();
|
params = src.value.param_list().map(|param_list| {
|
||||||
|
let item_tree = f.id.item_tree(db);
|
||||||
|
let func = &item_tree[f.id.value];
|
||||||
|
let krate = f.container.module(db).krate;
|
||||||
|
let crate_graph = db.crate_graph();
|
||||||
|
(
|
||||||
|
param_list,
|
||||||
|
func.params.clone().map(move |param| {
|
||||||
|
item_tree
|
||||||
|
.attrs(db, krate, param.into())
|
||||||
|
.is_cfg_enabled(&crate_graph[krate].cfg_options)
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
});
|
||||||
(src.file_id, f.module(db), src.value.body().map(ast::Expr::from))
|
(src.file_id, f.module(db), src.value.body().map(ast::Expr::from))
|
||||||
}
|
}
|
||||||
DefWithBodyId::ConstId(c) => {
|
DefWithBodyId::ConstId(c) => {
|
||||||
|
@ -334,6 +347,7 @@ impl Body {
|
||||||
let expander = Expander::new(db, file_id, module);
|
let expander = Expander::new(db, file_id, module);
|
||||||
let (mut body, source_map) = Body::new(db, expander, params, body);
|
let (mut body, source_map) = Body::new(db, expander, params, body);
|
||||||
body.shrink_to_fit();
|
body.shrink_to_fit();
|
||||||
|
|
||||||
(Arc::new(body), Arc::new(source_map))
|
(Arc::new(body), Arc::new(source_map))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -370,7 +384,7 @@ impl Body {
|
||||||
fn new(
|
fn new(
|
||||||
db: &dyn DefDatabase,
|
db: &dyn DefDatabase,
|
||||||
expander: Expander,
|
expander: Expander,
|
||||||
params: Option<ast::ParamList>,
|
params: Option<(ast::ParamList, impl Iterator<Item = bool>)>,
|
||||||
body: Option<ast::Expr>,
|
body: Option<ast::Expr>,
|
||||||
) -> (Body, BodySourceMap) {
|
) -> (Body, BodySourceMap) {
|
||||||
lower::lower(db, expander, params, body)
|
lower::lower(db, expander, params, body)
|
||||||
|
|
|
@ -77,7 +77,7 @@ impl<'a> LowerCtx<'a> {
|
||||||
pub(super) fn lower(
|
pub(super) fn lower(
|
||||||
db: &dyn DefDatabase,
|
db: &dyn DefDatabase,
|
||||||
expander: Expander,
|
expander: Expander,
|
||||||
params: Option<ast::ParamList>,
|
params: Option<(ast::ParamList, impl Iterator<Item = bool>)>,
|
||||||
body: Option<ast::Expr>,
|
body: Option<ast::Expr>,
|
||||||
) -> (Body, BodySourceMap) {
|
) -> (Body, BodySourceMap) {
|
||||||
ExprCollector {
|
ExprCollector {
|
||||||
|
@ -119,11 +119,13 @@ struct ExprCollector<'a> {
|
||||||
impl ExprCollector<'_> {
|
impl ExprCollector<'_> {
|
||||||
fn collect(
|
fn collect(
|
||||||
mut self,
|
mut self,
|
||||||
param_list: Option<ast::ParamList>,
|
param_list: Option<(ast::ParamList, impl Iterator<Item = bool>)>,
|
||||||
body: Option<ast::Expr>,
|
body: Option<ast::Expr>,
|
||||||
) -> (Body, BodySourceMap) {
|
) -> (Body, BodySourceMap) {
|
||||||
if let Some(param_list) = param_list {
|
if let Some((param_list, mut attr_enabled)) = param_list {
|
||||||
if let Some(self_param) = param_list.self_param() {
|
if let Some(self_param) =
|
||||||
|
param_list.self_param().filter(|_| attr_enabled.next().unwrap_or(false))
|
||||||
|
{
|
||||||
let ptr = AstPtr::new(&self_param);
|
let ptr = AstPtr::new(&self_param);
|
||||||
let param_pat = self.alloc_pat(
|
let param_pat = self.alloc_pat(
|
||||||
Pat::Bind {
|
Pat::Bind {
|
||||||
|
@ -139,7 +141,11 @@ impl ExprCollector<'_> {
|
||||||
self.body.params.push(param_pat);
|
self.body.params.push(param_pat);
|
||||||
}
|
}
|
||||||
|
|
||||||
for pat in param_list.params().filter_map(|param| param.pat()) {
|
for pat in param_list
|
||||||
|
.params()
|
||||||
|
.zip(attr_enabled)
|
||||||
|
.filter_map(|(param, enabled)| param.pat().filter(|_| enabled))
|
||||||
|
{
|
||||||
let param_pat = self.collect_pat(pat);
|
let param_pat = self.collect_pat(pat);
|
||||||
self.body.params.push(param_pat);
|
self.body.params.push(param_pat);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1070,3 +1070,13 @@ fn main() {
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cfg_params() {
|
||||||
|
check_types(
|
||||||
|
r#"
|
||||||
|
fn my_fn(#[cfg(feature = "feature")] u8: u8, u32: u32) {}
|
||||||
|
//^^^ u32
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//! See `CompletionContext` structure.
|
//! See [`CompletionContext`] structure.
|
||||||
|
|
||||||
mod analysis;
|
mod analysis;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Reference in a new issue