================================================================================
Macro invocation - no arguments
================================================================================

a!();
b![];
c!{};
d::e!();
f::g::h!{};

--------------------------------------------------------------------------------

(source_file
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree)))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree)))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree)))
  (expression_statement
    (macro_invocation
      (scoped_identifier
        (identifier)
        (identifier))
      (token_tree)))
  (expression_statement
    (macro_invocation
      (scoped_identifier
        (scoped_identifier
          (identifier)
          (identifier))
        (identifier))
      (token_tree))))

================================================================================
Macro invocation - arbitrary tokens
================================================================================

a!(* a *);
a!(& a &);
a!(- a -);
a!(b + c + +);
a!('a'..='z');
a!('\u{0}'..='\u{2}');
a!('lifetime)
default!(a);
union!(a);
a!($);
a!($());
a!($ a $);
a!(${$([ a ])});
a!($a $a:ident $($a);*);

--------------------------------------------------------------------------------

(source_file
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (identifier))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (identifier))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (identifier))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (identifier)
        (identifier))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (char_literal)
        (char_literal))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (char_literal)
        (char_literal))))
  (macro_invocation
    (identifier)
    (token_tree
      (identifier)))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (identifier))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (identifier))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree)))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree (token_tree))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree (identifier))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree (token_tree (token_tree (token_tree (identifier)))))))
  (expression_statement
    (macro_invocation
      (identifier)
      (token_tree
        (identifier)
        (identifier)
        (identifier)
        (token_tree
          (identifier))))))

================================================================================
Macro invocation with comments
================================================================================

ok! {
  // one
  /* two */
}

--------------------------------------------------------------------------------

(source_file
  (macro_invocation
    (identifier)
    (token_tree
      (line_comment)
      (block_comment))))

================================================================================
Macro definition
================================================================================

macro_rules! say_hello {
    () => (
        println!("Hello!");
    )
}

macro_rules! four {
    () => {1 + 3};
}

macro_rules! foo {
    (x => $e:expr) => (println!("mode X: {}", $e));
    (y => $e:expr) => (println!("mode Y: {}", $e))
}

macro_rules! o_O {
    (
      $($x:expr; [ $( $y:expr ),* ]);*
    ) => {
      $($($x + $e),*),*
    }
}

macro_rules! zero_or_one {
    ($($e:expr),?) => {
        $($e),?
    };
}

--------------------------------------------------------------------------------

(source_file
  (macro_definition
    name: (identifier)
    (macro_rule
      left: (token_tree_pattern)
      right: (token_tree
        (identifier)
        (token_tree
          (string_literal)))))
  (macro_definition
    name: (identifier)
    (macro_rule
      left: (token_tree_pattern)
      right: (token_tree
        (integer_literal)
        (integer_literal))))
  (macro_definition
    name: (identifier)
    (macro_rule
      left: (token_tree_pattern
        (identifier)
        (token_binding_pattern
          name: (metavariable)
          type: (fragment_specifier)))
      right: (token_tree
        (identifier)
        (token_tree
          (string_literal)
          (metavariable))))
    (macro_rule
      left: (token_tree_pattern
        (identifier)
        (token_binding_pattern
          name: (metavariable)
          type: (fragment_specifier)))
      right: (token_tree
        (identifier)
        (token_tree
          (string_literal)
          (metavariable)))))
  (macro_definition
    name: (identifier)
    (macro_rule
      left: (token_tree_pattern
        (token_repetition_pattern
          (token_binding_pattern
            name: (metavariable)
            type: (fragment_specifier))
          (token_tree_pattern
            (token_repetition_pattern
              (token_binding_pattern
                name: (metavariable)
                type: (fragment_specifier))))))
      right: (token_tree
        (token_repetition
          (token_repetition
            (metavariable)
            (metavariable))))))
  (macro_definition
    name: (identifier)
    (macro_rule
      left: (token_tree_pattern
        (token_repetition_pattern
          (token_binding_pattern
            name: (metavariable)
            type: (fragment_specifier))))
      right: (token_tree
        (token_repetition
          (metavariable))))))
