diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-07-23 11:36:33 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-07-23 11:36:33 +0100 |
commit | 8a49f937936e7c7a886fc859905bb40f53bc47e3 (patch) | |
tree | 3b2de8ba1568c55067a644ee497c454518ed6007 | |
parent | 085891d8855bb905c2ba12c1618bace410253926 (diff) | |
parent | cb958cf5fec8b051d16833ac0890cace379ad765 (diff) |
Merge #5497
5497: Store macro invocation parameters as text instead of tt r=jonas-schievink a=lnicola
We don't want to expand macros on every source change because it can be arbitrarily slow, but the token trees can be rather large. So instead we can cache the invocation parameters (as text).
Co-authored-by: Laurențiu Nicola <[email protected]>
-rw-r--r-- | crates/ra_hir/src/db.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir_expand/src/db.rs | 19 | ||||
-rw-r--r-- | crates/ra_ide_db/src/change.rs | 4 | ||||
-rw-r--r-- | crates/ra_syntax/src/lib.rs | 4 | ||||
-rw-r--r-- | crates/ra_syntax/src/syntax_node.rs | 4 |
5 files changed, 20 insertions, 13 deletions
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index 1ad92a1f8..a2b9f3e35 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs | |||
@@ -11,7 +11,7 @@ pub use hir_def::db::{ | |||
11 | }; | 11 | }; |
12 | pub use hir_expand::db::{ | 12 | pub use hir_expand::db::{ |
13 | AstDatabase, AstDatabaseStorage, AstIdMapQuery, InternEagerExpansionQuery, InternMacroQuery, | 13 | AstDatabase, AstDatabaseStorage, AstIdMapQuery, InternEagerExpansionQuery, InternMacroQuery, |
14 | MacroArgQuery, MacroDefQuery, MacroExpandQuery, ParseMacroQuery, | 14 | MacroArgTextQuery, MacroDefQuery, MacroExpandQuery, ParseMacroQuery, |
15 | }; | 15 | }; |
16 | pub use hir_ty::db::{ | 16 | pub use hir_ty::db::{ |
17 | AssociatedTyDataQuery, AssociatedTyValueQuery, CallableItemSignatureQuery, FieldTypesQuery, | 17 | AssociatedTyDataQuery, AssociatedTyValueQuery, CallableItemSignatureQuery, FieldTypesQuery, |
diff --git a/crates/ra_hir_expand/src/db.rs b/crates/ra_hir_expand/src/db.rs index bf30d7151..e0ad1567f 100644 --- a/crates/ra_hir_expand/src/db.rs +++ b/crates/ra_hir_expand/src/db.rs | |||
@@ -6,7 +6,7 @@ use mbe::{ExpandResult, MacroRules}; | |||
6 | use ra_db::{salsa, SourceDatabase}; | 6 | use ra_db::{salsa, SourceDatabase}; |
7 | use ra_parser::FragmentKind; | 7 | use ra_parser::FragmentKind; |
8 | use ra_prof::profile; | 8 | use ra_prof::profile; |
9 | use ra_syntax::{algo::diff, AstNode, Parse, SyntaxKind::*, SyntaxNode}; | 9 | use ra_syntax::{algo::diff, AstNode, GreenNode, Parse, SyntaxKind::*, SyntaxNode}; |
10 | 10 | ||
11 | use crate::{ | 11 | use crate::{ |
12 | ast_id_map::AstIdMap, BuiltinDeriveExpander, BuiltinFnLikeExpander, EagerCallLoc, EagerMacroId, | 12 | ast_id_map::AstIdMap, BuiltinDeriveExpander, BuiltinFnLikeExpander, EagerCallLoc, EagerMacroId, |
@@ -72,6 +72,8 @@ pub trait AstDatabase: SourceDatabase { | |||
72 | 72 | ||
73 | #[salsa::interned] | 73 | #[salsa::interned] |
74 | fn intern_macro(&self, macro_call: MacroCallLoc) -> LazyMacroId; | 74 | fn intern_macro(&self, macro_call: MacroCallLoc) -> LazyMacroId; |
75 | fn macro_arg_text(&self, id: MacroCallId) -> Option<GreenNode>; | ||
76 | #[salsa::transparent] | ||
75 | fn macro_arg(&self, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>>; | 77 | fn macro_arg(&self, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>>; |
76 | fn macro_def(&self, id: MacroDefId) -> Option<Arc<(TokenExpander, mbe::TokenMap)>>; | 78 | fn macro_def(&self, id: MacroDefId) -> Option<Arc<(TokenExpander, mbe::TokenMap)>>; |
77 | fn parse_macro(&self, macro_file: MacroFile) | 79 | fn parse_macro(&self, macro_file: MacroFile) |
@@ -148,10 +150,7 @@ pub(crate) fn macro_def( | |||
148 | } | 150 | } |
149 | } | 151 | } |
150 | 152 | ||
151 | pub(crate) fn macro_arg( | 153 | pub(crate) fn macro_arg_text(db: &dyn AstDatabase, id: MacroCallId) -> Option<GreenNode> { |
152 | db: &dyn AstDatabase, | ||
153 | id: MacroCallId, | ||
154 | ) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { | ||
155 | let id = match id { | 154 | let id = match id { |
156 | MacroCallId::LazyMacro(id) => id, | 155 | MacroCallId::LazyMacro(id) => id, |
157 | MacroCallId::EagerMacro(_id) => { | 156 | MacroCallId::EagerMacro(_id) => { |
@@ -161,7 +160,15 @@ pub(crate) fn macro_arg( | |||
161 | }; | 160 | }; |
162 | let loc = db.lookup_intern_macro(id); | 161 | let loc = db.lookup_intern_macro(id); |
163 | let arg = loc.kind.arg(db)?; | 162 | let arg = loc.kind.arg(db)?; |
164 | let (tt, tmap) = mbe::syntax_node_to_token_tree(&arg)?; | 163 | Some(arg.green().clone()) |
164 | } | ||
165 | |||
166 | pub(crate) fn macro_arg( | ||
167 | db: &dyn AstDatabase, | ||
168 | id: MacroCallId, | ||
169 | ) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { | ||
170 | let arg = db.macro_arg_text(id)?; | ||
171 | let (tt, tmap) = mbe::syntax_node_to_token_tree(&SyntaxNode::new_root(arg))?; | ||
165 | Some(Arc::new((tt, tmap))) | 172 | Some(Arc::new((tt, tmap))) |
166 | } | 173 | } |
167 | 174 | ||
diff --git a/crates/ra_ide_db/src/change.rs b/crates/ra_ide_db/src/change.rs index a1bb3043b..32d9a8d1f 100644 --- a/crates/ra_ide_db/src/change.rs +++ b/crates/ra_ide_db/src/change.rs | |||
@@ -151,7 +151,7 @@ impl RootDatabase { | |||
151 | 151 | ||
152 | // Macros do take significant space, but less then the syntax trees | 152 | // Macros do take significant space, but less then the syntax trees |
153 | // self.query(hir::db::MacroDefQuery).sweep(sweep); | 153 | // self.query(hir::db::MacroDefQuery).sweep(sweep); |
154 | // self.query(hir::db::MacroArgQuery).sweep(sweep); | 154 | // self.query(hir::db::MacroArgTextQuery).sweep(sweep); |
155 | // self.query(hir::db::MacroExpandQuery).sweep(sweep); | 155 | // self.query(hir::db::MacroExpandQuery).sweep(sweep); |
156 | 156 | ||
157 | hir::db::AstIdMapQuery.in_db(self).sweep(sweep); | 157 | hir::db::AstIdMapQuery.in_db(self).sweep(sweep); |
@@ -199,7 +199,7 @@ impl RootDatabase { | |||
199 | 199 | ||
200 | // AstDatabase | 200 | // AstDatabase |
201 | hir::db::AstIdMapQuery | 201 | hir::db::AstIdMapQuery |
202 | hir::db::MacroArgQuery | 202 | hir::db::MacroArgTextQuery |
203 | hir::db::MacroDefQuery | 203 | hir::db::MacroDefQuery |
204 | hir::db::ParseMacroQuery | 204 | hir::db::ParseMacroQuery |
205 | hir::db::MacroExpandQuery | 205 | hir::db::MacroExpandQuery |
diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index 9b7664576..ac59455e7 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs | |||
@@ -42,8 +42,6 @@ use std::{marker::PhantomData, sync::Arc}; | |||
42 | use ra_text_edit::Indel; | 42 | use ra_text_edit::Indel; |
43 | use stdx::format_to; | 43 | use stdx::format_to; |
44 | 44 | ||
45 | use crate::syntax_node::GreenNode; | ||
46 | |||
47 | pub use crate::{ | 45 | pub use crate::{ |
48 | algo::InsertPosition, | 46 | algo::InsertPosition, |
49 | ast::{AstNode, AstToken}, | 47 | ast::{AstNode, AstToken}, |
@@ -51,7 +49,7 @@ pub use crate::{ | |||
51 | ptr::{AstPtr, SyntaxNodePtr}, | 49 | ptr::{AstPtr, SyntaxNodePtr}, |
52 | syntax_error::SyntaxError, | 50 | syntax_error::SyntaxError, |
53 | syntax_node::{ | 51 | syntax_node::{ |
54 | Direction, NodeOrToken, SyntaxElement, SyntaxElementChildren, SyntaxNode, | 52 | Direction, GreenNode, NodeOrToken, SyntaxElement, SyntaxElementChildren, SyntaxNode, |
55 | SyntaxNodeChildren, SyntaxToken, SyntaxTreeBuilder, | 53 | SyntaxNodeChildren, SyntaxToken, SyntaxTreeBuilder, |
56 | }, | 54 | }, |
57 | }; | 55 | }; |
diff --git a/crates/ra_syntax/src/syntax_node.rs b/crates/ra_syntax/src/syntax_node.rs index 9650b8781..a7dbdba7b 100644 --- a/crates/ra_syntax/src/syntax_node.rs +++ b/crates/ra_syntax/src/syntax_node.rs | |||
@@ -10,7 +10,9 @@ use rowan::{GreenNodeBuilder, Language}; | |||
10 | 10 | ||
11 | use crate::{Parse, SmolStr, SyntaxError, SyntaxKind, TextSize}; | 11 | use crate::{Parse, SmolStr, SyntaxError, SyntaxKind, TextSize}; |
12 | 12 | ||
13 | pub(crate) use rowan::{GreenNode, GreenToken}; | 13 | pub use rowan::GreenNode; |
14 | |||
15 | pub(crate) use rowan::GreenToken; | ||
14 | 16 | ||
15 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 17 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] |
16 | pub enum RustLanguage {} | 18 | pub enum RustLanguage {} |