From 9cf8d325a21f31acf026084e0c67b3af983dddfb Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Sun, 9 May 2021 01:36:06 +0200 Subject: Precompute macro fragment kind --- crates/hir_expand/src/lib.rs | 68 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) (limited to 'crates/hir_expand/src/lib.rs') diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs index 0402640de..80ab3aeee 100644 --- a/crates/hir_expand/src/lib.rs +++ b/crates/hir_expand/src/lib.rs @@ -16,7 +16,9 @@ pub mod quote; pub mod eager; use either::Either; + pub use mbe::{ExpandError, ExpandResult}; +pub use parser::FragmentKind; use std::hash::Hash; use std::sync::Arc; @@ -290,7 +292,7 @@ pub struct MacroCallLoc { #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum MacroCallKind { - FnLike { ast_id: AstId }, + FnLike { ast_id: AstId, fragment: FragmentKind }, Derive { ast_id: AstId, derive_name: String, derive_attr: AttrId }, } @@ -324,6 +326,13 @@ impl MacroCallKind { MacroCallKind::Derive { ast_id, .. } => Some(ast_id.to_node(db).syntax().clone()), } } + + fn fragment_kind(&self) -> FragmentKind { + match self { + MacroCallKind::FnLike { fragment, .. } => *fragment, + MacroCallKind::Derive { .. } => FragmentKind::Items, + } + } } impl MacroCallId { @@ -357,7 +366,6 @@ pub struct ExpansionInfo { } pub use mbe::Origin; -use parser::FragmentKind; impl ExpansionInfo { pub fn call_node(&self) -> Option> { @@ -562,3 +570,59 @@ impl InFile { self.with_value(self.value.syntax()) } } + +/// Given a `MacroCallId`, return what `FragmentKind` it belongs to. +/// FIXME: Not completed +pub fn to_fragment_kind(call: &ast::MacroCall) -> FragmentKind { + use syntax::SyntaxKind::*; + + let syn = call.syntax(); + + let parent = match syn.parent() { + Some(it) => it, + None => return FragmentKind::Statements, + }; + + match parent.kind() { + MACRO_ITEMS | SOURCE_FILE => FragmentKind::Items, + MACRO_STMTS => FragmentKind::Statements, + MACRO_PAT => FragmentKind::Pattern, + MACRO_TYPE => FragmentKind::Type, + ITEM_LIST => FragmentKind::Items, + LET_STMT => { + // FIXME: Handle LHS Pattern + FragmentKind::Expr + } + EXPR_STMT => FragmentKind::Statements, + BLOCK_EXPR => FragmentKind::Statements, + ARG_LIST => FragmentKind::Expr, + TRY_EXPR => FragmentKind::Expr, + TUPLE_EXPR => FragmentKind::Expr, + PAREN_EXPR => FragmentKind::Expr, + ARRAY_EXPR => FragmentKind::Expr, + FOR_EXPR => FragmentKind::Expr, + PATH_EXPR => FragmentKind::Expr, + CLOSURE_EXPR => FragmentKind::Expr, + CONDITION => FragmentKind::Expr, + BREAK_EXPR => FragmentKind::Expr, + RETURN_EXPR => FragmentKind::Expr, + MATCH_EXPR => FragmentKind::Expr, + MATCH_ARM => FragmentKind::Expr, + MATCH_GUARD => FragmentKind::Expr, + RECORD_EXPR_FIELD => FragmentKind::Expr, + CALL_EXPR => FragmentKind::Expr, + INDEX_EXPR => FragmentKind::Expr, + METHOD_CALL_EXPR => FragmentKind::Expr, + FIELD_EXPR => FragmentKind::Expr, + AWAIT_EXPR => FragmentKind::Expr, + CAST_EXPR => FragmentKind::Expr, + REF_EXPR => FragmentKind::Expr, + PREFIX_EXPR => FragmentKind::Expr, + RANGE_EXPR => FragmentKind::Expr, + BIN_EXPR => FragmentKind::Expr, + _ => { + // Unknown , Just guess it is `Items` + FragmentKind::Items + } + } +} -- cgit v1.2.3