diff options
-rw-r--r-- | crates/ra_hir/src/db.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir/src/diagnostics.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir/src/ids.rs | 24 | ||||
-rw-r--r-- | crates/ra_hir/src/nameres/raw.rs | 7 | ||||
-rw-r--r-- | crates/ra_hir/src/source_id.rs | 14 | ||||
-rw-r--r-- | crates/ra_ide_api/src/change.rs | 2 |
6 files changed, 33 insertions, 26 deletions
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 @@ | |||
1 | use std::sync::{Arc, Mutex}; | 1 | use std::sync::{Arc, Mutex}; |
2 | 2 | ||
3 | use ra_syntax::{SyntaxNode, TreeArc, SourceFile, SmolStr, ast}; | 3 | use ra_syntax::{SyntaxNode, TreeArc, SmolStr, ast}; |
4 | use ra_db::{SourceDatabase, salsa}; | 4 | use ra_db::{SourceDatabase, salsa}; |
5 | 5 | ||
6 | use crate::{ | 6 | use crate::{ |
@@ -54,8 +54,8 @@ pub trait DefDatabase: SourceDatabase { | |||
54 | #[salsa::invoke(crate::ids::macro_expand_query)] | 54 | #[salsa::invoke(crate::ids::macro_expand_query)] |
55 | fn macro_expand(&self, macro_call: ids::MacroCallId) -> Result<Arc<tt::Subtree>, String>; | 55 | fn macro_expand(&self, macro_call: ids::MacroCallId) -> Result<Arc<tt::Subtree>, String>; |
56 | 56 | ||
57 | #[salsa::invoke(crate::ids::HirFileId::hir_parse_query)] | 57 | #[salsa::invoke(crate::ids::HirFileId::parse_or_expand_query)] |
58 | fn hir_parse(&self, file_id: HirFileId) -> TreeArc<SourceFile>; | 58 | fn parse_or_expand(&self, file_id: HirFileId) -> Option<TreeArc<SyntaxNode>>; |
59 | 59 | ||
60 | #[salsa::invoke(crate::adt::StructData::struct_data_query)] | 60 | #[salsa::invoke(crate::adt::StructData::struct_data_query)] |
61 | fn struct_data(&self, s: Struct) -> Arc<StructData>; | 61 | fn struct_data(&self, s: Struct) -> Arc<StructData>; |
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 @@ | |||
1 | use std::{fmt, any::Any}; | 1 | use std::{fmt, any::Any}; |
2 | 2 | ||
3 | use ra_syntax::{SyntaxNodePtr, TreeArc, AstPtr, TextRange, ast, SyntaxNode, AstNode}; | 3 | use ra_syntax::{SyntaxNodePtr, TreeArc, AstPtr, TextRange, ast, SyntaxNode}; |
4 | use relative_path::RelativePathBuf; | 4 | use relative_path::RelativePathBuf; |
5 | 5 | ||
6 | use crate::{HirFileId, HirDatabase, Name}; | 6 | use crate::{HirFileId, HirDatabase, Name}; |
@@ -29,8 +29,8 @@ pub trait Diagnostic: Any + Send + Sync + fmt::Debug + 'static { | |||
29 | 29 | ||
30 | impl dyn Diagnostic { | 30 | impl dyn Diagnostic { |
31 | pub fn syntax_node(&self, db: &impl HirDatabase) -> TreeArc<SyntaxNode> { | 31 | pub fn syntax_node(&self, db: &impl HirDatabase) -> TreeArc<SyntaxNode> { |
32 | let source_file = db.hir_parse(self.file()); | 32 | let node = db.parse_or_expand(self.file()).unwrap(); |
33 | self.syntax_node_ptr().to_node(source_file.syntax()).to_owned() | 33 | self.syntax_node_ptr().to_node(&*node).to_owned() |
34 | } | 34 | } |
35 | pub fn downcast_ref<D: Diagnostic>(&self) -> Option<&D> { | 35 | pub fn downcast_ref<D: Diagnostic>(&self) -> Option<&D> { |
36 | self.as_any().downcast_ref() | 36 | 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::{ | |||
4 | }; | 4 | }; |
5 | 5 | ||
6 | use ra_db::{FileId, salsa}; | 6 | use ra_db::{FileId, salsa}; |
7 | use ra_syntax::{TreeArc, SourceFile, AstNode, ast}; | 7 | use ra_syntax::{TreeArc, AstNode, ast, SyntaxNode}; |
8 | use mbe::MacroRules; | 8 | use mbe::MacroRules; |
9 | 9 | ||
10 | use crate::{ | 10 | use crate::{ |
@@ -56,17 +56,17 @@ impl HirFileId { | |||
56 | } | 56 | } |
57 | } | 57 | } |
58 | 58 | ||
59 | pub(crate) fn hir_parse_query( | 59 | pub(crate) fn parse_or_expand_query( |
60 | db: &impl DefDatabase, | 60 | db: &impl DefDatabase, |
61 | file_id: HirFileId, | 61 | file_id: HirFileId, |
62 | ) -> TreeArc<SourceFile> { | 62 | ) -> Option<TreeArc<SyntaxNode>> { |
63 | match file_id.0 { | 63 | match file_id.0 { |
64 | HirFileIdRepr::File(file_id) => db.parse(file_id), | 64 | HirFileIdRepr::File(file_id) => Some(db.parse(file_id).syntax().to_owned()), |
65 | HirFileIdRepr::Macro(macro_file) => { | 65 | HirFileIdRepr::Macro(macro_file) => { |
66 | let macro_call_id = macro_file.macro_call_id; | 66 | let macro_call_id = macro_file.macro_call_id; |
67 | let tt = match db.macro_expand(macro_call_id) { | 67 | let tt = db |
68 | Ok(it) => it, | 68 | .macro_expand(macro_call_id) |
69 | Err(err) => { | 69 | .map_err(|err| { |
70 | // Note: | 70 | // Note: |
71 | // The final goal we would like to make all parse_macro success, | 71 | // The final goal we would like to make all parse_macro success, |
72 | // such that the following log will not call anyway. | 72 | // such that the following log will not call anyway. |
@@ -75,12 +75,12 @@ impl HirFileId { | |||
75 | err, | 75 | err, |
76 | macro_call_id.debug_dump(db) | 76 | macro_call_id.debug_dump(db) |
77 | ); | 77 | ); |
78 | // returning an empty string looks fishy... | 78 | }) |
79 | return SourceFile::parse(""); | 79 | .ok()?; |
80 | } | ||
81 | }; | ||
82 | match macro_file.macro_file_kind { | 80 | match macro_file.macro_file_kind { |
83 | MacroFileKind::Items => mbe::token_tree_to_ast_item_list(&tt), | 81 | MacroFileKind::Items => { |
82 | Some(mbe::token_tree_to_ast_item_list(&tt).syntax().to_owned()) | ||
83 | } | ||
84 | } | 84 | } |
85 | } | 85 | } |
86 | } | 86 | } |
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 { | |||
75 | source_ast_id_map: db.ast_id_map(file_id.into()), | 75 | source_ast_id_map: db.ast_id_map(file_id.into()), |
76 | source_map: ImportSourceMap::default(), | 76 | source_map: ImportSourceMap::default(), |
77 | }; | 77 | }; |
78 | let source_file = db.hir_parse(file_id); | 78 | if let Some(node) = db.parse_or_expand(file_id) { |
79 | collector.process_module(None, &*source_file); | 79 | if let Some(source_file) = ast::SourceFile::cast(&node) { |
80 | collector.process_module(None, &*source_file); | ||
81 | } | ||
82 | } | ||
80 | (Arc::new(collector.raw_items), Arc::new(collector.source_map)) | 83 | (Arc::new(collector.raw_items), Arc::new(collector.source_map)) |
81 | } | 84 | } |
82 | 85 | ||
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); | |||
81 | impl_arena_id!(ErasedFileAstId); | 81 | impl_arena_id!(ErasedFileAstId); |
82 | 82 | ||
83 | /// Maps items' `SyntaxNode`s to `ErasedFileAstId`s and back. | 83 | /// Maps items' `SyntaxNode`s to `ErasedFileAstId`s and back. |
84 | #[derive(Debug, PartialEq, Eq)] | 84 | #[derive(Debug, PartialEq, Eq, Default)] |
85 | pub struct AstIdMap { | 85 | pub struct AstIdMap { |
86 | arena: Arena<ErasedFileAstId, SyntaxNodePtr>, | 86 | arena: Arena<ErasedFileAstId, SyntaxNodePtr>, |
87 | } | 87 | } |
88 | 88 | ||
89 | impl AstIdMap { | 89 | impl AstIdMap { |
90 | pub(crate) fn ast_id_map_query(db: &impl DefDatabase, file_id: HirFileId) -> Arc<AstIdMap> { | 90 | pub(crate) fn ast_id_map_query(db: &impl DefDatabase, file_id: HirFileId) -> Arc<AstIdMap> { |
91 | let source_file = db.hir_parse(file_id); | 91 | let map = if let Some(node) = db.parse_or_expand(file_id) { |
92 | Arc::new(AstIdMap::from_source(source_file.syntax())) | 92 | AstIdMap::from_source(&*node) |
93 | } else { | ||
94 | AstIdMap::default() | ||
95 | }; | ||
96 | Arc::new(map) | ||
93 | } | 97 | } |
94 | 98 | ||
95 | pub(crate) fn file_item_query( | 99 | pub(crate) fn file_item_query( |
@@ -97,8 +101,8 @@ impl AstIdMap { | |||
97 | file_id: HirFileId, | 101 | file_id: HirFileId, |
98 | ast_id: ErasedFileAstId, | 102 | ast_id: ErasedFileAstId, |
99 | ) -> TreeArc<SyntaxNode> { | 103 | ) -> TreeArc<SyntaxNode> { |
100 | let source_file = db.hir_parse(file_id); | 104 | let node = db.parse_or_expand(file_id).unwrap(); |
101 | db.ast_id_map(file_id).arena[ast_id].to_node(source_file.syntax()).to_owned() | 105 | db.ast_id_map(file_id).arena[ast_id].to_node(&*node).to_owned() |
102 | } | 106 | } |
103 | 107 | ||
104 | pub(crate) fn ast_id<N: AstNode>(&self, item: &N) -> FileAstId<N> { | 108 | pub(crate) fn ast_id<N: AstNode>(&self, item: &N) -> FileAstId<N> { |
diff --git a/crates/ra_ide_api/src/change.rs b/crates/ra_ide_api/src/change.rs index dc6a433c4..2434f428f 100644 --- a/crates/ra_ide_api/src/change.rs +++ b/crates/ra_ide_api/src/change.rs | |||
@@ -222,7 +222,7 @@ impl RootDatabase { | |||
222 | 222 | ||
223 | self.query(ra_db::ParseQuery).sweep(sweep); | 223 | self.query(ra_db::ParseQuery).sweep(sweep); |
224 | 224 | ||
225 | self.query(hir::db::HirParseQuery).sweep(sweep); | 225 | self.query(hir::db::ParseOrExpandQuery).sweep(sweep); |
226 | self.query(hir::db::AstIdMapQuery).sweep(sweep); | 226 | self.query(hir::db::AstIdMapQuery).sweep(sweep); |
227 | self.query(hir::db::AstIdToNodeQuery).sweep(sweep); | 227 | self.query(hir::db::AstIdToNodeQuery).sweep(sweep); |
228 | 228 | ||