1pub(crate) mod diagnostics;
7pub(crate) mod macro_rules;
8
9mod macro_check;
10mod macro_parser;
11mod metavar_expr;
12mod quoted;
13mod transcribe;
14
15use metavar_expr::MetaVarExpr;
16use rustc_ast::token::{Delimiter, NonterminalKind, Token, TokenKind};
17use rustc_ast::tokenstream::{DelimSpacing, DelimSpan};
18use rustc_macros::{Decodable, Encodable};
19use rustc_span::{Ident, Span};
20
21#[derive(#[automatically_derived]
impl ::core::cmp::PartialEq for Delimited {
#[inline]
fn eq(&self, other: &Delimited) -> bool {
self.delim == other.delim && self.tts == other.tts
}
}PartialEq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Delimited {
fn encode(&self, __encoder: &mut __E) {
match *self {
Delimited { delim: ref __binding_0, tts: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Delimited {
fn decode(__decoder: &mut __D) -> Self {
Delimited {
delim: ::rustc_serialize::Decodable::decode(__decoder),
tts: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Delimited {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Delimited",
"delim", &self.delim, "tts", &&self.tts)
}
}Debug)]
24struct Delimited {
25 delim: Delimiter,
26 tts: Vec<TokenTree>,
28}
29
30#[derive(#[automatically_derived]
impl ::core::cmp::PartialEq for SequenceRepetition {
#[inline]
fn eq(&self, other: &SequenceRepetition) -> bool {
self.tts == other.tts && self.separator == other.separator &&
self.kleene == other.kleene &&
self.num_captures == other.num_captures
}
}PartialEq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for SequenceRepetition {
fn encode(&self, __encoder: &mut __E) {
match *self {
SequenceRepetition {
tts: ref __binding_0,
separator: ref __binding_1,
kleene: ref __binding_2,
num_captures: ref __binding_3 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for SequenceRepetition {
fn decode(__decoder: &mut __D) -> Self {
SequenceRepetition {
tts: ::rustc_serialize::Decodable::decode(__decoder),
separator: ::rustc_serialize::Decodable::decode(__decoder),
kleene: ::rustc_serialize::Decodable::decode(__decoder),
num_captures: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for SequenceRepetition {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"SequenceRepetition", "tts", &self.tts, "separator",
&self.separator, "kleene", &self.kleene, "num_captures",
&&self.num_captures)
}
}Debug)]
31struct SequenceRepetition {
32 tts: Vec<TokenTree>,
34 separator: Option<Token>,
36 kleene: KleeneToken,
38 num_captures: usize,
40}
41
42#[derive(#[automatically_derived]
impl ::core::clone::Clone for KleeneToken {
#[inline]
fn clone(&self) -> KleeneToken {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<KleeneOp>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for KleeneToken {
#[inline]
fn eq(&self, other: &KleeneToken) -> bool {
self.span == other.span && self.op == other.op
}
}PartialEq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for KleeneToken {
fn encode(&self, __encoder: &mut __E) {
match *self {
KleeneToken { span: ref __binding_0, op: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for KleeneToken {
fn decode(__decoder: &mut __D) -> Self {
KleeneToken {
span: ::rustc_serialize::Decodable::decode(__decoder),
op: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for KleeneToken {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "KleeneToken",
"span", &self.span, "op", &&self.op)
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for KleeneToken { }Copy)]
43struct KleeneToken {
44 span: Span,
45 op: KleeneOp,
46}
47
48impl KleeneToken {
49 fn new(op: KleeneOp, span: Span) -> KleeneToken {
50 KleeneToken { span, op }
51 }
52}
53
54#[derive(#[automatically_derived]
impl ::core::clone::Clone for KleeneOp {
#[inline]
fn clone(&self) -> KleeneOp { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for KleeneOp {
#[inline]
fn eq(&self, other: &KleeneOp) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for KleeneOp {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
KleeneOp::ZeroOrMore => { 0usize }
KleeneOp::OneOrMore => { 1usize }
KleeneOp::ZeroOrOne => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
KleeneOp::ZeroOrMore => {}
KleeneOp::OneOrMore => {}
KleeneOp::ZeroOrOne => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for KleeneOp {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { KleeneOp::ZeroOrMore }
1usize => { KleeneOp::OneOrMore }
2usize => { KleeneOp::ZeroOrOne }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `KleeneOp`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for KleeneOp {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
KleeneOp::ZeroOrMore => "ZeroOrMore",
KleeneOp::OneOrMore => "OneOrMore",
KleeneOp::ZeroOrOne => "ZeroOrOne",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for KleeneOp { }Copy)]
57pub(crate) enum KleeneOp {
58 ZeroOrMore,
60 OneOrMore,
62 ZeroOrOne,
64}
65
66#[derive(#[automatically_derived]
impl ::core::fmt::Debug for TokenTree {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
TokenTree::Token(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Token",
&__self_0),
TokenTree::Delimited(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"Delimited", __self_0, __self_1, &__self_2),
TokenTree::Sequence(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"Sequence", __self_0, &__self_1),
TokenTree::MetaVar(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"MetaVar", __self_0, &__self_1),
TokenTree::MetaVarDecl {
span: __self_0, name: __self_1, kind: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"MetaVarDecl", "span", __self_0, "name", __self_1, "kind",
&__self_2),
TokenTree::MetaVarExpr(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"MetaVarExpr", __self_0, &__self_1),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for TokenTree {
#[inline]
fn eq(&self, other: &TokenTree) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(TokenTree::Token(__self_0), TokenTree::Token(__arg1_0)) =>
__self_0 == __arg1_0,
(TokenTree::Delimited(__self_0, __self_1, __self_2),
TokenTree::Delimited(__arg1_0, __arg1_1, __arg1_2)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1 &&
__self_2 == __arg1_2,
(TokenTree::Sequence(__self_0, __self_1),
TokenTree::Sequence(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(TokenTree::MetaVar(__self_0, __self_1),
TokenTree::MetaVar(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(TokenTree::MetaVarDecl {
span: __self_0, name: __self_1, kind: __self_2 },
TokenTree::MetaVarDecl {
span: __arg1_0, name: __arg1_1, kind: __arg1_2 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1 &&
__self_2 == __arg1_2,
(TokenTree::MetaVarExpr(__self_0, __self_1),
TokenTree::MetaVarExpr(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for TokenTree {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
TokenTree::Token(ref __binding_0) => { 0usize }
TokenTree::Delimited(ref __binding_0, ref __binding_1,
ref __binding_2) => {
1usize
}
TokenTree::Sequence(ref __binding_0, ref __binding_1) => {
2usize
}
TokenTree::MetaVar(ref __binding_0, ref __binding_1) => {
3usize
}
TokenTree::MetaVarDecl {
span: ref __binding_0,
name: ref __binding_1,
kind: ref __binding_2 } => {
4usize
}
TokenTree::MetaVarExpr(ref __binding_0, ref __binding_1) =>
{
5usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
TokenTree::Token(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TokenTree::Delimited(ref __binding_0, ref __binding_1,
ref __binding_2) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
}
TokenTree::Sequence(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TokenTree::MetaVar(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TokenTree::MetaVarDecl {
span: ref __binding_0,
name: ref __binding_1,
kind: ref __binding_2 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
}
TokenTree::MetaVarExpr(ref __binding_0, ref __binding_1) =>
{
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for TokenTree {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
TokenTree::Token(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
TokenTree::Delimited(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
TokenTree::Sequence(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
3usize => {
TokenTree::MetaVar(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
4usize => {
TokenTree::MetaVarDecl {
span: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
kind: ::rustc_serialize::Decodable::decode(__decoder),
}
}
5usize => {
TokenTree::MetaVarExpr(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TokenTree`, expected 0..6, actual {0}",
n));
}
}
}
}
};Decodable)]
69enum TokenTree {
70 Token(Token),
73 Delimited(DelimSpan, DelimSpacing, Delimited),
75 Sequence(DelimSpan, SequenceRepetition),
77 MetaVar(Span, Ident),
80 MetaVarDecl {
82 span: Span,
83 name: Ident,
85 kind: NonterminalKind,
87 },
88 MetaVarExpr(DelimSpan, MetaVarExpr),
90}
91
92impl TokenTree {
93 fn is_delimited(&self) -> bool {
95 #[allow(non_exhaustive_omitted_patterns)] match *self {
TokenTree::Delimited(..) => true,
_ => false,
}matches!(*self, TokenTree::Delimited(..))
96 }
97
98 fn is_token(&self, expected_kind: &TokenKind) -> bool {
100 match self {
101 TokenTree::Token(Token { kind: actual_kind, .. }) => actual_kind == expected_kind,
102 _ => false,
103 }
104 }
105
106 fn span(&self) -> Span {
108 match *self {
109 TokenTree::Token(Token { span, .. })
110 | TokenTree::MetaVar(span, _)
111 | TokenTree::MetaVarDecl { span, .. } => span,
112 TokenTree::Delimited(span, ..)
113 | TokenTree::MetaVarExpr(span, _)
114 | TokenTree::Sequence(span, _) => span.entire(),
115 }
116 }
117
118 fn token(kind: TokenKind, span: Span) -> TokenTree {
119 TokenTree::Token(Token::new(kind, span))
120 }
121}