From 1ccfd0cedae91065d2484920484dfdaee116d590 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 7 Apr 2021 21:43:38 -0700 Subject: Fix faulty assertion when extracting function with macro call --- crates/ide_assists/src/handlers/extract_function.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs index 5fdc8bf38..d84f51eae 100644 --- a/crates/ide_assists/src/handlers/extract_function.rs +++ b/crates/ide_assists/src/handlers/extract_function.rs @@ -787,7 +787,7 @@ impl HasTokenAtOffset for SyntaxNode { } } -/// find relevant `ast::PathExpr` for reference +/// find relevant `ast::Expr` for reference /// /// # Preconditions /// @@ -804,7 +804,6 @@ fn path_element_of_reference( stdx::never!(false, "cannot find path parent of variable usage: {:?}", token); None })?; - stdx::always!(matches!(path, ast::Expr::PathExpr(_))); Some(path) } -- cgit v1.2.3 From 24ab69c608e029d0146cd6b5b9e89f32a0483a34 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 8 Apr 2021 09:27:04 -0700 Subject: Add FIXME for macro case --- crates/ide_assists/src/handlers/extract_function.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs index d84f51eae..8e295098f 100644 --- a/crates/ide_assists/src/handlers/extract_function.rs +++ b/crates/ide_assists/src/handlers/extract_function.rs @@ -729,6 +729,14 @@ fn reference_is_exclusive( /// checks if this expr requires `&mut` access, recurses on field access fn expr_require_exclusive_access(ctx: &AssistContext, expr: &ast::Expr) -> Option { + match expr { + ast::Expr::MacroCall(_) => { + // FIXME: expand macro and check output for mutable usages of the variable? + return None; + } + _ => (), + } + let parent = expr.syntax().parent()?; if let Some(bin_expr) = ast::BinExpr::cast(parent.clone()) { @@ -804,6 +812,11 @@ fn path_element_of_reference( stdx::never!(false, "cannot find path parent of variable usage: {:?}", token); None })?; + stdx::always!( + matches!(path, ast::Expr::PathExpr(_) | ast::Expr::MacroCall(_)), + "unexpected expression type for variable usage: {:?}", + path + ); Some(path) } -- cgit v1.2.3 From 09a78caca403f1b4be8711d00519094896928e58 Mon Sep 17 00:00:00 2001 From: Brandon Date: Sun, 11 Apr 2021 11:12:02 -0700 Subject: Add macro test --- .../ide_assists/src/handlers/extract_function.rs | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs index 8e295098f..719f22053 100644 --- a/crates/ide_assists/src/handlers/extract_function.rs +++ b/crates/ide_assists/src/handlers/extract_function.rs @@ -3384,4 +3384,36 @@ fn foo() -> Result<(), i64> { }"##, ); } + + #[test] + fn param_usage_in_macro() { + check_assist( + extract_function, + r" +macro_rules! m { + ($val:expr) => { $val }; +} + +fn foo() { + let n = 1; + $0let k = n * m!(n);$0 + let m = k + 1; +}", + r" +macro_rules! m { + ($val:expr) => { $val }; +} + +fn foo() { + let n = 1; + let k = fun_name(n); + let m = k + 1; +} + +fn $0fun_name(n: i32) -> i32 { + let k = n * m!(n); + k +}", + ); + } } -- cgit v1.2.3