Merge #790
790: make macro-rules eq r=matklad a=matklad Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
77ccac74f9
8 changed files with 25 additions and 16 deletions
|
@ -30,7 +30,7 @@ pub use crate::syntax_bridge::ast_to_token_tree;
|
|||
/// be very confusing is that AST has almost exactly the same shape as
|
||||
/// `tt::TokenTree`, but there's a crucial difference: in macro rules, `$ident`
|
||||
/// and `$()*` have special meaning (see `Var` and `Repeat` data structures)
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub struct MacroRules {
|
||||
pub(crate) rules: Vec<Rule>,
|
||||
}
|
||||
|
@ -44,13 +44,13 @@ impl MacroRules {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) struct Rule {
|
||||
pub(crate) lhs: Subtree,
|
||||
pub(crate) rhs: Subtree,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) enum TokenTree {
|
||||
Leaf(Leaf),
|
||||
Subtree(Subtree),
|
||||
|
@ -58,7 +58,7 @@ pub(crate) enum TokenTree {
|
|||
}
|
||||
impl_froms!(TokenTree: Leaf, Subtree, Repeat);
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) enum Leaf {
|
||||
Literal(Literal),
|
||||
Punct(Punct),
|
||||
|
@ -67,37 +67,37 @@ pub(crate) enum Leaf {
|
|||
}
|
||||
impl_froms!(Leaf: Literal, Punct, Ident, Var);
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) struct Subtree {
|
||||
pub(crate) delimiter: Delimiter,
|
||||
pub(crate) token_trees: Vec<TokenTree>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) struct Repeat {
|
||||
pub(crate) subtree: Subtree,
|
||||
pub(crate) kind: RepeatKind,
|
||||
pub(crate) separator: Option<char>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) enum RepeatKind {
|
||||
ZeroOrMore,
|
||||
OneOrMore,
|
||||
ZeroOrOne,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) struct Literal {
|
||||
pub(crate) text: SmolStr,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) struct Ident {
|
||||
pub(crate) text: SmolStr,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub(crate) struct Var {
|
||||
pub(crate) text: SmolStr,
|
||||
pub(crate) kind: Option<SmolStr>,
|
||||
|
|
|
@ -1908,6 +1908,7 @@ impl ToOwned for MacroCall {
|
|||
}
|
||||
|
||||
|
||||
impl ast::NameOwner for MacroCall {}
|
||||
impl MacroCall {
|
||||
pub fn token_tree(&self) -> Option<&TokenTree> {
|
||||
super::child_opt(self)
|
||||
|
|
|
@ -545,7 +545,10 @@ Grammar(
|
|||
"Visibility": (),
|
||||
"Name": (),
|
||||
"NameRef": (),
|
||||
"MacroCall": ( options: [ "TokenTree", "Path" ] ),
|
||||
"MacroCall": (
|
||||
traits: [ "NameOwner" ],
|
||||
options: [ "TokenTree", "Path" ],
|
||||
),
|
||||
"Attr": ( options: [ ["value", "TokenTree"] ] ),
|
||||
"TokenTree": (),
|
||||
"TypeParamList": (
|
||||
|
|
|
@ -347,7 +347,9 @@ fn macro_call(p: &mut Parser) -> BlockLike {
|
|||
|
||||
pub(super) fn macro_call_after_excl(p: &mut Parser) -> BlockLike {
|
||||
p.expect(EXCL);
|
||||
p.eat(IDENT);
|
||||
if p.at(IDENT) {
|
||||
name(p);
|
||||
}
|
||||
match p.current() {
|
||||
L_CURLY => {
|
||||
token_tree(p);
|
||||
|
|
|
@ -6,6 +6,7 @@ SOURCE_FILE@[0; 349)
|
|||
IDENT@[0; 5) "macro"
|
||||
err: `expected EXCL`
|
||||
WHITESPACE@[5; 6)
|
||||
NAME@[6; 21)
|
||||
IDENT@[6; 21) "parse_use_trees"
|
||||
TOKEN_TREE@[21; 41)
|
||||
L_PAREN@[21; 22)
|
||||
|
|
|
@ -19,6 +19,7 @@ SOURCE_FILE@[0; 70)
|
|||
IDENT@[12; 23) "macro_rules"
|
||||
EXCL@[23; 24)
|
||||
WHITESPACE@[24; 25)
|
||||
NAME@[25; 28)
|
||||
IDENT@[25; 28) "foo"
|
||||
WHITESPACE@[28; 29)
|
||||
TOKEN_TREE@[29; 31)
|
||||
|
|
|
@ -92,6 +92,7 @@ SOURCE_FILE@[0; 167)
|
|||
IDENT@[109; 120) "macro_rules"
|
||||
EXCL@[120; 121)
|
||||
WHITESPACE@[121; 122)
|
||||
NAME@[122; 126)
|
||||
IDENT@[122; 126) "test"
|
||||
WHITESPACE@[126; 127)
|
||||
TOKEN_TREE@[127; 152)
|
||||
|
|
|
@ -39,7 +39,7 @@ pub struct Subtree {
|
|||
pub token_trees: Vec<TokenTree>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum Delimiter {
|
||||
Parenthesis,
|
||||
Brace,
|
||||
|
|
Loading…
Add table
Reference in a new issue