diff options
-rw-r--r-- | crates/ra_hir/src/macros/mbe.rs | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/crates/ra_hir/src/macros/mbe.rs b/crates/ra_hir/src/macros/mbe.rs index 7af7066fb..2e7f9cbf4 100644 --- a/crates/ra_hir/src/macros/mbe.rs +++ b/crates/ra_hir/src/macros/mbe.rs | |||
@@ -9,8 +9,8 @@ pub(crate) struct MacroRules { | |||
9 | 9 | ||
10 | #[derive(Debug)] | 10 | #[derive(Debug)] |
11 | struct Rule { | 11 | struct Rule { |
12 | lhs: TokenTree, | 12 | lhs: Subtree, |
13 | rhs: TokenTree, | 13 | rhs: Subtree, |
14 | } | 14 | } |
15 | 15 | ||
16 | #[derive(Debug)] | 16 | #[derive(Debug)] |
@@ -75,6 +75,47 @@ struct Var { | |||
75 | text: SmolStr, | 75 | text: SmolStr, |
76 | } | 76 | } |
77 | 77 | ||
78 | pub(crate) fn parse(tt: &tt::Subtree) -> MacroRules { | 78 | pub(crate) fn parse(tt: &tt::Subtree) -> Option<MacroRules> { |
79 | MacroRules { rules: Vec::new() } | 79 | let mut parser = RulesParser::new(tt); |
80 | let mut rules = Vec::new(); | ||
81 | while !parser.is_eof() { | ||
82 | rules.push(parse_rule(&mut parser)?) | ||
83 | } | ||
84 | Some(MacroRules { rules }) | ||
85 | } | ||
86 | |||
87 | fn parse_rule(p: &mut RulesParser) -> Option<Rule> { | ||
88 | let lhs = match p.current()? { | ||
89 | tt::TokenTree::Subtree(sub) => parse_subtree(sub)?, | ||
90 | _ => return None, | ||
91 | }; | ||
92 | let rhs = unimplemented!(); | ||
93 | Some(Rule { lhs, rhs }) | ||
94 | } | ||
95 | |||
96 | fn parse_subtree(tt: &tt::Subtree) -> Option<Subtree> { | ||
97 | unimplemented!() | ||
98 | } | ||
99 | |||
100 | struct RulesParser<'a> { | ||
101 | subtree: &'a tt::Subtree, | ||
102 | pos: usize, | ||
103 | } | ||
104 | |||
105 | impl<'a> RulesParser<'a> { | ||
106 | fn new(subtree: &'a tt::Subtree) -> RulesParser<'a> { | ||
107 | RulesParser { subtree, pos: 0 } | ||
108 | } | ||
109 | |||
110 | fn is_eof(&self) -> bool { | ||
111 | self.pos == self.subtree.token_trees.len() | ||
112 | } | ||
113 | |||
114 | fn current(&self) -> Option<&'a tt::TokenTree> { | ||
115 | self.subtree.token_trees.get(self.pos) | ||
116 | } | ||
117 | |||
118 | fn bump(&mut self) { | ||
119 | self.pos += 1; | ||
120 | } | ||
80 | } | 121 | } |