diff --git a/crates/hir_ty/src/diagnostics.rs b/crates/hir_ty/src/diagnostics.rs index f2e06495e32..dfe98571e71 100644 --- a/crates/hir_ty/src/diagnostics.rs +++ b/crates/hir_ty/src/diagnostics.rs @@ -267,7 +267,7 @@ impl fmt::Display for CaseType { #[derive(Debug)] pub struct IncorrectCase { pub file: HirFileId, - pub ident: SyntaxNodePtr, + pub ident: AstPtr, pub expected_case: CaseType, pub ident_type: String, pub ident_text: String, @@ -290,7 +290,7 @@ impl Diagnostic for IncorrectCase { } fn display_source(&self) -> InFile { - InFile::new(self.file, self.ident.clone()) + InFile::new(self.file, self.ident.clone().into()) } fn as_any(&self) -> &(dyn Any + Send + 'static) { diff --git a/crates/hir_ty/src/diagnostics/decl_check.rs b/crates/hir_ty/src/diagnostics/decl_check.rs index 1f9386b751a..f987636fe57 100644 --- a/crates/hir_ty/src/diagnostics/decl_check.rs +++ b/crates/hir_ty/src/diagnostics/decl_check.rs @@ -213,12 +213,21 @@ impl<'a, 'b> DeclValidator<'a, 'b> { for param_to_rename in fn_param_replacements { // We assume that parameters in replacement are in the same order as in the // actual params list, but just some of them (ones that named correctly) are skipped. - let ast_ptr = loop { + let ast_ptr: ast::Name = loop { match fn_params_iter.next() { Some(element) if pat_equals_to_name(element.pat(), ¶m_to_rename.current_name) => { - break element.pat().unwrap() + if let ast::Pat::IdentPat(pat) = element.pat().unwrap() { + break pat.name().unwrap(); + } else { + // This is critical. If we consider this parameter the expected one, + // it **must** have a name. + panic!( + "Pattern {:?} equals to expected replacement {:?}, but has no name", + element, param_to_rename + ); + } } Some(_) => {} None => { diff --git a/crates/ide/src/diagnostics/fixes.rs b/crates/ide/src/diagnostics/fixes.rs index 286ef07850b..b47fe046911 100644 --- a/crates/ide/src/diagnostics/fixes.rs +++ b/crates/ide/src/diagnostics/fixes.rs @@ -104,8 +104,11 @@ impl DiagnosticWithFix for MissingOkInTailExpr { impl DiagnosticWithFix for IncorrectCase { fn fix(&self, sema: &Semantics) -> Option { + let root = sema.db.parse_or_expand(self.file)?; + let name_node = self.ident.to_node(&root); + let file_id = self.file.original_file(sema.db); - let offset = self.ident.text_range().start(); + let offset = name_node.syntax().text_range().start(); let file_position = FilePosition { file_id, offset }; let rename_changes = rename_with_semantics(sema, file_position, &self.suggested_text)?; diff --git a/crates/syntax/src/ptr.rs b/crates/syntax/src/ptr.rs index 34e20464a79..d3fb7a5d98f 100644 --- a/crates/syntax/src/ptr.rs +++ b/crates/syntax/src/ptr.rs @@ -23,10 +23,6 @@ impl SyntaxNodePtr { SyntaxNodePtr { range: node.text_range(), kind: node.kind() } } - pub fn text_range(&self) -> TextRange { - self.range.clone() - } - pub fn to_node(&self, root: &SyntaxNode) -> SyntaxNode { assert!(root.parent().is_none()); successors(Some(root.clone()), |node| {