From 16c740526233b01980efdbb680b55718a71bb0e1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 14 May 2019 01:42:59 +0300 Subject: expand to syntax node --- crates/ra_hir/src/db.rs | 6 +++--- crates/ra_hir/src/diagnostics.rs | 6 +++--- crates/ra_hir/src/ids.rs | 24 ++++++++++++------------ crates/ra_hir/src/nameres/raw.rs | 7 +++++-- crates/ra_hir/src/source_id.rs | 14 +++++++++----- 5 files changed, 32 insertions(+), 25 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index 8f98ca3a5..8e827d4f5 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -1,6 +1,6 @@ use std::sync::{Arc, Mutex}; -use ra_syntax::{SyntaxNode, TreeArc, SourceFile, SmolStr, ast}; +use ra_syntax::{SyntaxNode, TreeArc, SmolStr, ast}; use ra_db::{SourceDatabase, salsa}; use crate::{ @@ -54,8 +54,8 @@ pub trait DefDatabase: SourceDatabase { #[salsa::invoke(crate::ids::macro_expand_query)] fn macro_expand(&self, macro_call: ids::MacroCallId) -> Result, String>; - #[salsa::invoke(crate::ids::HirFileId::hir_parse_query)] - fn hir_parse(&self, file_id: HirFileId) -> TreeArc; + #[salsa::invoke(crate::ids::HirFileId::parse_or_expand_query)] + fn parse_or_expand(&self, file_id: HirFileId) -> Option>; #[salsa::invoke(crate::adt::StructData::struct_data_query)] fn struct_data(&self, s: Struct) -> Arc; diff --git a/crates/ra_hir/src/diagnostics.rs b/crates/ra_hir/src/diagnostics.rs index d41525779..4b7b2dbee 100644 --- a/crates/ra_hir/src/diagnostics.rs +++ b/crates/ra_hir/src/diagnostics.rs @@ -1,6 +1,6 @@ use std::{fmt, any::Any}; -use ra_syntax::{SyntaxNodePtr, TreeArc, AstPtr, TextRange, ast, SyntaxNode, AstNode}; +use ra_syntax::{SyntaxNodePtr, TreeArc, AstPtr, TextRange, ast, SyntaxNode}; use relative_path::RelativePathBuf; use crate::{HirFileId, HirDatabase, Name}; @@ -29,8 +29,8 @@ pub trait Diagnostic: Any + Send + Sync + fmt::Debug + 'static { impl dyn Diagnostic { pub fn syntax_node(&self, db: &impl HirDatabase) -> TreeArc { - let source_file = db.hir_parse(self.file()); - self.syntax_node_ptr().to_node(source_file.syntax()).to_owned() + 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() diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index 357ef2a80..659b21f72 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs @@ -4,7 +4,7 @@ use std::{ }; use ra_db::{FileId, salsa}; -use ra_syntax::{TreeArc, SourceFile, AstNode, ast}; +use ra_syntax::{TreeArc, AstNode, ast, SyntaxNode}; use mbe::MacroRules; use crate::{ @@ -56,17 +56,17 @@ impl HirFileId { } } - pub(crate) fn hir_parse_query( + pub(crate) fn parse_or_expand_query( db: &impl DefDatabase, file_id: HirFileId, - ) -> TreeArc { + ) -> Option> { match file_id.0 { - HirFileIdRepr::File(file_id) => db.parse(file_id), + HirFileIdRepr::File(file_id) => Some(db.parse(file_id).syntax().to_owned()), HirFileIdRepr::Macro(macro_file) => { let macro_call_id = macro_file.macro_call_id; - let tt = match db.macro_expand(macro_call_id) { - Ok(it) => it, - Err(err) => { + let tt = db + .macro_expand(macro_call_id) + .map_err(|err| { // Note: // The final goal we would like to make all parse_macro success, // such that the following log will not call anyway. @@ -75,12 +75,12 @@ impl HirFileId { err, macro_call_id.debug_dump(db) ); - // returning an empty string looks fishy... - return SourceFile::parse(""); - } - }; + }) + .ok()?; match macro_file.macro_file_kind { - MacroFileKind::Items => mbe::token_tree_to_ast_item_list(&tt), + MacroFileKind::Items => { + Some(mbe::token_tree_to_ast_item_list(&tt).syntax().to_owned()) + } } } } diff --git a/crates/ra_hir/src/nameres/raw.rs b/crates/ra_hir/src/nameres/raw.rs index 211e02068..bd32b264b 100644 --- a/crates/ra_hir/src/nameres/raw.rs +++ b/crates/ra_hir/src/nameres/raw.rs @@ -75,8 +75,11 @@ impl RawItems { source_ast_id_map: db.ast_id_map(file_id.into()), source_map: ImportSourceMap::default(), }; - let source_file = db.hir_parse(file_id); - collector.process_module(None, &*source_file); + if let Some(node) = db.parse_or_expand(file_id) { + if let Some(source_file) = ast::SourceFile::cast(&node) { + collector.process_module(None, &*source_file); + } + } (Arc::new(collector.raw_items), Arc::new(collector.source_map)) } diff --git a/crates/ra_hir/src/source_id.rs b/crates/ra_hir/src/source_id.rs index 7a39be779..13f548eaf 100644 --- a/crates/ra_hir/src/source_id.rs +++ b/crates/ra_hir/src/source_id.rs @@ -81,15 +81,19 @@ pub struct ErasedFileAstId(RawId); impl_arena_id!(ErasedFileAstId); /// Maps items' `SyntaxNode`s to `ErasedFileAstId`s and back. -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, Default)] pub struct AstIdMap { arena: Arena, } impl AstIdMap { pub(crate) fn ast_id_map_query(db: &impl DefDatabase, file_id: HirFileId) -> Arc { - let source_file = db.hir_parse(file_id); - Arc::new(AstIdMap::from_source(source_file.syntax())) + let map = if let Some(node) = db.parse_or_expand(file_id) { + AstIdMap::from_source(&*node) + } else { + AstIdMap::default() + }; + Arc::new(map) } pub(crate) fn file_item_query( @@ -97,8 +101,8 @@ impl AstIdMap { file_id: HirFileId, ast_id: ErasedFileAstId, ) -> TreeArc { - let source_file = db.hir_parse(file_id); - db.ast_id_map(file_id).arena[ast_id].to_node(source_file.syntax()).to_owned() + let node = db.parse_or_expand(file_id).unwrap(); + db.ast_id_map(file_id).arena[ast_id].to_node(&*node).to_owned() } pub(crate) fn ast_id(&self, item: &N) -> FileAstId { -- cgit v1.2.3