From 0b5e39919034d11c36655369f60cf9cc256743d0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 5 Jul 2019 19:40:02 +0300 Subject: use correct file for diagnostics closes #1475 --- crates/ra_hir/src/diagnostics.rs | 18 +++++++++++++++++- crates/ra_ide_api/src/diagnostics.rs | 13 +++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/crates/ra_hir/src/diagnostics.rs b/crates/ra_hir/src/diagnostics.rs index f5f2e65f3..c97f0656d 100644 --- a/crates/ra_hir/src/diagnostics.rs +++ b/crates/ra_hir/src/diagnostics.rs @@ -1,6 +1,6 @@ use std::{any::Any, fmt}; -use ra_syntax::{ast, AstPtr, SyntaxNode, SyntaxNodePtr, TextRange, TreeArc}; +use ra_syntax::{ast, AstNode, AstPtr, SyntaxNode, SyntaxNodePtr, TextRange, TreeArc}; use relative_path::RelativePathBuf; use crate::{HirDatabase, HirFileId, Name}; @@ -27,11 +27,17 @@ pub trait Diagnostic: Any + Send + Sync + fmt::Debug + 'static { fn as_any(&self) -> &(dyn Any + Send + 'static); } +pub trait AstDiagnostic { + type AST; + fn ast(&self, db: &impl HirDatabase) -> Self::AST; +} + impl dyn Diagnostic { pub fn syntax_node(&self, db: &impl HirDatabase) -> TreeArc { let node = db.parse_or_expand(self.file()).unwrap(); self.syntax_node_ptr().to_node(&*node).to_owned() } + pub fn downcast_ref(&self) -> Option<&D> { self.as_any().downcast_ref() } @@ -135,3 +141,13 @@ impl Diagnostic for MissingFields { self } } + +impl AstDiagnostic for MissingFields { + type AST = TreeArc; + + fn ast(&self, db: &impl HirDatabase) -> Self::AST { + let root = db.parse_or_expand(self.file()).unwrap(); + let node = self.syntax_node_ptr().to_node(&*root); + ast::NamedFieldList::cast(&node).unwrap().to_owned() + } +} diff --git a/crates/ra_ide_api/src/diagnostics.rs b/crates/ra_ide_api/src/diagnostics.rs index 9ab455b0e..a46289cba 100644 --- a/crates/ra_ide_api/src/diagnostics.rs +++ b/crates/ra_ide_api/src/diagnostics.rs @@ -1,7 +1,7 @@ use std::cell::RefCell; use hir::{ - diagnostics::{Diagnostic as _, DiagnosticSink}, + diagnostics::{AstDiagnostic, Diagnostic as _, DiagnosticSink}, source_binder, }; use itertools::Itertools; @@ -9,7 +9,7 @@ use ra_assists::ast_editor::{AstBuilder, AstEditor}; use ra_db::SourceDatabase; use ra_prof::profile; use ra_syntax::{ - ast::{self, AstNode, NamedField, NamedFieldList}, + ast::{self, AstNode, NamedField}, Location, SyntaxNode, TextRange, T, }; use ra_text_edit::{TextEdit, TextEditBuilder}; @@ -34,9 +34,7 @@ pub(crate) fn diagnostics(db: &RootDatabase, file_id: FileId) -> Vec fix: None, })); - let source_file = parse.tree; - - for node in source_file.syntax().descendants() { + for node in parse.tree.syntax().descendants() { check_unnecessary_braces_in_use_statement(&mut res, file_id, node); check_struct_shorthand_initialization(&mut res, file_id, node); } @@ -61,9 +59,8 @@ pub(crate) fn diagnostics(db: &RootDatabase, file_id: FileId) -> Vec }) }) .on::(|d| { - let syntax_node = d.syntax_node_ptr(); - let node = NamedFieldList::cast(syntax_node.to_node(source_file.syntax())).unwrap(); - let mut ast_editor = AstEditor::new(node); + let node = d.ast(db); + let mut ast_editor = AstEditor::new(&*node); for f in d.missed_fields.iter() { ast_editor.append_field(&AstBuilder::::from_name(f)); } -- cgit v1.2.3