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:
bors 2022-10-10 13:57:09 +00:00
commit deddad347b
4 changed files with 38 additions and 8 deletions

View file

@ -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)

View file

@ -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);
} }

View file

@ -1070,3 +1070,13 @@ fn main() {
"#, "#,
); );
} }
#[test]
fn cfg_params() {
check_types(
r#"
fn my_fn(#[cfg(feature = "feature")] u8: u8, u32: u32) {}
//^^^ u32
"#,
);
}

View file

@ -1,4 +1,4 @@
//! See `CompletionContext` structure. //! See [`CompletionContext`] structure.
mod analysis; mod analysis;
#[cfg(test)] #[cfg(test)]