1use std::borrow::Cow;
2use std::fmt;
3
4pub use LitKind::*;
5pub use NtExprKind::*;
6pub use NtPatKind::*;
7pub use TokenKind::*;
8use rustc_macros::{Decodable, Encodable, StableHash};
9use rustc_span::edition::Edition;
10use rustc_span::symbol::IdentPrintMode;
11use rustc_span::{self as sp, DUMMY_SP, ErrorGuaranteed, Span, Symbol, kw, sym};
12
13use crate::ast;
14use crate::util::case::Case;
15
16#[derive(#[automatically_derived]
impl ::core::clone::Clone for DocFragmentKind {
#[inline]
fn clone(&self) -> DocFragmentKind {
let _: ::core::clone::AssertParamIsClone<CommentKind>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DocFragmentKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for DocFragmentKind {
#[inline]
fn eq(&self, other: &DocFragmentKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(DocFragmentKind::Sugared(__self_0),
DocFragmentKind::Sugared(__arg1_0)) => __self_0 == __arg1_0,
(DocFragmentKind::Raw(__self_0),
DocFragmentKind::Raw(__arg1_0)) => __self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DocFragmentKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<CommentKind>;
let _: ::core::cmp::AssertParamIsEq<Span>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for DocFragmentKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
DocFragmentKind::Sugared(ref __binding_0) => { 0usize }
DocFragmentKind::Raw(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
DocFragmentKind::Sugared(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
DocFragmentKind::Raw(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for DocFragmentKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
DocFragmentKind::Sugared(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
DocFragmentKind::Raw(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `DocFragmentKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for DocFragmentKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
DocFragmentKind::Sugared(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Sugared", &__self_0),
DocFragmentKind::Raw(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Raw",
&__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
DocFragmentKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
DocFragmentKind::Sugared(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
DocFragmentKind::Raw(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
18pub enum DocFragmentKind {
19 Sugared(CommentKind),
21 Raw(Span),
23}
24
25impl DocFragmentKind {
26 pub fn is_sugared(self) -> bool {
27 #[allow(non_exhaustive_omitted_patterns)] match self {
Self::Sugared(_) => true,
_ => false,
}matches!(self, Self::Sugared(_))
28 }
29
30 pub fn comment_kind(self) -> CommentKind {
33 match self {
34 Self::Sugared(kind) => kind,
35 Self::Raw(_) => CommentKind::Line,
36 }
37 }
38}
39
40#[derive(#[automatically_derived]
impl ::core::clone::Clone for CommentKind {
#[inline]
fn clone(&self) -> CommentKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CommentKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for CommentKind {
#[inline]
fn eq(&self, other: &CommentKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CommentKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for CommentKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CommentKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CommentKind::Line => { 0usize }
CommentKind::Block => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
CommentKind::Line => {}
CommentKind::Block => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CommentKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { CommentKind::Line }
1usize => { CommentKind::Block }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CommentKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for CommentKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CommentKind::Line => "Line",
CommentKind::Block => "Block",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for CommentKind
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
CommentKind::Line => {}
CommentKind::Block => {}
}
}
}
};StableHash)]
41pub enum CommentKind {
42 Line,
43 Block,
44}
45
46#[derive(#[automatically_derived]
impl ::core::marker::Copy for InvisibleOrigin { }Copy, #[automatically_derived]
impl ::core::clone::Clone for InvisibleOrigin {
#[inline]
fn clone(&self) -> InvisibleOrigin {
let _: ::core::clone::AssertParamIsClone<MetaVarKind>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for InvisibleOrigin {
#[inline]
fn eq(&self, other: &InvisibleOrigin) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(InvisibleOrigin::MetaVar(__self_0),
InvisibleOrigin::MetaVar(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InvisibleOrigin {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<MetaVarKind>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for InvisibleOrigin {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
InvisibleOrigin::MetaVar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for InvisibleOrigin {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
InvisibleOrigin::MetaVar(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"MetaVar", &__self_0),
InvisibleOrigin::ProcMacro =>
::core::fmt::Formatter::write_str(f, "ProcMacro"),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for InvisibleOrigin {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
InvisibleOrigin::MetaVar(ref __binding_0) => { 0usize }
InvisibleOrigin::ProcMacro => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
InvisibleOrigin::MetaVar(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
InvisibleOrigin::ProcMacro => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for InvisibleOrigin {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
InvisibleOrigin::MetaVar(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => { InvisibleOrigin::ProcMacro }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InvisibleOrigin`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
InvisibleOrigin {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
InvisibleOrigin::MetaVar(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InvisibleOrigin::ProcMacro => {}
}
}
}
};StableHash)]
47pub enum InvisibleOrigin {
48 MetaVar(MetaVarKind),
50
51 ProcMacro,
54}
55
56impl InvisibleOrigin {
57 #[inline]
60 pub fn skip(&self) -> bool {
61 match self {
62 InvisibleOrigin::MetaVar(_) => false,
63 InvisibleOrigin::ProcMacro => true,
64 }
65 }
66}
67
68#[derive(#[automatically_derived]
impl ::core::fmt::Debug for MetaVarKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
MetaVarKind::Item => ::core::fmt::Formatter::write_str(f, "Item"),
MetaVarKind::Block =>
::core::fmt::Formatter::write_str(f, "Block"),
MetaVarKind::Stmt => ::core::fmt::Formatter::write_str(f, "Stmt"),
MetaVarKind::Pat(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Pat",
&__self_0),
MetaVarKind::Expr {
kind: __self_0,
can_begin_literal_maybe_minus: __self_1,
can_begin_string_literal: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Expr",
"kind", __self_0, "can_begin_literal_maybe_minus", __self_1,
"can_begin_string_literal", &__self_2),
MetaVarKind::Ty { is_path: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Ty",
"is_path", &__self_0),
MetaVarKind::Ident =>
::core::fmt::Formatter::write_str(f, "Ident"),
MetaVarKind::Lifetime =>
::core::fmt::Formatter::write_str(f, "Lifetime"),
MetaVarKind::Literal =>
::core::fmt::Formatter::write_str(f, "Literal"),
MetaVarKind::Meta { has_meta_form: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Meta",
"has_meta_form", &__self_0),
MetaVarKind::Path => ::core::fmt::Formatter::write_str(f, "Path"),
MetaVarKind::Vis => ::core::fmt::Formatter::write_str(f, "Vis"),
MetaVarKind::Guard =>
::core::fmt::Formatter::write_str(f, "Guard"),
MetaVarKind::TT => ::core::fmt::Formatter::write_str(f, "TT"),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for MetaVarKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for MetaVarKind {
#[inline]
fn clone(&self) -> MetaVarKind {
let _: ::core::clone::AssertParamIsClone<NtPatKind>;
let _: ::core::clone::AssertParamIsClone<NtExprKind>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for MetaVarKind {
#[inline]
fn eq(&self, other: &MetaVarKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(MetaVarKind::Pat(__self_0), MetaVarKind::Pat(__arg1_0)) =>
__self_0 == __arg1_0,
(MetaVarKind::Expr {
kind: __self_0,
can_begin_literal_maybe_minus: __self_1,
can_begin_string_literal: __self_2 }, MetaVarKind::Expr {
kind: __arg1_0,
can_begin_literal_maybe_minus: __arg1_1,
can_begin_string_literal: __arg1_2 }) =>
__self_1 == __arg1_1 && __self_2 == __arg1_2 &&
__self_0 == __arg1_0,
(MetaVarKind::Ty { is_path: __self_0 }, MetaVarKind::Ty {
is_path: __arg1_0 }) => __self_0 == __arg1_0,
(MetaVarKind::Meta { has_meta_form: __self_0 },
MetaVarKind::Meta { has_meta_form: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MetaVarKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<NtPatKind>;
let _: ::core::cmp::AssertParamIsEq<NtExprKind>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for MetaVarKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
MetaVarKind::Item => { 0usize }
MetaVarKind::Block => { 1usize }
MetaVarKind::Stmt => { 2usize }
MetaVarKind::Pat(ref __binding_0) => { 3usize }
MetaVarKind::Expr {
kind: ref __binding_0,
can_begin_literal_maybe_minus: ref __binding_1,
can_begin_string_literal: ref __binding_2 } => {
4usize
}
MetaVarKind::Ty { is_path: ref __binding_0 } => { 5usize }
MetaVarKind::Ident => { 6usize }
MetaVarKind::Lifetime => { 7usize }
MetaVarKind::Literal => { 8usize }
MetaVarKind::Meta { has_meta_form: ref __binding_0 } => {
9usize
}
MetaVarKind::Path => { 10usize }
MetaVarKind::Vis => { 11usize }
MetaVarKind::Guard => { 12usize }
MetaVarKind::TT => { 13usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
MetaVarKind::Item => {}
MetaVarKind::Block => {}
MetaVarKind::Stmt => {}
MetaVarKind::Pat(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
MetaVarKind::Expr {
kind: ref __binding_0,
can_begin_literal_maybe_minus: ref __binding_1,
can_begin_string_literal: 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);
}
MetaVarKind::Ty { is_path: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
MetaVarKind::Ident => {}
MetaVarKind::Lifetime => {}
MetaVarKind::Literal => {}
MetaVarKind::Meta { has_meta_form: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
MetaVarKind::Path => {}
MetaVarKind::Vis => {}
MetaVarKind::Guard => {}
MetaVarKind::TT => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for MetaVarKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { MetaVarKind::Item }
1usize => { MetaVarKind::Block }
2usize => { MetaVarKind::Stmt }
3usize => {
MetaVarKind::Pat(::rustc_serialize::Decodable::decode(__decoder))
}
4usize => {
MetaVarKind::Expr {
kind: ::rustc_serialize::Decodable::decode(__decoder),
can_begin_literal_maybe_minus: ::rustc_serialize::Decodable::decode(__decoder),
can_begin_string_literal: ::rustc_serialize::Decodable::decode(__decoder),
}
}
5usize => {
MetaVarKind::Ty {
is_path: ::rustc_serialize::Decodable::decode(__decoder),
}
}
6usize => { MetaVarKind::Ident }
7usize => { MetaVarKind::Lifetime }
8usize => { MetaVarKind::Literal }
9usize => {
MetaVarKind::Meta {
has_meta_form: ::rustc_serialize::Decodable::decode(__decoder),
}
}
10usize => { MetaVarKind::Path }
11usize => { MetaVarKind::Vis }
12usize => { MetaVarKind::Guard }
13usize => { MetaVarKind::TT }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MetaVarKind`, expected 0..14, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for MetaVarKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
MetaVarKind::Pat(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
MetaVarKind::Expr {
kind: __self_0,
can_begin_literal_maybe_minus: __self_1,
can_begin_string_literal: __self_2 } => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state);
::core::hash::Hash::hash(__self_2, state)
}
MetaVarKind::Ty { is_path: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
MetaVarKind::Meta { has_meta_form: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for MetaVarKind
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
MetaVarKind::Item => {}
MetaVarKind::Block => {}
MetaVarKind::Stmt => {}
MetaVarKind::Pat(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
MetaVarKind::Expr {
kind: ref __binding_0,
can_begin_literal_maybe_minus: ref __binding_1,
can_begin_string_literal: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
MetaVarKind::Ty { is_path: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
MetaVarKind::Ident => {}
MetaVarKind::Lifetime => {}
MetaVarKind::Literal => {}
MetaVarKind::Meta { has_meta_form: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
MetaVarKind::Path => {}
MetaVarKind::Vis => {}
MetaVarKind::Guard => {}
MetaVarKind::TT => {}
}
}
}
};StableHash)]
70pub enum MetaVarKind {
71 Item,
72 Block,
73 Stmt,
74 Pat(NtPatKind),
75 Expr {
76 kind: NtExprKind,
77 can_begin_literal_maybe_minus: bool,
79 can_begin_string_literal: bool,
81 },
82 Ty {
83 is_path: bool,
84 },
85 Ident,
86 Lifetime,
87 Literal,
88 Meta {
89 has_meta_form: bool,
91 },
92 Path,
93 Vis,
94 Guard,
95 TT,
96}
97
98impl fmt::Display for MetaVarKind {
99 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
100 let sym = match self {
101 MetaVarKind::Item => sym::item,
102 MetaVarKind::Block => sym::block,
103 MetaVarKind::Stmt => sym::stmt,
104 MetaVarKind::Pat(PatParam { inferred: true } | PatWithOr) => sym::pat,
105 MetaVarKind::Pat(PatParam { inferred: false }) => sym::pat_param,
106 MetaVarKind::Expr { kind: Expr2021 { inferred: true } | Expr, .. } => sym::expr,
107 MetaVarKind::Expr { kind: Expr2021 { inferred: false }, .. } => sym::expr_2021,
108 MetaVarKind::Ty { .. } => sym::ty,
109 MetaVarKind::Ident => sym::ident,
110 MetaVarKind::Lifetime => sym::lifetime,
111 MetaVarKind::Literal => sym::literal,
112 MetaVarKind::Meta { .. } => sym::meta,
113 MetaVarKind::Path => sym::path,
114 MetaVarKind::Vis => sym::vis,
115 MetaVarKind::Guard => sym::guard,
116 MetaVarKind::TT => sym::tt,
117 };
118 f.write_fmt(format_args!("{0}", sym))write!(f, "{sym}")
119 }
120}
121
122#[derive(#[automatically_derived]
impl ::core::marker::Copy for Delimiter { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Delimiter {
#[inline]
fn clone(&self) -> Delimiter {
let _: ::core::clone::AssertParamIsClone<InvisibleOrigin>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Delimiter {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Delimiter::Parenthesis =>
::core::fmt::Formatter::write_str(f, "Parenthesis"),
Delimiter::Brace => ::core::fmt::Formatter::write_str(f, "Brace"),
Delimiter::Bracket =>
::core::fmt::Formatter::write_str(f, "Bracket"),
Delimiter::Invisible(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Invisible", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for Delimiter {
#[inline]
fn eq(&self, other: &Delimiter) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Delimiter::Invisible(__self_0),
Delimiter::Invisible(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Delimiter {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<InvisibleOrigin>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Delimiter {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Delimiter::Invisible(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Delimiter {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Delimiter::Parenthesis => { 0usize }
Delimiter::Brace => { 1usize }
Delimiter::Bracket => { 2usize }
Delimiter::Invisible(ref __binding_0) => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Delimiter::Parenthesis => {}
Delimiter::Brace => {}
Delimiter::Bracket => {}
Delimiter::Invisible(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Delimiter {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Delimiter::Parenthesis }
1usize => { Delimiter::Brace }
2usize => { Delimiter::Bracket }
3usize => {
Delimiter::Invisible(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Delimiter`, expected 0..4, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Delimiter {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Delimiter::Parenthesis => {}
Delimiter::Brace => {}
Delimiter::Bracket => {}
Delimiter::Invisible(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
126pub enum Delimiter {
127 Parenthesis,
129 Brace,
131 Bracket,
133 Invisible(InvisibleOrigin),
139}
140
141impl Delimiter {
142 #[inline]
146 pub fn skip(&self) -> bool {
147 match self {
148 Delimiter::Parenthesis | Delimiter::Bracket | Delimiter::Brace => false,
149 Delimiter::Invisible(origin) => origin.skip(),
150 }
151 }
152
153 pub fn eq_ignoring_invisible_origin(&self, other: &Delimiter) -> bool {
156 match (self, other) {
157 (Delimiter::Parenthesis, Delimiter::Parenthesis) => true,
158 (Delimiter::Brace, Delimiter::Brace) => true,
159 (Delimiter::Bracket, Delimiter::Bracket) => true,
160 (Delimiter::Invisible(_), Delimiter::Invisible(_)) => true,
161 _ => false,
162 }
163 }
164
165 pub fn as_open_token_kind(&self) -> TokenKind {
166 match *self {
167 Delimiter::Parenthesis => OpenParen,
168 Delimiter::Brace => OpenBrace,
169 Delimiter::Bracket => OpenBracket,
170 Delimiter::Invisible(origin) => OpenInvisible(origin),
171 }
172 }
173
174 pub fn as_close_token_kind(&self) -> TokenKind {
175 match *self {
176 Delimiter::Parenthesis => CloseParen,
177 Delimiter::Brace => CloseBrace,
178 Delimiter::Bracket => CloseBracket,
179 Delimiter::Invisible(origin) => CloseInvisible(origin),
180 }
181 }
182}
183
184#[derive(#[automatically_derived]
impl ::core::clone::Clone for LitKind {
#[inline]
fn clone(&self) -> LitKind {
let _: ::core::clone::AssertParamIsClone<u8>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LitKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LitKind {
#[inline]
fn eq(&self, other: &LitKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(LitKind::StrRaw(__self_0), LitKind::StrRaw(__arg1_0)) =>
__self_0 == __arg1_0,
(LitKind::ByteStrRaw(__self_0), LitKind::ByteStrRaw(__arg1_0))
=> __self_0 == __arg1_0,
(LitKind::CStrRaw(__self_0), LitKind::CStrRaw(__arg1_0)) =>
__self_0 == __arg1_0,
(LitKind::Err(__self_0), LitKind::Err(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LitKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
let _: ::core::cmp::AssertParamIsEq<ErrorGuaranteed>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for LitKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
LitKind::StrRaw(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
LitKind::ByteStrRaw(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
LitKind::CStrRaw(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
LitKind::Err(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for LitKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
LitKind::Bool => { 0usize }
LitKind::Byte => { 1usize }
LitKind::Char => { 2usize }
LitKind::Integer => { 3usize }
LitKind::Float => { 4usize }
LitKind::Str => { 5usize }
LitKind::StrRaw(ref __binding_0) => { 6usize }
LitKind::ByteStr => { 7usize }
LitKind::ByteStrRaw(ref __binding_0) => { 8usize }
LitKind::CStr => { 9usize }
LitKind::CStrRaw(ref __binding_0) => { 10usize }
LitKind::Err(ref __binding_0) => { 11usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
LitKind::Bool => {}
LitKind::Byte => {}
LitKind::Char => {}
LitKind::Integer => {}
LitKind::Float => {}
LitKind::Str => {}
LitKind::StrRaw(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
LitKind::ByteStr => {}
LitKind::ByteStrRaw(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
LitKind::CStr => {}
LitKind::CStrRaw(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
LitKind::Err(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for LitKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { LitKind::Bool }
1usize => { LitKind::Byte }
2usize => { LitKind::Char }
3usize => { LitKind::Integer }
4usize => { LitKind::Float }
5usize => { LitKind::Str }
6usize => {
LitKind::StrRaw(::rustc_serialize::Decodable::decode(__decoder))
}
7usize => { LitKind::ByteStr }
8usize => {
LitKind::ByteStrRaw(::rustc_serialize::Decodable::decode(__decoder))
}
9usize => { LitKind::CStr }
10usize => {
LitKind::CStrRaw(::rustc_serialize::Decodable::decode(__decoder))
}
11usize => {
LitKind::Err(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LitKind`, expected 0..12, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LitKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LitKind::Bool => ::core::fmt::Formatter::write_str(f, "Bool"),
LitKind::Byte => ::core::fmt::Formatter::write_str(f, "Byte"),
LitKind::Char => ::core::fmt::Formatter::write_str(f, "Char"),
LitKind::Integer =>
::core::fmt::Formatter::write_str(f, "Integer"),
LitKind::Float => ::core::fmt::Formatter::write_str(f, "Float"),
LitKind::Str => ::core::fmt::Formatter::write_str(f, "Str"),
LitKind::StrRaw(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "StrRaw",
&__self_0),
LitKind::ByteStr =>
::core::fmt::Formatter::write_str(f, "ByteStr"),
LitKind::ByteStrRaw(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ByteStrRaw", &__self_0),
LitKind::CStr => ::core::fmt::Formatter::write_str(f, "CStr"),
LitKind::CStrRaw(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"CStrRaw", &__self_0),
LitKind::Err(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LitKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
LitKind::Bool => {}
LitKind::Byte => {}
LitKind::Char => {}
LitKind::Integer => {}
LitKind::Float => {}
LitKind::Str => {}
LitKind::StrRaw(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LitKind::ByteStr => {}
LitKind::ByteStrRaw(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LitKind::CStr => {}
LitKind::CStrRaw(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LitKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
189pub enum LitKind {
190 Bool, Byte,
192 Char,
193 Integer, Float, Str,
196 StrRaw(u8), ByteStr,
198 ByteStrRaw(u8), CStr,
200 CStrRaw(u8),
201 Err(ErrorGuaranteed),
202}
203
204#[derive(#[automatically_derived]
impl ::core::clone::Clone for Lit {
#[inline]
fn clone(&self) -> Lit {
let _: ::core::clone::AssertParamIsClone<LitKind>;
let _: ::core::clone::AssertParamIsClone<Symbol>;
let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Lit { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for Lit {
#[inline]
fn eq(&self, other: &Lit) -> bool {
self.kind == other.kind && self.symbol == other.symbol &&
self.suffix == other.suffix
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Lit {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<LitKind>;
let _: ::core::cmp::AssertParamIsEq<Symbol>;
let _: ::core::cmp::AssertParamIsEq<Option<Symbol>>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Lit {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.kind, state);
::core::hash::Hash::hash(&self.symbol, state);
::core::hash::Hash::hash(&self.suffix, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Lit {
fn encode(&self, __encoder: &mut __E) {
match *self {
Lit {
kind: ref __binding_0,
symbol: ref __binding_1,
suffix: 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);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Lit {
fn decode(__decoder: &mut __D) -> Self {
Lit {
kind: ::rustc_serialize::Decodable::decode(__decoder),
symbol: ::rustc_serialize::Decodable::decode(__decoder),
suffix: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Lit {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "Lit", "kind",
&self.kind, "symbol", &self.symbol, "suffix", &&self.suffix)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Lit {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Lit {
kind: ref __binding_0,
symbol: ref __binding_1,
suffix: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
206pub struct Lit {
207 pub kind: LitKind,
208 pub symbol: Symbol,
209 pub suffix: Option<Symbol>,
210}
211
212impl Lit {
213 pub fn new(kind: LitKind, symbol: Symbol, suffix: Option<Symbol>) -> Lit {
214 Lit { kind, symbol, suffix }
215 }
216
217 pub fn is_semantic_float(&self) -> bool {
220 match self.kind {
221 LitKind::Float => true,
222 LitKind::Integer => match self.suffix {
223 Some(sym) => sym == sym::f32 || sym == sym::f64,
224 None => false,
225 },
226 _ => false,
227 }
228 }
229
230 pub fn from_token(token: &Token) -> Option<Lit> {
233 match token.uninterpolate().kind {
234 Ident(name, IdentIsRaw::No) if name.is_bool_lit() => Some(Lit::new(Bool, name, None)),
235 Literal(token_lit) => Some(token_lit),
236 OpenInvisible(InvisibleOrigin::MetaVar(
237 MetaVarKind::Literal | MetaVarKind::Expr { .. },
238 )) => {
239 { ::core::panicking::panic_fmt(format_args!("from_token metavar")); };panic!("from_token metavar");
241 }
242 _ => None,
243 }
244 }
245}
246
247impl fmt::Display for Lit {
248 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
249 let Lit { kind, symbol, suffix } = *self;
250 match kind {
251 Byte => f.write_fmt(format_args!("b\'{0}\'", symbol))write!(f, "b'{symbol}'")?,
252 Char => f.write_fmt(format_args!("\'{0}\'", symbol))write!(f, "'{symbol}'")?,
253 Str => f.write_fmt(format_args!("\"{0}\"", symbol))write!(f, "\"{symbol}\"")?,
254 StrRaw(n) => f.write_fmt(format_args!("r{0}\"{1}\"{0}", "#".repeat(n as usize), symbol))write!(
255 f,
256 "r{delim}\"{string}\"{delim}",
257 delim = "#".repeat(n as usize),
258 string = symbol
259 )?,
260 ByteStr => f.write_fmt(format_args!("b\"{0}\"", symbol))write!(f, "b\"{symbol}\"")?,
261 ByteStrRaw(n) => f.write_fmt(format_args!("br{0}\"{1}\"{0}", "#".repeat(n as usize), symbol))write!(
262 f,
263 "br{delim}\"{string}\"{delim}",
264 delim = "#".repeat(n as usize),
265 string = symbol
266 )?,
267 CStr => f.write_fmt(format_args!("c\"{0}\"", symbol))write!(f, "c\"{symbol}\"")?,
268 CStrRaw(n) => {
269 f.write_fmt(format_args!("cr{0}\"{1}\"{0}", "#".repeat(n as usize), symbol))write!(f, "cr{delim}\"{symbol}\"{delim}", delim = "#".repeat(n as usize))?
270 }
271 Integer | Float | Bool | Err(_) => f.write_fmt(format_args!("{0}", symbol))write!(f, "{symbol}")?,
272 }
273
274 if let Some(suffix) = suffix {
275 f.write_fmt(format_args!("{0}", suffix))write!(f, "{suffix}")?;
276 }
277
278 Ok(())
279 }
280}
281
282impl LitKind {
283 pub fn article(self) -> &'static str {
285 match self {
286 Integer | Err(_) => "an",
287 _ => "a",
288 }
289 }
290
291 pub fn descr(self) -> &'static str {
292 match self {
293 Bool => "boolean",
294 Byte => "byte",
295 Char => "char",
296 Integer => "integer",
297 Float => "float",
298 Str | StrRaw(..) => "string",
299 ByteStr | ByteStrRaw(..) => "byte string",
300 CStr | CStrRaw(..) => "C string",
301 Err(_) => "error",
302 }
303 }
304
305 pub(crate) fn may_have_suffix(self) -> bool {
306 #[allow(non_exhaustive_omitted_patterns)] match self {
Integer | Float | Err(_) => true,
_ => false,
}matches!(self, Integer | Float | Err(_))
307 }
308}
309
310pub fn ident_can_begin_expr(name: Symbol, span: Span, is_raw: IdentIsRaw) -> bool {
311 let ident_token = Token::new(Ident(name, is_raw), span);
312
313 !ident_token.is_reserved_ident()
314 || ident_token.is_path_segment_keyword()
315 || [
316 kw::Async,
317 kw::Do,
318 kw::Box,
319 kw::Break,
320 kw::Const,
321 kw::Continue,
322 kw::False,
323 kw::For,
324 kw::Gen,
325 kw::If,
326 kw::Let,
327 kw::Loop,
328 kw::Match,
329 kw::Move,
330 kw::Return,
331 kw::True,
332 kw::Try,
333 kw::Unsafe,
334 kw::While,
335 kw::Yield,
336 kw::Safe,
337 kw::Static,
338 ]
339 .contains(&name)
340}
341
342fn ident_can_begin_type(name: Symbol, span: Span, is_raw: IdentIsRaw) -> bool {
343 let ident_token = Token::new(Ident(name, is_raw), span);
344
345 !ident_token.is_reserved_ident()
346 || ident_token.is_path_segment_keyword()
347 || [kw::Underscore, kw::For, kw::Impl, kw::Fn, kw::Unsafe, kw::Extern, kw::Typeof, kw::Dyn]
348 .contains(&name)
349}
350
351#[derive(#[automatically_derived]
impl ::core::cmp::PartialEq for IdentIsRaw {
#[inline]
fn eq(&self, other: &IdentIsRaw) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for IdentIsRaw {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for IdentIsRaw {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
IdentIsRaw::No => { 0usize }
IdentIsRaw::Yes => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self { IdentIsRaw::No => {} IdentIsRaw::Yes => {} }
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for IdentIsRaw {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { IdentIsRaw::No }
1usize => { IdentIsRaw::Yes }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `IdentIsRaw`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for IdentIsRaw {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for IdentIsRaw {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { IdentIsRaw::No => "No", IdentIsRaw::Yes => "Yes", })
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for IdentIsRaw { }Copy, #[automatically_derived]
impl ::core::clone::Clone for IdentIsRaw {
#[inline]
fn clone(&self) -> IdentIsRaw { *self }
}Clone, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for IdentIsRaw {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self { IdentIsRaw::No => {} IdentIsRaw::Yes => {} }
}
}
};StableHash)]
352pub enum IdentIsRaw {
353 No,
354 Yes,
355}
356
357impl IdentIsRaw {
358 pub fn to_print_mode_ident(self) -> IdentPrintMode {
359 match self {
360 IdentIsRaw::No => IdentPrintMode::Normal,
361 IdentIsRaw::Yes => IdentPrintMode::RawIdent,
362 }
363 }
364 pub fn to_print_mode_lifetime(self) -> IdentPrintMode {
365 match self {
366 IdentIsRaw::No => IdentPrintMode::Normal,
367 IdentIsRaw::Yes => IdentPrintMode::RawLifetime,
368 }
369 }
370}
371
372impl From<bool> for IdentIsRaw {
373 fn from(b: bool) -> Self {
374 if b { Self::Yes } else { Self::No }
375 }
376}
377
378#[derive(#[automatically_derived]
impl ::core::clone::Clone for TokenKind {
#[inline]
fn clone(&self) -> TokenKind {
let _: ::core::clone::AssertParamIsClone<InvisibleOrigin>;
let _: ::core::clone::AssertParamIsClone<Lit>;
let _: ::core::clone::AssertParamIsClone<Symbol>;
let _: ::core::clone::AssertParamIsClone<IdentIsRaw>;
let _: ::core::clone::AssertParamIsClone<sp::Ident>;
let _: ::core::clone::AssertParamIsClone<sp::Ident>;
let _: ::core::clone::AssertParamIsClone<CommentKind>;
let _: ::core::clone::AssertParamIsClone<ast::AttrStyle>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for TokenKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for TokenKind {
#[inline]
fn eq(&self, other: &TokenKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(TokenKind::OpenInvisible(__self_0),
TokenKind::OpenInvisible(__arg1_0)) => __self_0 == __arg1_0,
(TokenKind::CloseInvisible(__self_0),
TokenKind::CloseInvisible(__arg1_0)) =>
__self_0 == __arg1_0,
(TokenKind::Literal(__self_0), TokenKind::Literal(__arg1_0))
=> __self_0 == __arg1_0,
(TokenKind::Ident(__self_0, __self_1),
TokenKind::Ident(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(TokenKind::NtIdent(__self_0, __self_1),
TokenKind::NtIdent(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(TokenKind::Lifetime(__self_0, __self_1),
TokenKind::Lifetime(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(TokenKind::NtLifetime(__self_0, __self_1),
TokenKind::NtLifetime(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(TokenKind::DocComment(__self_0, __self_1, __self_2),
TokenKind::DocComment(__arg1_0, __arg1_1, __arg1_2)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1 &&
__self_2 == __arg1_2,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TokenKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<InvisibleOrigin>;
let _: ::core::cmp::AssertParamIsEq<Lit>;
let _: ::core::cmp::AssertParamIsEq<Symbol>;
let _: ::core::cmp::AssertParamIsEq<IdentIsRaw>;
let _: ::core::cmp::AssertParamIsEq<sp::Ident>;
let _: ::core::cmp::AssertParamIsEq<sp::Ident>;
let _: ::core::cmp::AssertParamIsEq<CommentKind>;
let _: ::core::cmp::AssertParamIsEq<ast::AttrStyle>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for TokenKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
TokenKind::OpenInvisible(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
TokenKind::CloseInvisible(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
TokenKind::Literal(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
TokenKind::Ident(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
TokenKind::NtIdent(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
TokenKind::Lifetime(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
TokenKind::NtLifetime(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
TokenKind::DocComment(__self_0, __self_1, __self_2) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state);
::core::hash::Hash::hash(__self_2, state)
}
_ => {}
}
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for TokenKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
TokenKind::Eq => { 0usize }
TokenKind::Lt => { 1usize }
TokenKind::Le => { 2usize }
TokenKind::EqEq => { 3usize }
TokenKind::Ne => { 4usize }
TokenKind::Ge => { 5usize }
TokenKind::Gt => { 6usize }
TokenKind::AndAnd => { 7usize }
TokenKind::OrOr => { 8usize }
TokenKind::Bang => { 9usize }
TokenKind::Tilde => { 10usize }
TokenKind::Plus => { 11usize }
TokenKind::Minus => { 12usize }
TokenKind::Star => { 13usize }
TokenKind::Slash => { 14usize }
TokenKind::Percent => { 15usize }
TokenKind::Caret => { 16usize }
TokenKind::And => { 17usize }
TokenKind::Or => { 18usize }
TokenKind::Shl => { 19usize }
TokenKind::Shr => { 20usize }
TokenKind::PlusEq => { 21usize }
TokenKind::MinusEq => { 22usize }
TokenKind::StarEq => { 23usize }
TokenKind::SlashEq => { 24usize }
TokenKind::PercentEq => { 25usize }
TokenKind::CaretEq => { 26usize }
TokenKind::AndEq => { 27usize }
TokenKind::OrEq => { 28usize }
TokenKind::ShlEq => { 29usize }
TokenKind::ShrEq => { 30usize }
TokenKind::At => { 31usize }
TokenKind::Dot => { 32usize }
TokenKind::DotDot => { 33usize }
TokenKind::DotDotDot => { 34usize }
TokenKind::DotDotEq => { 35usize }
TokenKind::Comma => { 36usize }
TokenKind::Semi => { 37usize }
TokenKind::Colon => { 38usize }
TokenKind::PathSep => { 39usize }
TokenKind::RArrow => { 40usize }
TokenKind::LArrow => { 41usize }
TokenKind::FatArrow => { 42usize }
TokenKind::Pound => { 43usize }
TokenKind::Dollar => { 44usize }
TokenKind::Question => { 45usize }
TokenKind::SingleQuote => { 46usize }
TokenKind::OpenParen => { 47usize }
TokenKind::CloseParen => { 48usize }
TokenKind::OpenBrace => { 49usize }
TokenKind::CloseBrace => { 50usize }
TokenKind::OpenBracket => { 51usize }
TokenKind::CloseBracket => { 52usize }
TokenKind::OpenInvisible(ref __binding_0) => { 53usize }
TokenKind::CloseInvisible(ref __binding_0) => { 54usize }
TokenKind::Literal(ref __binding_0) => { 55usize }
TokenKind::Ident(ref __binding_0, ref __binding_1) => {
56usize
}
TokenKind::NtIdent(ref __binding_0, ref __binding_1) => {
57usize
}
TokenKind::Lifetime(ref __binding_0, ref __binding_1) => {
58usize
}
TokenKind::NtLifetime(ref __binding_0, ref __binding_1) => {
59usize
}
TokenKind::DocComment(ref __binding_0, ref __binding_1,
ref __binding_2) => {
60usize
}
TokenKind::Eof => { 61usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
TokenKind::Eq => {}
TokenKind::Lt => {}
TokenKind::Le => {}
TokenKind::EqEq => {}
TokenKind::Ne => {}
TokenKind::Ge => {}
TokenKind::Gt => {}
TokenKind::AndAnd => {}
TokenKind::OrOr => {}
TokenKind::Bang => {}
TokenKind::Tilde => {}
TokenKind::Plus => {}
TokenKind::Minus => {}
TokenKind::Star => {}
TokenKind::Slash => {}
TokenKind::Percent => {}
TokenKind::Caret => {}
TokenKind::And => {}
TokenKind::Or => {}
TokenKind::Shl => {}
TokenKind::Shr => {}
TokenKind::PlusEq => {}
TokenKind::MinusEq => {}
TokenKind::StarEq => {}
TokenKind::SlashEq => {}
TokenKind::PercentEq => {}
TokenKind::CaretEq => {}
TokenKind::AndEq => {}
TokenKind::OrEq => {}
TokenKind::ShlEq => {}
TokenKind::ShrEq => {}
TokenKind::At => {}
TokenKind::Dot => {}
TokenKind::DotDot => {}
TokenKind::DotDotDot => {}
TokenKind::DotDotEq => {}
TokenKind::Comma => {}
TokenKind::Semi => {}
TokenKind::Colon => {}
TokenKind::PathSep => {}
TokenKind::RArrow => {}
TokenKind::LArrow => {}
TokenKind::FatArrow => {}
TokenKind::Pound => {}
TokenKind::Dollar => {}
TokenKind::Question => {}
TokenKind::SingleQuote => {}
TokenKind::OpenParen => {}
TokenKind::CloseParen => {}
TokenKind::OpenBrace => {}
TokenKind::CloseBrace => {}
TokenKind::OpenBracket => {}
TokenKind::CloseBracket => {}
TokenKind::OpenInvisible(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TokenKind::CloseInvisible(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TokenKind::Literal(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
TokenKind::Ident(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TokenKind::NtIdent(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TokenKind::Lifetime(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TokenKind::NtLifetime(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TokenKind::DocComment(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);
}
TokenKind::Eof => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for TokenKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { TokenKind::Eq }
1usize => { TokenKind::Lt }
2usize => { TokenKind::Le }
3usize => { TokenKind::EqEq }
4usize => { TokenKind::Ne }
5usize => { TokenKind::Ge }
6usize => { TokenKind::Gt }
7usize => { TokenKind::AndAnd }
8usize => { TokenKind::OrOr }
9usize => { TokenKind::Bang }
10usize => { TokenKind::Tilde }
11usize => { TokenKind::Plus }
12usize => { TokenKind::Minus }
13usize => { TokenKind::Star }
14usize => { TokenKind::Slash }
15usize => { TokenKind::Percent }
16usize => { TokenKind::Caret }
17usize => { TokenKind::And }
18usize => { TokenKind::Or }
19usize => { TokenKind::Shl }
20usize => { TokenKind::Shr }
21usize => { TokenKind::PlusEq }
22usize => { TokenKind::MinusEq }
23usize => { TokenKind::StarEq }
24usize => { TokenKind::SlashEq }
25usize => { TokenKind::PercentEq }
26usize => { TokenKind::CaretEq }
27usize => { TokenKind::AndEq }
28usize => { TokenKind::OrEq }
29usize => { TokenKind::ShlEq }
30usize => { TokenKind::ShrEq }
31usize => { TokenKind::At }
32usize => { TokenKind::Dot }
33usize => { TokenKind::DotDot }
34usize => { TokenKind::DotDotDot }
35usize => { TokenKind::DotDotEq }
36usize => { TokenKind::Comma }
37usize => { TokenKind::Semi }
38usize => { TokenKind::Colon }
39usize => { TokenKind::PathSep }
40usize => { TokenKind::RArrow }
41usize => { TokenKind::LArrow }
42usize => { TokenKind::FatArrow }
43usize => { TokenKind::Pound }
44usize => { TokenKind::Dollar }
45usize => { TokenKind::Question }
46usize => { TokenKind::SingleQuote }
47usize => { TokenKind::OpenParen }
48usize => { TokenKind::CloseParen }
49usize => { TokenKind::OpenBrace }
50usize => { TokenKind::CloseBrace }
51usize => { TokenKind::OpenBracket }
52usize => { TokenKind::CloseBracket }
53usize => {
TokenKind::OpenInvisible(::rustc_serialize::Decodable::decode(__decoder))
}
54usize => {
TokenKind::CloseInvisible(::rustc_serialize::Decodable::decode(__decoder))
}
55usize => {
TokenKind::Literal(::rustc_serialize::Decodable::decode(__decoder))
}
56usize => {
TokenKind::Ident(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
57usize => {
TokenKind::NtIdent(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
58usize => {
TokenKind::Lifetime(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
59usize => {
TokenKind::NtLifetime(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
60usize => {
TokenKind::DocComment(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
61usize => { TokenKind::Eof }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TokenKind`, expected 0..62, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TokenKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
TokenKind::Eq => ::core::fmt::Formatter::write_str(f, "Eq"),
TokenKind::Lt => ::core::fmt::Formatter::write_str(f, "Lt"),
TokenKind::Le => ::core::fmt::Formatter::write_str(f, "Le"),
TokenKind::EqEq => ::core::fmt::Formatter::write_str(f, "EqEq"),
TokenKind::Ne => ::core::fmt::Formatter::write_str(f, "Ne"),
TokenKind::Ge => ::core::fmt::Formatter::write_str(f, "Ge"),
TokenKind::Gt => ::core::fmt::Formatter::write_str(f, "Gt"),
TokenKind::AndAnd =>
::core::fmt::Formatter::write_str(f, "AndAnd"),
TokenKind::OrOr => ::core::fmt::Formatter::write_str(f, "OrOr"),
TokenKind::Bang => ::core::fmt::Formatter::write_str(f, "Bang"),
TokenKind::Tilde => ::core::fmt::Formatter::write_str(f, "Tilde"),
TokenKind::Plus => ::core::fmt::Formatter::write_str(f, "Plus"),
TokenKind::Minus => ::core::fmt::Formatter::write_str(f, "Minus"),
TokenKind::Star => ::core::fmt::Formatter::write_str(f, "Star"),
TokenKind::Slash => ::core::fmt::Formatter::write_str(f, "Slash"),
TokenKind::Percent =>
::core::fmt::Formatter::write_str(f, "Percent"),
TokenKind::Caret => ::core::fmt::Formatter::write_str(f, "Caret"),
TokenKind::And => ::core::fmt::Formatter::write_str(f, "And"),
TokenKind::Or => ::core::fmt::Formatter::write_str(f, "Or"),
TokenKind::Shl => ::core::fmt::Formatter::write_str(f, "Shl"),
TokenKind::Shr => ::core::fmt::Formatter::write_str(f, "Shr"),
TokenKind::PlusEq =>
::core::fmt::Formatter::write_str(f, "PlusEq"),
TokenKind::MinusEq =>
::core::fmt::Formatter::write_str(f, "MinusEq"),
TokenKind::StarEq =>
::core::fmt::Formatter::write_str(f, "StarEq"),
TokenKind::SlashEq =>
::core::fmt::Formatter::write_str(f, "SlashEq"),
TokenKind::PercentEq =>
::core::fmt::Formatter::write_str(f, "PercentEq"),
TokenKind::CaretEq =>
::core::fmt::Formatter::write_str(f, "CaretEq"),
TokenKind::AndEq => ::core::fmt::Formatter::write_str(f, "AndEq"),
TokenKind::OrEq => ::core::fmt::Formatter::write_str(f, "OrEq"),
TokenKind::ShlEq => ::core::fmt::Formatter::write_str(f, "ShlEq"),
TokenKind::ShrEq => ::core::fmt::Formatter::write_str(f, "ShrEq"),
TokenKind::At => ::core::fmt::Formatter::write_str(f, "At"),
TokenKind::Dot => ::core::fmt::Formatter::write_str(f, "Dot"),
TokenKind::DotDot =>
::core::fmt::Formatter::write_str(f, "DotDot"),
TokenKind::DotDotDot =>
::core::fmt::Formatter::write_str(f, "DotDotDot"),
TokenKind::DotDotEq =>
::core::fmt::Formatter::write_str(f, "DotDotEq"),
TokenKind::Comma => ::core::fmt::Formatter::write_str(f, "Comma"),
TokenKind::Semi => ::core::fmt::Formatter::write_str(f, "Semi"),
TokenKind::Colon => ::core::fmt::Formatter::write_str(f, "Colon"),
TokenKind::PathSep =>
::core::fmt::Formatter::write_str(f, "PathSep"),
TokenKind::RArrow =>
::core::fmt::Formatter::write_str(f, "RArrow"),
TokenKind::LArrow =>
::core::fmt::Formatter::write_str(f, "LArrow"),
TokenKind::FatArrow =>
::core::fmt::Formatter::write_str(f, "FatArrow"),
TokenKind::Pound => ::core::fmt::Formatter::write_str(f, "Pound"),
TokenKind::Dollar =>
::core::fmt::Formatter::write_str(f, "Dollar"),
TokenKind::Question =>
::core::fmt::Formatter::write_str(f, "Question"),
TokenKind::SingleQuote =>
::core::fmt::Formatter::write_str(f, "SingleQuote"),
TokenKind::OpenParen =>
::core::fmt::Formatter::write_str(f, "OpenParen"),
TokenKind::CloseParen =>
::core::fmt::Formatter::write_str(f, "CloseParen"),
TokenKind::OpenBrace =>
::core::fmt::Formatter::write_str(f, "OpenBrace"),
TokenKind::CloseBrace =>
::core::fmt::Formatter::write_str(f, "CloseBrace"),
TokenKind::OpenBracket =>
::core::fmt::Formatter::write_str(f, "OpenBracket"),
TokenKind::CloseBracket =>
::core::fmt::Formatter::write_str(f, "CloseBracket"),
TokenKind::OpenInvisible(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"OpenInvisible", &__self_0),
TokenKind::CloseInvisible(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"CloseInvisible", &__self_0),
TokenKind::Literal(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Literal", &__self_0),
TokenKind::Ident(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Ident",
__self_0, &__self_1),
TokenKind::NtIdent(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"NtIdent", __self_0, &__self_1),
TokenKind::Lifetime(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"Lifetime", __self_0, &__self_1),
TokenKind::NtLifetime(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"NtLifetime", __self_0, &__self_1),
TokenKind::DocComment(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"DocComment", __self_0, __self_1, &__self_2),
TokenKind::Eof => ::core::fmt::Formatter::write_str(f, "Eof"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for TokenKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
TokenKind::Eq => {}
TokenKind::Lt => {}
TokenKind::Le => {}
TokenKind::EqEq => {}
TokenKind::Ne => {}
TokenKind::Ge => {}
TokenKind::Gt => {}
TokenKind::AndAnd => {}
TokenKind::OrOr => {}
TokenKind::Bang => {}
TokenKind::Tilde => {}
TokenKind::Plus => {}
TokenKind::Minus => {}
TokenKind::Star => {}
TokenKind::Slash => {}
TokenKind::Percent => {}
TokenKind::Caret => {}
TokenKind::And => {}
TokenKind::Or => {}
TokenKind::Shl => {}
TokenKind::Shr => {}
TokenKind::PlusEq => {}
TokenKind::MinusEq => {}
TokenKind::StarEq => {}
TokenKind::SlashEq => {}
TokenKind::PercentEq => {}
TokenKind::CaretEq => {}
TokenKind::AndEq => {}
TokenKind::OrEq => {}
TokenKind::ShlEq => {}
TokenKind::ShrEq => {}
TokenKind::At => {}
TokenKind::Dot => {}
TokenKind::DotDot => {}
TokenKind::DotDotDot => {}
TokenKind::DotDotEq => {}
TokenKind::Comma => {}
TokenKind::Semi => {}
TokenKind::Colon => {}
TokenKind::PathSep => {}
TokenKind::RArrow => {}
TokenKind::LArrow => {}
TokenKind::FatArrow => {}
TokenKind::Pound => {}
TokenKind::Dollar => {}
TokenKind::Question => {}
TokenKind::SingleQuote => {}
TokenKind::OpenParen => {}
TokenKind::CloseParen => {}
TokenKind::OpenBrace => {}
TokenKind::CloseBrace => {}
TokenKind::OpenBracket => {}
TokenKind::CloseBracket => {}
TokenKind::OpenInvisible(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TokenKind::CloseInvisible(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TokenKind::Literal(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TokenKind::Ident(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TokenKind::NtIdent(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TokenKind::Lifetime(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TokenKind::NtLifetime(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TokenKind::DocComment(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
TokenKind::Eof => {}
}
}
}
};StableHash)]
379pub enum TokenKind {
380 Eq,
383 Lt,
385 Le,
387 EqEq,
389 Ne,
391 Ge,
393 Gt,
395 AndAnd,
397 OrOr,
399 Bang,
401 Tilde,
403 Plus,
405 Minus,
407 Star,
409 Slash,
411 Percent,
413 Caret,
415 And,
417 Or,
419 Shl,
421 Shr,
423 PlusEq,
425 MinusEq,
427 StarEq,
429 SlashEq,
431 PercentEq,
433 CaretEq,
435 AndEq,
437 OrEq,
439 ShlEq,
441 ShrEq,
443
444 At,
447 Dot,
449 DotDot,
451 DotDotDot,
453 DotDotEq,
455 Comma,
457 Semi,
459 Colon,
461 PathSep,
463 RArrow,
465 LArrow,
467 FatArrow,
469 Pound,
471 Dollar,
473 Question,
475 SingleQuote,
477 OpenParen,
479 CloseParen,
481 OpenBrace,
483 CloseBrace,
485 OpenBracket,
487 CloseBracket,
489 OpenInvisible(InvisibleOrigin),
491 CloseInvisible(InvisibleOrigin),
493
494 Literal(Lit),
496
497 Ident(Symbol, IdentIsRaw),
503 NtIdent(sp::Ident, IdentIsRaw),
507
508 Lifetime(Symbol, IdentIsRaw),
514 NtLifetime(sp::Ident, IdentIsRaw),
518
519 DocComment(CommentKind, ast::AttrStyle, Symbol),
523
524 Eof,
526}
527
528#[derive(#[automatically_derived]
impl ::core::clone::Clone for Token {
#[inline]
fn clone(&self) -> Token {
let _: ::core::clone::AssertParamIsClone<TokenKind>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Token { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for Token {
#[inline]
fn eq(&self, other: &Token) -> bool {
self.kind == other.kind && self.span == other.span
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Token {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<TokenKind>;
let _: ::core::cmp::AssertParamIsEq<Span>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Token {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.kind, state);
::core::hash::Hash::hash(&self.span, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Token {
fn encode(&self, __encoder: &mut __E) {
match *self {
Token { kind: ref __binding_0, span: 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 Token {
fn decode(__decoder: &mut __D) -> Self {
Token {
kind: ::rustc_serialize::Decodable::decode(__decoder),
span: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Token {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Token", "kind",
&self.kind, "span", &&self.span)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Token {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Token { kind: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
529pub struct Token {
530 pub kind: TokenKind,
531 pub span: Span,
532}
533
534impl TokenKind {
535 pub fn lit(kind: LitKind, symbol: Symbol, suffix: Option<Symbol>) -> TokenKind {
536 Literal(Lit::new(kind, symbol, suffix))
537 }
538
539 pub fn break_two_token_op(&self, n: u32) -> Option<(TokenKind, TokenKind)> {
544 if !(n == 1 || n == 2) {
::core::panicking::panic("assertion failed: n == 1 || n == 2")
};assert!(n == 1 || n == 2);
545 Some(match (self, n) {
546 (Le, 1) => (Lt, Eq),
547 (EqEq, 1) => (Eq, Eq),
548 (Ne, 1) => (Bang, Eq),
549 (Ge, 1) => (Gt, Eq),
550 (AndAnd, 1) => (And, And),
551 (OrOr, 1) => (Or, Or),
552 (Shl, 1) => (Lt, Lt),
553 (Shr, 1) => (Gt, Gt),
554 (PlusEq, 1) => (Plus, Eq),
555 (MinusEq, 1) => (Minus, Eq),
556 (StarEq, 1) => (Star, Eq),
557 (SlashEq, 1) => (Slash, Eq),
558 (PercentEq, 1) => (Percent, Eq),
559 (CaretEq, 1) => (Caret, Eq),
560 (AndEq, 1) => (And, Eq),
561 (OrEq, 1) => (Or, Eq),
562 (ShlEq, 1) => (Lt, Le), (ShlEq, 2) => (Shl, Eq), (ShrEq, 1) => (Gt, Ge), (ShrEq, 2) => (Shr, Eq), (DotDot, 1) => (Dot, Dot),
567 (DotDotDot, 1) => (Dot, DotDot), (DotDotDot, 2) => (DotDot, Dot), (DotDotEq, 2) => (DotDot, Eq),
570 (PathSep, 1) => (Colon, Colon),
571 (RArrow, 1) => (Minus, Gt),
572 (LArrow, 1) => (Lt, Minus),
573 (FatArrow, 1) => (Eq, Gt),
574 _ => return None,
575 })
576 }
577
578 pub fn similar_tokens(&self) -> &[TokenKind] {
581 match self {
582 Comma => &[Dot, Lt, Semi],
583 Semi => &[Colon, Comma],
584 Colon => &[Semi],
585 FatArrow => &[Eq, RArrow, Ge, Gt],
586 _ => &[],
587 }
588 }
589
590 pub fn should_end_const_arg(&self) -> bool {
591 #[allow(non_exhaustive_omitted_patterns)] match self {
Gt | Ge | Shr | ShrEq => true,
_ => false,
}matches!(self, Gt | Ge | Shr | ShrEq)
592 }
593
594 pub fn is_delim(&self) -> bool {
595 self.open_delim().is_some() || self.close_delim().is_some()
596 }
597
598 pub fn open_delim(&self) -> Option<Delimiter> {
599 match *self {
600 OpenParen => Some(Delimiter::Parenthesis),
601 OpenBrace => Some(Delimiter::Brace),
602 OpenBracket => Some(Delimiter::Bracket),
603 OpenInvisible(origin) => Some(Delimiter::Invisible(origin)),
604 _ => None,
605 }
606 }
607
608 pub fn close_delim(&self) -> Option<Delimiter> {
609 match *self {
610 CloseParen => Some(Delimiter::Parenthesis),
611 CloseBrace => Some(Delimiter::Brace),
612 CloseBracket => Some(Delimiter::Bracket),
613 CloseInvisible(origin) => Some(Delimiter::Invisible(origin)),
614 _ => None,
615 }
616 }
617
618 pub fn is_close_delim_or_eof(&self) -> bool {
619 match self {
620 CloseParen | CloseBrace | CloseBracket | CloseInvisible(_) | Eof => true,
621 _ => false,
622 }
623 }
624}
625
626impl Token {
627 pub const fn new(kind: TokenKind, span: Span) -> Self {
628 Token { kind, span }
629 }
630
631 pub const fn dummy() -> Self {
633 Token::new(TokenKind::Question, DUMMY_SP)
634 }
635
636 pub fn from_ast_ident(ident: sp::Ident) -> Self {
638 Token::new(Ident(ident.name, ident.is_raw_guess().into()), ident.span)
639 }
640
641 pub fn is_range_separator(&self) -> bool {
642 [DotDot, DotDotDot, DotDotEq].contains(&self.kind)
643 }
644
645 pub fn is_punct(&self) -> bool {
646 match self.kind {
647 Eq | Lt | Le | EqEq | Ne | Ge | Gt | AndAnd | OrOr | Bang | Tilde | Plus | Minus
648 | Star | Slash | Percent | Caret | And | Or | Shl | Shr | PlusEq | MinusEq | StarEq
649 | SlashEq | PercentEq | CaretEq | AndEq | OrEq | ShlEq | ShrEq | At | Dot | DotDot
650 | DotDotDot | DotDotEq | Comma | Semi | Colon | PathSep | RArrow | LArrow
651 | FatArrow | Pound | Dollar | Question | SingleQuote => true,
652
653 OpenParen | CloseParen | OpenBrace | CloseBrace | OpenBracket | CloseBracket
654 | OpenInvisible(_) | CloseInvisible(_) | Literal(..) | DocComment(..) | Ident(..)
655 | NtIdent(..) | Lifetime(..) | NtLifetime(..) | Eof => false,
656 }
657 }
658
659 pub fn is_like_plus(&self) -> bool {
660 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Plus | PlusEq => true,
_ => false,
}matches!(self.kind, Plus | PlusEq)
661 }
662
663 pub fn can_begin_expr(&self) -> bool {
668 match self.uninterpolate().kind {
669 Ident(name, is_raw) =>
670 ident_can_begin_expr(name, self.span, is_raw), OpenParen | OpenBrace | OpenBracket | Literal(..) | Bang | Minus | Star | Or | OrOr | And | AndAnd | DotDot | DotDotDot | DotDotEq | Lt | Shl | PathSep | Lifetime(..) | Pound => true, OpenInvisible(InvisibleOrigin::MetaVar(
688 MetaVarKind::Block
689 | MetaVarKind::Expr { .. }
690 | MetaVarKind::Literal
691 | MetaVarKind::Path,
692 )) => true,
693 _ => false,
694 }
695 }
696
697 pub fn can_begin_pattern(&self, pat_kind: NtPatKind) -> bool {
701 match &self.uninterpolate().kind {
702 Ident(..) | NtIdent(..) |
704 OpenParen | OpenBracket | And | Minus | AndAnd | Literal(_) | DotDot | DotDotDot | PathSep | Lt | Shl => true, Or => #[allow(non_exhaustive_omitted_patterns)] match pat_kind {
PatWithOr => true,
_ => false,
}matches!(pat_kind, PatWithOr), OpenInvisible(InvisibleOrigin::MetaVar(
717 MetaVarKind::Expr { .. }
718 | MetaVarKind::Literal
719 | MetaVarKind::Meta { .. }
720 | MetaVarKind::Pat(_)
721 | MetaVarKind::Path
722 | MetaVarKind::Ty { .. },
723 )) => true,
724 _ => false,
725 }
726 }
727
728 pub fn can_begin_type(&self) -> bool {
730 match self.uninterpolate().kind {
731 Ident(name, is_raw) =>
732 ident_can_begin_type(name, self.span, is_raw), OpenParen | OpenBracket | Bang | Star | And | AndAnd | Question | Lifetime(..) | Lt | Shl | PathSep => true, OpenInvisible(InvisibleOrigin::MetaVar(MetaVarKind::Ty { .. } | MetaVarKind::Path)) => {
744 true
745 }
746 _ => false,
749 }
750 }
751
752 pub fn can_begin_const_arg(&self) -> bool {
754 match self.kind {
755 OpenBrace | Literal(..) | Minus => true,
756 Ident(name, IdentIsRaw::No) if name.is_bool_lit() => true,
757 OpenInvisible(InvisibleOrigin::MetaVar(
758 MetaVarKind::Expr { .. } | MetaVarKind::Block | MetaVarKind::Literal,
759 )) => true,
760 _ => false,
761 }
762 }
763
764 pub fn can_begin_item(&self) -> bool {
766 match self.kind {
767 Ident(name, _) => [
768 kw::Fn,
769 kw::Use,
770 kw::Struct,
771 kw::Enum,
772 kw::Pub,
773 kw::Trait,
774 kw::Extern,
775 kw::Impl,
776 kw::Unsafe,
777 kw::Const,
778 kw::Safe,
779 kw::Static,
780 kw::Union,
781 kw::Macro,
782 kw::Mod,
783 kw::Type,
784 ]
785 .contains(&name),
786 _ => false,
787 }
788 }
789
790 pub fn is_lit(&self) -> bool {
792 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Literal(..) => true,
_ => false,
}matches!(self.kind, Literal(..))
793 }
794
795 pub fn can_begin_literal_maybe_minus(&self) -> bool {
803 match self.uninterpolate().kind {
804 Literal(..) | Minus => true,
805 Ident(name, IdentIsRaw::No) if name.is_bool_lit() => true,
806 OpenInvisible(InvisibleOrigin::MetaVar(mv_kind)) => match mv_kind {
807 MetaVarKind::Literal => true,
808 MetaVarKind::Expr { can_begin_literal_maybe_minus, .. } => {
809 can_begin_literal_maybe_minus
810 }
811 _ => false,
812 },
813 _ => false,
814 }
815 }
816
817 pub fn can_begin_string_literal(&self) -> bool {
818 match self.uninterpolate().kind {
819 Literal(..) => true,
820 OpenInvisible(InvisibleOrigin::MetaVar(mv_kind)) => match mv_kind {
821 MetaVarKind::Literal => true,
822 MetaVarKind::Expr { can_begin_string_literal, .. } => can_begin_string_literal,
823 _ => false,
824 },
825 _ => false,
826 }
827 }
828
829 pub fn uninterpolate(&self) -> Cow<'_, Token> {
834 match self.kind {
835 NtIdent(ident, is_raw) => Cow::Owned(Token::new(Ident(ident.name, is_raw), ident.span)),
836 NtLifetime(ident, is_raw) => {
837 Cow::Owned(Token::new(Lifetime(ident.name, is_raw), ident.span))
838 }
839 _ => Cow::Borrowed(self),
840 }
841 }
842
843 #[inline]
845 pub fn ident(&self) -> Option<(sp::Ident, IdentIsRaw)> {
846 match self.kind {
848 Ident(name, is_raw) => Some((sp::Ident::new(name, self.span), is_raw)),
849 NtIdent(ident, is_raw) => Some((ident, is_raw)),
850 _ => None,
851 }
852 }
853
854 #[inline]
856 pub fn lifetime(&self) -> Option<(sp::Ident, IdentIsRaw)> {
857 match self.kind {
859 Lifetime(name, is_raw) => Some((sp::Ident::new(name, self.span), is_raw)),
860 NtLifetime(ident, is_raw) => Some((ident, is_raw)),
861 _ => None,
862 }
863 }
864
865 pub fn is_ident(&self) -> bool {
867 self.ident().is_some()
868 }
869
870 pub fn is_lifetime(&self) -> bool {
872 self.lifetime().is_some()
873 }
874
875 pub fn is_ident_named(&self, name: Symbol) -> bool {
878 self.ident().is_some_and(|(ident, _)| ident.name == name)
879 }
880
881 pub fn is_metavar_expr(&self) -> bool {
884 #[allow(non_exhaustive_omitted_patterns)] match self.is_metavar_seq() {
Some(MetaVarKind::Expr { .. } | MetaVarKind::Literal | MetaVarKind::Path |
MetaVarKind::Block) => true,
_ => false,
}matches!(
885 self.is_metavar_seq(),
886 Some(
887 MetaVarKind::Expr { .. }
888 | MetaVarKind::Literal
889 | MetaVarKind::Path
890 | MetaVarKind::Block
891 )
892 )
893 }
894
895 pub fn is_metavar_block(&self) -> bool {
897 #[allow(non_exhaustive_omitted_patterns)] match self.is_metavar_seq() {
Some(MetaVarKind::Block) => true,
_ => false,
}matches!(self.is_metavar_seq(), Some(MetaVarKind::Block))
898 }
899
900 pub fn is_mutability(&self) -> bool {
902 self.is_keyword(kw::Mut) || self.is_keyword(kw::Const)
903 }
904
905 pub fn is_qpath_start(&self) -> bool {
906 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Lt | Shl => true,
_ => false,
}matches!(self.kind, Lt | Shl)
907 }
908
909 pub fn is_path_start(&self) -> bool {
910 self.kind == PathSep
911 || self.is_qpath_start()
912 || #[allow(non_exhaustive_omitted_patterns)] match self.is_metavar_seq() {
Some(MetaVarKind::Path) => true,
_ => false,
}matches!(self.is_metavar_seq(), Some(MetaVarKind::Path))
913 || self.is_path_segment_keyword()
914 || self.is_non_reserved_ident()
915 }
916
917 pub fn is_keyword(&self, kw: Symbol) -> bool {
919 self.is_non_raw_ident_where(|id| id.name == kw)
920 }
921
922 pub fn is_keyword_case(&self, kw: Symbol, case: Case) -> bool {
925 self.is_keyword(kw)
926 || (case == Case::Insensitive
927 && self.is_non_raw_ident_where(|id| {
928 id.name.as_str().eq_ignore_ascii_case(kw.as_str())
930 }))
931 }
932
933 pub fn is_path_segment_keyword(&self) -> bool {
934 self.is_non_raw_ident_where(sp::Ident::is_path_segment_keyword)
935 }
936
937 pub fn is_special_ident(&self) -> bool {
940 self.is_non_raw_ident_where(sp::Ident::is_special)
941 }
942
943 pub fn is_used_keyword(&self) -> bool {
945 self.is_non_raw_ident_where(sp::Ident::is_used_keyword)
946 }
947
948 pub fn is_unused_keyword(&self) -> bool {
950 self.is_non_raw_ident_where(sp::Ident::is_unused_keyword)
951 }
952
953 pub fn is_reserved_ident(&self) -> bool {
955 self.is_non_raw_ident_where(sp::Ident::is_reserved)
956 }
957
958 pub fn is_non_reserved_ident(&self) -> bool {
959 self.ident().is_some_and(|(id, raw)| raw == IdentIsRaw::Yes || !sp::Ident::is_reserved(id))
960 }
961
962 pub fn is_bool_lit(&self) -> bool {
964 self.is_non_raw_ident_where(|id| id.name.is_bool_lit())
965 }
966
967 pub fn is_numeric_lit(&self) -> bool {
968 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Literal(Lit { kind: LitKind::Integer, .. }) |
Literal(Lit { kind: LitKind::Float, .. }) => true,
_ => false,
}matches!(
969 self.kind,
970 Literal(Lit { kind: LitKind::Integer, .. }) | Literal(Lit { kind: LitKind::Float, .. })
971 )
972 }
973
974 pub fn is_integer_lit(&self) -> bool {
976 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Literal(Lit { kind: LitKind::Integer, .. }) => true,
_ => false,
}matches!(self.kind, Literal(Lit { kind: LitKind::Integer, .. }))
977 }
978
979 pub fn is_non_raw_ident_where(&self, pred: impl FnOnce(sp::Ident) -> bool) -> bool {
981 match self.ident() {
982 Some((id, IdentIsRaw::No)) => pred(id),
983 _ => false,
984 }
985 }
986
987 pub fn is_metavar_seq(&self) -> Option<MetaVarKind> {
990 match self.kind {
991 OpenInvisible(InvisibleOrigin::MetaVar(kind)) => Some(kind),
992 _ => None,
993 }
994 }
995
996 pub fn glue(&self, joint: &Token) -> Option<Token> {
997 let kind = match (&self.kind, &joint.kind) {
998 (Eq, Eq) => EqEq,
999 (Eq, Gt) => FatArrow,
1000 (Eq, _) => return None,
1001
1002 (Lt, Eq) => Le,
1003 (Lt, Lt) => Shl,
1004 (Lt, Le) => ShlEq,
1005 (Lt, Minus) => LArrow,
1006 (Lt, _) => return None,
1007
1008 (Gt, Eq) => Ge,
1009 (Gt, Gt) => Shr,
1010 (Gt, Ge) => ShrEq,
1011 (Gt, _) => return None,
1012
1013 (Bang, Eq) => Ne,
1014 (Bang, _) => return None,
1015
1016 (Plus, Eq) => PlusEq,
1017 (Plus, _) => return None,
1018
1019 (Minus, Eq) => MinusEq,
1020 (Minus, Gt) => RArrow,
1021 (Minus, _) => return None,
1022
1023 (Star, Eq) => StarEq,
1024 (Star, _) => return None,
1025
1026 (Slash, Eq) => SlashEq,
1027 (Slash, _) => return None,
1028
1029 (Percent, Eq) => PercentEq,
1030 (Percent, _) => return None,
1031
1032 (Caret, Eq) => CaretEq,
1033 (Caret, _) => return None,
1034
1035 (And, Eq) => AndEq,
1036 (And, And) => AndAnd,
1037 (And, _) => return None,
1038
1039 (Or, Eq) => OrEq,
1040 (Or, Or) => OrOr,
1041 (Or, _) => return None,
1042
1043 (Shl, Eq) => ShlEq,
1044 (Shl, _) => return None,
1045
1046 (Shr, Eq) => ShrEq,
1047 (Shr, _) => return None,
1048
1049 (Dot, Dot) => DotDot,
1050 (Dot, DotDot) => DotDotDot,
1051 (Dot, _) => return None,
1052
1053 (DotDot, Dot) => DotDotDot,
1054 (DotDot, Eq) => DotDotEq,
1055 (DotDot, _) => return None,
1056
1057 (Colon, Colon) => PathSep,
1058 (Colon, _) => return None,
1059
1060 (SingleQuote, Ident(name, is_raw)) => {
1061 Lifetime(Symbol::intern(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}", name))
})format!("'{name}")), *is_raw)
1062 }
1063 (SingleQuote, _) => return None,
1064
1065 (
1066 Le | EqEq | Ne | Ge | AndAnd | OrOr | Tilde | PlusEq | MinusEq | StarEq | SlashEq
1067 | PercentEq | CaretEq | AndEq | OrEq | ShlEq | ShrEq | At | DotDotDot | DotDotEq
1068 | Comma | Semi | PathSep | RArrow | LArrow | FatArrow | Pound | Dollar | Question
1069 | OpenParen | CloseParen | OpenBrace | CloseBrace | OpenBracket | CloseBracket
1070 | OpenInvisible(_) | CloseInvisible(_) | Literal(..) | Ident(..) | NtIdent(..)
1071 | Lifetime(..) | NtLifetime(..) | DocComment(..) | Eof,
1072 _,
1073 ) => {
1074 return None;
1075 }
1076 };
1077
1078 Some(Token::new(kind, self.span.to(joint.span)))
1079 }
1080}
1081
1082impl PartialEq<TokenKind> for Token {
1083 #[inline]
1084 fn eq(&self, rhs: &TokenKind) -> bool {
1085 self.kind == *rhs
1086 }
1087}
1088
1089#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NtPatKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
NtPatKind::PatWithOr =>
::core::fmt::Formatter::write_str(f, "PatWithOr"),
NtPatKind::PatParam { inferred: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"PatParam", "inferred", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for NtPatKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for NtPatKind {
#[inline]
fn clone(&self) -> NtPatKind {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NtPatKind {
#[inline]
fn eq(&self, other: &NtPatKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(NtPatKind::PatParam { inferred: __self_0 },
NtPatKind::PatParam { inferred: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NtPatKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for NtPatKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
NtPatKind::PatWithOr => { 0usize }
NtPatKind::PatParam { inferred: ref __binding_0 } => {
1usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
NtPatKind::PatWithOr => {}
NtPatKind::PatParam { inferred: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for NtPatKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { NtPatKind::PatWithOr }
1usize => {
NtPatKind::PatParam {
inferred: ::rustc_serialize::Decodable::decode(__decoder),
}
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `NtPatKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for NtPatKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
NtPatKind::PatParam { inferred: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for NtPatKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
NtPatKind::PatWithOr => {}
NtPatKind::PatParam { inferred: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1090pub enum NtPatKind {
1091 PatWithOr,
1093 PatParam { inferred: bool },
1097}
1098
1099#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NtExprKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
NtExprKind::Expr => ::core::fmt::Formatter::write_str(f, "Expr"),
NtExprKind::Expr2021 { inferred: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Expr2021", "inferred", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for NtExprKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for NtExprKind {
#[inline]
fn clone(&self) -> NtExprKind {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NtExprKind {
#[inline]
fn eq(&self, other: &NtExprKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(NtExprKind::Expr2021 { inferred: __self_0 },
NtExprKind::Expr2021 { inferred: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NtExprKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for NtExprKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
NtExprKind::Expr => { 0usize }
NtExprKind::Expr2021 { inferred: ref __binding_0 } => {
1usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
NtExprKind::Expr => {}
NtExprKind::Expr2021 { inferred: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for NtExprKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { NtExprKind::Expr }
1usize => {
NtExprKind::Expr2021 {
inferred: ::rustc_serialize::Decodable::decode(__decoder),
}
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `NtExprKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for NtExprKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
NtExprKind::Expr2021 { inferred: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for NtExprKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
NtExprKind::Expr => {}
NtExprKind::Expr2021 { inferred: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1100pub enum NtExprKind {
1101 Expr,
1104 Expr2021 { inferred: bool },
1108}
1109
1110#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NonterminalKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
NonterminalKind::Item =>
::core::fmt::Formatter::write_str(f, "Item"),
NonterminalKind::Block =>
::core::fmt::Formatter::write_str(f, "Block"),
NonterminalKind::Stmt =>
::core::fmt::Formatter::write_str(f, "Stmt"),
NonterminalKind::Pat(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Pat",
&__self_0),
NonterminalKind::Expr(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
&__self_0),
NonterminalKind::Ty => ::core::fmt::Formatter::write_str(f, "Ty"),
NonterminalKind::Ident =>
::core::fmt::Formatter::write_str(f, "Ident"),
NonterminalKind::Lifetime =>
::core::fmt::Formatter::write_str(f, "Lifetime"),
NonterminalKind::Literal =>
::core::fmt::Formatter::write_str(f, "Literal"),
NonterminalKind::Meta =>
::core::fmt::Formatter::write_str(f, "Meta"),
NonterminalKind::Path =>
::core::fmt::Formatter::write_str(f, "Path"),
NonterminalKind::Vis =>
::core::fmt::Formatter::write_str(f, "Vis"),
NonterminalKind::Guard =>
::core::fmt::Formatter::write_str(f, "Guard"),
NonterminalKind::TT => ::core::fmt::Formatter::write_str(f, "TT"),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for NonterminalKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for NonterminalKind {
#[inline]
fn clone(&self) -> NonterminalKind {
let _: ::core::clone::AssertParamIsClone<NtPatKind>;
let _: ::core::clone::AssertParamIsClone<NtExprKind>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for NonterminalKind {
#[inline]
fn eq(&self, other: &NonterminalKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(NonterminalKind::Pat(__self_0),
NonterminalKind::Pat(__arg1_0)) => __self_0 == __arg1_0,
(NonterminalKind::Expr(__self_0),
NonterminalKind::Expr(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NonterminalKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<NtPatKind>;
let _: ::core::cmp::AssertParamIsEq<NtExprKind>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for NonterminalKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
NonterminalKind::Item => { 0usize }
NonterminalKind::Block => { 1usize }
NonterminalKind::Stmt => { 2usize }
NonterminalKind::Pat(ref __binding_0) => { 3usize }
NonterminalKind::Expr(ref __binding_0) => { 4usize }
NonterminalKind::Ty => { 5usize }
NonterminalKind::Ident => { 6usize }
NonterminalKind::Lifetime => { 7usize }
NonterminalKind::Literal => { 8usize }
NonterminalKind::Meta => { 9usize }
NonterminalKind::Path => { 10usize }
NonterminalKind::Vis => { 11usize }
NonterminalKind::Guard => { 12usize }
NonterminalKind::TT => { 13usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
NonterminalKind::Item => {}
NonterminalKind::Block => {}
NonterminalKind::Stmt => {}
NonterminalKind::Pat(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
NonterminalKind::Expr(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
NonterminalKind::Ty => {}
NonterminalKind::Ident => {}
NonterminalKind::Lifetime => {}
NonterminalKind::Literal => {}
NonterminalKind::Meta => {}
NonterminalKind::Path => {}
NonterminalKind::Vis => {}
NonterminalKind::Guard => {}
NonterminalKind::TT => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for NonterminalKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { NonterminalKind::Item }
1usize => { NonterminalKind::Block }
2usize => { NonterminalKind::Stmt }
3usize => {
NonterminalKind::Pat(::rustc_serialize::Decodable::decode(__decoder))
}
4usize => {
NonterminalKind::Expr(::rustc_serialize::Decodable::decode(__decoder))
}
5usize => { NonterminalKind::Ty }
6usize => { NonterminalKind::Ident }
7usize => { NonterminalKind::Lifetime }
8usize => { NonterminalKind::Literal }
9usize => { NonterminalKind::Meta }
10usize => { NonterminalKind::Path }
11usize => { NonterminalKind::Vis }
12usize => { NonterminalKind::Guard }
13usize => { NonterminalKind::TT }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `NonterminalKind`, expected 0..14, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for NonterminalKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
NonterminalKind::Pat(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
NonterminalKind::Expr(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
NonterminalKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
NonterminalKind::Item => {}
NonterminalKind::Block => {}
NonterminalKind::Stmt => {}
NonterminalKind::Pat(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
NonterminalKind::Expr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
NonterminalKind::Ty => {}
NonterminalKind::Ident => {}
NonterminalKind::Lifetime => {}
NonterminalKind::Literal => {}
NonterminalKind::Meta => {}
NonterminalKind::Path => {}
NonterminalKind::Vis => {}
NonterminalKind::Guard => {}
NonterminalKind::TT => {}
}
}
}
};StableHash)]
1112pub enum NonterminalKind {
1113 Item,
1114 Block,
1115 Stmt,
1116 Pat(NtPatKind),
1117 Expr(NtExprKind),
1118 Ty,
1119 Ident,
1120 Lifetime,
1121 Literal,
1122 Meta,
1123 Path,
1124 Vis,
1125 Guard,
1126 TT,
1127}
1128
1129impl NonterminalKind {
1130 pub fn from_symbol(
1133 symbol: Symbol,
1134 edition: impl FnOnce() -> Edition,
1135 ) -> Option<NonterminalKind> {
1136 Some(match symbol {
1137 sym::item => NonterminalKind::Item,
1138 sym::block => NonterminalKind::Block,
1139 sym::stmt => NonterminalKind::Stmt,
1140 sym::pat => {
1141 if edition().at_least_rust_2021() {
1142 NonterminalKind::Pat(PatWithOr)
1143 } else {
1144 NonterminalKind::Pat(PatParam { inferred: true })
1145 }
1146 }
1147 sym::pat_param => NonterminalKind::Pat(PatParam { inferred: false }),
1148 sym::expr => {
1149 if edition().at_least_rust_2024() {
1150 NonterminalKind::Expr(Expr)
1151 } else {
1152 NonterminalKind::Expr(Expr2021 { inferred: true })
1153 }
1154 }
1155 sym::expr_2021 => NonterminalKind::Expr(Expr2021 { inferred: false }),
1156 sym::ty => NonterminalKind::Ty,
1157 sym::ident => NonterminalKind::Ident,
1158 sym::lifetime => NonterminalKind::Lifetime,
1159 sym::literal => NonterminalKind::Literal,
1160 sym::meta => NonterminalKind::Meta,
1161 sym::path => NonterminalKind::Path,
1162 sym::vis => NonterminalKind::Vis,
1163 sym::guard => NonterminalKind::Guard,
1164 sym::tt => NonterminalKind::TT,
1165 _ => return None,
1166 })
1167 }
1168
1169 fn symbol(self) -> Symbol {
1170 match self {
1171 NonterminalKind::Item => sym::item,
1172 NonterminalKind::Block => sym::block,
1173 NonterminalKind::Stmt => sym::stmt,
1174 NonterminalKind::Pat(PatParam { inferred: true } | PatWithOr) => sym::pat,
1175 NonterminalKind::Pat(PatParam { inferred: false }) => sym::pat_param,
1176 NonterminalKind::Expr(Expr2021 { inferred: true } | Expr) => sym::expr,
1177 NonterminalKind::Expr(Expr2021 { inferred: false }) => sym::expr_2021,
1178 NonterminalKind::Ty => sym::ty,
1179 NonterminalKind::Ident => sym::ident,
1180 NonterminalKind::Lifetime => sym::lifetime,
1181 NonterminalKind::Literal => sym::literal,
1182 NonterminalKind::Meta => sym::meta,
1183 NonterminalKind::Path => sym::path,
1184 NonterminalKind::Vis => sym::vis,
1185 NonterminalKind::Guard => sym::guard,
1186 NonterminalKind::TT => sym::tt,
1187 }
1188 }
1189}
1190
1191impl fmt::Display for NonterminalKind {
1192 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1193 f.write_fmt(format_args!("{0}", self.symbol()))write!(f, "{}", self.symbol())
1194 }
1195}
1196
1197#[cfg(target_pointer_width = "64")]
1199mod size_asserts {
1200 use rustc_data_structures::static_assert_size;
1201
1202 use super::*;
1203 const _: [(); 12] = [(); ::std::mem::size_of::<Lit>()];static_assert_size!(Lit, 12);
1205 const _: [(); 2] = [(); ::std::mem::size_of::<LitKind>()];static_assert_size!(LitKind, 2);
1206 const _: [(); 24] = [(); ::std::mem::size_of::<Token>()];static_assert_size!(Token, 24);
1207 const _: [(); 16] = [(); ::std::mem::size_of::<TokenKind>()];static_assert_size!(TokenKind, 16);
1208 }