Auto merge of #16497 - evertedsphere:swann/fix-inline-for-macro-generated-method, r=Veykril
Fix incorrect inlining of functions that come from MBE macros Partial fix for https://github.com/rust-lang/rust-analyzer/issues/16471. As a reminder, there are two issues there: 1. missing whitespace in parameter types (the first test) 2. the `self` parameter not being replaced by `this` in the function body (the second test) The first part is fixed in this PR. See [this comment](https://github.com/rust-lang/rust-analyzer/pull/16497#issuecomment-1934243409) for the second.
This commit is contained in:
commit
aa97edb214
1 changed files with 61 additions and 1 deletions
|
|
@ -415,7 +415,24 @@ fn inline(
|
|||
let expr: &ast::Expr = expr;
|
||||
|
||||
let mut insert_let_stmt = || {
|
||||
let ty = sema.type_of_expr(expr).filter(TypeInfo::has_adjustment).and(param_ty.clone());
|
||||
let param_ty = match param_ty {
|
||||
None => None,
|
||||
Some(param_ty) => {
|
||||
if sema.hir_file_for(param_ty.syntax()).is_macro() {
|
||||
if let Some(param_ty) =
|
||||
ast::Type::cast(insert_ws_into(param_ty.syntax().clone()))
|
||||
{
|
||||
Some(param_ty)
|
||||
} else {
|
||||
Some(param_ty.clone_for_update())
|
||||
}
|
||||
} else {
|
||||
Some(param_ty.clone_for_update())
|
||||
}
|
||||
}
|
||||
};
|
||||
let ty: Option<syntax::ast::Type> =
|
||||
sema.type_of_expr(expr).filter(TypeInfo::has_adjustment).and(param_ty);
|
||||
|
||||
let is_self = param
|
||||
.name(sema.db)
|
||||
|
|
@ -1732,6 +1749,49 @@ pub fn main() {
|
|||
this.0 += 1;
|
||||
};
|
||||
}
|
||||
"#,
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn inline_call_with_reference_in_macros() {
|
||||
check_assist(
|
||||
inline_call,
|
||||
r#"
|
||||
fn _write_u64(s: &mut u64, x: u64) {
|
||||
*s += x;
|
||||
}
|
||||
macro_rules! impl_write {
|
||||
($(($ty:ident, $meth:ident),)*) => {$(
|
||||
fn _hash(inner_self_: &u64, state: &mut u64) {
|
||||
$meth(state, *inner_self_)
|
||||
}
|
||||
)*}
|
||||
}
|
||||
impl_write! { (u64, _write_u64), }
|
||||
fn _hash2(self_: &u64, state: &mut u64) {
|
||||
$0_hash(&self_, state);
|
||||
}
|
||||
"#,
|
||||
r#"
|
||||
fn _write_u64(s: &mut u64, x: u64) {
|
||||
*s += x;
|
||||
}
|
||||
macro_rules! impl_write {
|
||||
($(($ty:ident, $meth:ident),)*) => {$(
|
||||
fn _hash(inner_self_: &u64, state: &mut u64) {
|
||||
$meth(state, *inner_self_)
|
||||
}
|
||||
)*}
|
||||
}
|
||||
impl_write! { (u64, _write_u64), }
|
||||
fn _hash2(self_: &u64, state: &mut u64) {
|
||||
{
|
||||
let inner_self_: &u64 = &self_;
|
||||
let state: &mut u64 = state;
|
||||
_write_u64(state, *inner_self_)
|
||||
};
|
||||
}
|
||||
"#,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue