diff options
author | Galilée 'Bill' Enguehard <[email protected]> | 2020-05-21 22:27:38 +0100 |
---|---|---|
committer | Galilée 'Bill' Enguehard <[email protected]> | 2020-05-21 22:27:38 +0100 |
commit | 7fece3bdd2450c0807f7dd742239cae95f0cc65e (patch) | |
tree | 866c4db826c959e79c63a6727bdb9f2c61e6fc4f /crates/ra_hir_expand/src/db.rs | |
parent | db926218b2082077750291f8426ddd28b284cd08 (diff) | |
parent | 59732df8d40dfadc6dcf5951265416576399712a (diff) |
Merge branch 'master' of github.com:rust-analyzer/rust-analyzer into modname_spacing
Diffstat (limited to 'crates/ra_hir_expand/src/db.rs')
-rw-r--r-- | crates/ra_hir_expand/src/db.rs | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/crates/ra_hir_expand/src/db.rs b/crates/ra_hir_expand/src/db.rs index 047452306..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()), |
@@ -330,7 +364,7 @@ fn to_fragment_kind(db: &dyn AstDatabase, id: MacroCallId) -> FragmentKind { | |||
330 | FragmentKind::Expr | 364 | FragmentKind::Expr |
331 | } | 365 | } |
332 | // FIXME: Expand to statements in appropriate positions; HIR lowering needs to handle that | 366 | // FIXME: Expand to statements in appropriate positions; HIR lowering needs to handle that |
333 | EXPR_STMT | BLOCK => FragmentKind::Expr, | 367 | EXPR_STMT | BLOCK_EXPR => FragmentKind::Expr, |
334 | ARG_LIST => FragmentKind::Expr, | 368 | ARG_LIST => FragmentKind::Expr, |
335 | TRY_EXPR => FragmentKind::Expr, | 369 | TRY_EXPR => FragmentKind::Expr, |
336 | TUPLE_EXPR => FragmentKind::Expr, | 370 | TUPLE_EXPR => FragmentKind::Expr, |
@@ -342,7 +376,6 @@ fn to_fragment_kind(db: &dyn AstDatabase, id: MacroCallId) -> FragmentKind { | |||
342 | CONDITION => FragmentKind::Expr, | 376 | CONDITION => FragmentKind::Expr, |
343 | BREAK_EXPR => FragmentKind::Expr, | 377 | BREAK_EXPR => FragmentKind::Expr, |
344 | RETURN_EXPR => FragmentKind::Expr, | 378 | RETURN_EXPR => FragmentKind::Expr, |
345 | BLOCK_EXPR => FragmentKind::Expr, | ||
346 | MATCH_EXPR => FragmentKind::Expr, | 379 | MATCH_EXPR => FragmentKind::Expr, |
347 | MATCH_ARM => FragmentKind::Expr, | 380 | MATCH_ARM => FragmentKind::Expr, |
348 | MATCH_GUARD => FragmentKind::Expr, | 381 | MATCH_GUARD => FragmentKind::Expr, |