diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-05-15 11:17:42 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-05-15 11:17:42 +0100 |
commit | 982b92f966518a0e24632fafdc18d7b5ab6928b4 (patch) | |
tree | 41aa35146d8b3b2b039d79a38a157d0f2d5cab8d | |
parent | 05db35dafb47db355e202c9176bd8a752b7390d7 (diff) | |
parent | 20f7068b68b99610926b375d53d3721b878ff86c (diff) |
Merge #4431
4431: Store proc-macro result in salsa db r=matklad a=edwin0cheng
Fixed #4315
Co-authored-by: Edwin Cheng <[email protected]>
-rw-r--r-- | crates/ra_hir_expand/src/db.rs | 36 | ||||
-rw-r--r-- | crates/ra_mbe/src/lib.rs | 2 | ||||
-rw-r--r-- | crates/ra_tt/src/lib.rs | 2 |
3 files changed, 37 insertions, 3 deletions
diff --git a/crates/ra_hir_expand/src/db.rs b/crates/ra_hir_expand/src/db.rs index 4c12d0a15..bf30d7151 100644 --- a/crates/ra_hir_expand/src/db.rs +++ b/crates/ra_hir_expand/src/db.rs | |||
@@ -34,7 +34,12 @@ impl TokenExpander { | |||
34 | // FIXME switch these to ExpandResult as well | 34 | // FIXME switch these to ExpandResult as well |
35 | TokenExpander::Builtin(it) => it.expand(db, id, tt).into(), | 35 | TokenExpander::Builtin(it) => it.expand(db, id, tt).into(), |
36 | TokenExpander::BuiltinDerive(it) => it.expand(db, id, tt).into(), | 36 | TokenExpander::BuiltinDerive(it) => it.expand(db, id, tt).into(), |
37 | TokenExpander::ProcMacro(it) => it.expand(db, id, tt).into(), | 37 | TokenExpander::ProcMacro(_) => { |
38 | // We store the result in salsa db to prevent non-determinisc behavior in | ||
39 | // some proc-macro implementation | ||
40 | // See #4315 for details | ||
41 | db.expand_proc_macro(id.into()).into() | ||
42 | } | ||
38 | } | 43 | } |
39 | } | 44 | } |
40 | 45 | ||
@@ -75,6 +80,8 @@ pub trait AstDatabase: SourceDatabase { | |||
75 | 80 | ||
76 | #[salsa::interned] | 81 | #[salsa::interned] |
77 | fn intern_eager_expansion(&self, eager: EagerCallLoc) -> EagerMacroId; | 82 | fn intern_eager_expansion(&self, eager: EagerCallLoc) -> EagerMacroId; |
83 | |||
84 | fn expand_proc_macro(&self, call: MacroCallId) -> Result<tt::Subtree, mbe::ExpandError>; | ||
78 | } | 85 | } |
79 | 86 | ||
80 | /// This expands the given macro call, but with different arguments. This is | 87 | /// This expands the given macro call, but with different arguments. This is |
@@ -216,6 +223,33 @@ fn macro_expand_with_arg( | |||
216 | (Some(Arc::new(tt)), err.map(|e| format!("{:?}", e))) | 223 | (Some(Arc::new(tt)), err.map(|e| format!("{:?}", e))) |
217 | } | 224 | } |
218 | 225 | ||
226 | pub(crate) fn expand_proc_macro( | ||
227 | db: &dyn AstDatabase, | ||
228 | id: MacroCallId, | ||
229 | ) -> Result<tt::Subtree, mbe::ExpandError> { | ||
230 | let lazy_id = match id { | ||
231 | MacroCallId::LazyMacro(id) => id, | ||
232 | MacroCallId::EagerMacro(_) => unreachable!(), | ||
233 | }; | ||
234 | |||
235 | let loc = db.lookup_intern_macro(lazy_id); | ||
236 | let macro_arg = match db.macro_arg(id) { | ||
237 | Some(it) => it, | ||
238 | None => { | ||
239 | return Err( | ||
240 | tt::ExpansionError::Unknown("No arguments for proc-macro".to_string()).into() | ||
241 | ) | ||
242 | } | ||
243 | }; | ||
244 | |||
245 | let expander = match loc.def.kind { | ||
246 | MacroDefKind::CustomDerive(expander) => expander, | ||
247 | _ => unreachable!(), | ||
248 | }; | ||
249 | |||
250 | expander.expand(db, lazy_id, ¯o_arg.0) | ||
251 | } | ||
252 | |||
219 | pub(crate) fn parse_or_expand(db: &dyn AstDatabase, file_id: HirFileId) -> Option<SyntaxNode> { | 253 | pub(crate) fn parse_or_expand(db: &dyn AstDatabase, file_id: HirFileId) -> Option<SyntaxNode> { |
220 | match file_id.0 { | 254 | match file_id.0 { |
221 | HirFileIdRepr::FileId(file_id) => Some(db.parse(file_id).tree().syntax().clone()), | 255 | HirFileIdRepr::FileId(file_id) => Some(db.parse(file_id).tree().syntax().clone()), |
diff --git a/crates/ra_mbe/src/lib.rs b/crates/ra_mbe/src/lib.rs index 1a020398e..9c450eaba 100644 --- a/crates/ra_mbe/src/lib.rs +++ b/crates/ra_mbe/src/lib.rs | |||
@@ -22,7 +22,7 @@ pub enum ParseError { | |||
22 | RepetitionEmtpyTokenTree, | 22 | RepetitionEmtpyTokenTree, |
23 | } | 23 | } |
24 | 24 | ||
25 | #[derive(Debug, PartialEq, Eq)] | 25 | #[derive(Debug, PartialEq, Eq, Clone)] |
26 | pub enum ExpandError { | 26 | pub enum ExpandError { |
27 | NoMatchingRule, | 27 | NoMatchingRule, |
28 | UnexpectedToken, | 28 | UnexpectedToken, |
diff --git a/crates/ra_tt/src/lib.rs b/crates/ra_tt/src/lib.rs index 5248e026c..342ddbe32 100644 --- a/crates/ra_tt/src/lib.rs +++ b/crates/ra_tt/src/lib.rs | |||
@@ -243,7 +243,7 @@ impl Subtree { | |||
243 | 243 | ||
244 | pub mod buffer; | 244 | pub mod buffer; |
245 | 245 | ||
246 | #[derive(Debug, PartialEq, Eq)] | 246 | #[derive(Debug, PartialEq, Eq, Clone)] |
247 | pub enum ExpansionError { | 247 | pub enum ExpansionError { |
248 | IOError(String), | 248 | IOError(String), |
249 | JsonError(String), | 249 | JsonError(String), |