Unnamed repository; edit this file 'description' to name the repository.
Merge #11943
11943: fix: Don't create `hir::Local`s from const path patterns r=Veykril a=Veykril Fixes https://github.com/rust-analyzer/rust-analyzer/issues/11941 Co-authored-by: Lukas Wirth <[email protected]>
bors[bot] 2022-04-09
parent e11959a · parent 9050db2 · commit 9093941
-rw-r--r--crates/hir/src/semantics/source_to_def.rs9
-rw-r--r--crates/ide_assists/src/handlers/inline_local_variable.rs14
2 files changed, 21 insertions, 2 deletions
diff --git a/crates/hir/src/semantics/source_to_def.rs b/crates/hir/src/semantics/source_to_def.rs
index 4672e7db40..5c4cfa7b45 100644
--- a/crates/hir/src/semantics/source_to_def.rs
+++ b/crates/hir/src/semantics/source_to_def.rs
@@ -213,10 +213,15 @@ impl SourceToDefCtx<'_, '_> {
src: InFile<ast::IdentPat>,
) -> Option<(DefWithBodyId, PatId)> {
let container = self.find_pat_or_label_container(src.syntax())?;
- let (_body, source_map) = self.db.body_with_source_map(container);
+ let (body, source_map) = self.db.body_with_source_map(container);
let src = src.map(ast::Pat::from);
let pat_id = source_map.node_pat(src.as_ref())?;
- Some((container, pat_id))
+ // the pattern could resolve to a constant, verify that that is not the case
+ if let crate::Pat::Bind { .. } = body[pat_id] {
+ Some((container, pat_id))
+ } else {
+ None
+ }
}
pub(super) fn self_param_to_def(
&mut self,
diff --git a/crates/ide_assists/src/handlers/inline_local_variable.rs b/crates/ide_assists/src/handlers/inline_local_variable.rs
index 0b4f46caf4..65dc2a0d51 100644
--- a/crates/ide_assists/src/handlers/inline_local_variable.rs
+++ b/crates/ide_assists/src/handlers/inline_local_variable.rs
@@ -938,4 +938,18 @@ fn f() {
"#,
);
}
+
+ #[test]
+ fn test_inline_let_unit_struct() {
+ check_assist_not_applicable(
+ inline_local_variable,
+ r#"
+struct S;
+fn f() {
+ let S$0 = S;
+ S;
+}
+"#,
+ );
+ }
}