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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DocFragmentKind { }
#[automatically_derived]
impl ::core::clone::Clone for DocFragmentKind {
#[inline]
fn clone(&self) -> Self {
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::marker::StructuralPartialEq for DocFragmentKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DocFragmentKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Sugared(__self_0), Self::Sugared(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Raw(__self_0), Self::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 {
Self::Sugared(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Sugared", &__self_0),
Self::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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CommentKind { }
#[automatically_derived]
impl ::core::clone::Clone for CommentKind {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CommentKind { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CommentKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CommentKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CommentKind { }Eq, #[automatically_derived]
impl ::core::hash::Hash for CommentKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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);
}
}
};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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InvisibleOrigin { }
#[automatically_derived]
impl ::core::clone::Clone for InvisibleOrigin {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<MetaVarKind>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InvisibleOrigin { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InvisibleOrigin {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::MetaVar(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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 {
Self::MetaVar(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"MetaVar", &__self_0),
Self::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 {
Self::Item => ::core::fmt::Formatter::write_str(f, "Item"),
Self::Block => ::core::fmt::Formatter::write_str(f, "Block"),
Self::Stmt => ::core::fmt::Formatter::write_str(f, "Stmt"),
Self::Pat(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Pat",
&__self_0),
Self::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),
Self::Ty { is_path: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Ty",
"is_path", &__self_0),
Self::Ident => ::core::fmt::Formatter::write_str(f, "Ident"),
Self::Lifetime =>
::core::fmt::Formatter::write_str(f, "Lifetime"),
Self::Literal => ::core::fmt::Formatter::write_str(f, "Literal"),
Self::Meta { has_meta_form: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Meta",
"has_meta_form", &__self_0),
Self::Path => ::core::fmt::Formatter::write_str(f, "Path"),
Self::Vis => ::core::fmt::Formatter::write_str(f, "Vis"),
Self::Guard => ::core::fmt::Formatter::write_str(f, "Guard"),
Self::TT => ::core::fmt::Formatter::write_str(f, "TT"),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for MetaVarKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MetaVarKind { }
#[automatically_derived]
impl ::core::clone::Clone for MetaVarKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<NtPatKind>;
let _: ::core::clone::AssertParamIsClone<NtExprKind>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MetaVarKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MetaVarKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Pat(__self_0), Self::Pat(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Expr {
kind: __self_0,
can_begin_literal_maybe_minus: __self_1,
can_begin_string_literal: __self_2 }, Self::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,
(Self::Ty { is_path: __self_0 }, Self::Ty { is_path: __arg1_0
}) => __self_0 == __arg1_0,
(Self::Meta { has_meta_form: __self_0 }, Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Pat(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::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)
}
Self::Ty { is_path: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
Self::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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Delimiter { }
#[automatically_derived]
impl ::core::clone::Clone for Delimiter {
#[inline]
fn clone(&self) -> Self {
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 {
Self::Parenthesis =>
::core::fmt::Formatter::write_str(f, "Parenthesis"),
Self::Brace => ::core::fmt::Formatter::write_str(f, "Brace"),
Self::Bracket => ::core::fmt::Formatter::write_str(f, "Bracket"),
Self::Invisible(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Invisible", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Delimiter { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Delimiter {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Invisible(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LitKind { }
#[automatically_derived]
impl ::core::clone::Clone for LitKind {
#[inline]
fn clone(&self) -> Self {
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::marker::StructuralPartialEq for LitKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LitKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::StrRaw(__self_0), Self::StrRaw(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::ByteStrRaw(__self_0), Self::ByteStrRaw(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::CStrRaw(__self_0), Self::CStrRaw(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Err(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::StrRaw(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::ByteStrRaw(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::CStrRaw(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::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 {
Self::Bool => ::core::fmt::Formatter::write_str(f, "Bool"),
Self::Byte => ::core::fmt::Formatter::write_str(f, "Byte"),
Self::Char => ::core::fmt::Formatter::write_str(f, "Char"),
Self::Integer => ::core::fmt::Formatter::write_str(f, "Integer"),
Self::Float => ::core::fmt::Formatter::write_str(f, "Float"),
Self::Str => ::core::fmt::Formatter::write_str(f, "Str"),
Self::StrRaw(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "StrRaw",
&__self_0),
Self::ByteStr => ::core::fmt::Formatter::write_str(f, "ByteStr"),
Self::ByteStrRaw(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ByteStrRaw", &__self_0),
Self::CStr => ::core::fmt::Formatter::write_str(f, "CStr"),
Self::CStrRaw(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"CStrRaw", &__self_0),
Self::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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Lit { }
#[automatically_derived]
impl ::core::clone::Clone for Lit {
#[inline]
fn clone(&self) -> Self {
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::marker::StructuralPartialEq for Lit { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Lit {
#[inline]
fn eq(&self, other: &Self) -> 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) {
let Lit {
kind: ref __binding_0,
symbol: ref __binding_1,
suffix: ref __binding_2 } = *self;
::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, IdentKind::Normal | IdentKind::ForcedKeyword) if name.is_bool_lit() => {
235 Some(Lit::new(Bool, name, None))
236 }
237 Literal(token_lit) => Some(token_lit),
238 OpenInvisible(InvisibleOrigin::MetaVar(
239 MetaVarKind::Literal | MetaVarKind::Expr { .. },
240 )) => {
241 { ::core::panicking::panic_fmt(format_args!("from_token metavar")); };panic!("from_token metavar");
243 }
244 _ => None,
245 }
246 }
247}
248
249impl fmt::Display for Lit {
250 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
251 let Lit { kind, symbol, suffix } = *self;
252 match kind {
253 Byte => f.write_fmt(format_args!("b\'{0}\'", symbol))write!(f, "b'{symbol}'")?,
254 Char => f.write_fmt(format_args!("\'{0}\'", symbol))write!(f, "'{symbol}'")?,
255 Str => f.write_fmt(format_args!("\"{0}\"", symbol))write!(f, "\"{symbol}\"")?,
256 StrRaw(n) => f.write_fmt(format_args!("r{0}\"{1}\"{0}", "#".repeat(n as usize), symbol))write!(
257 f,
258 "r{delim}\"{string}\"{delim}",
259 delim = "#".repeat(n as usize),
260 string = symbol
261 )?,
262 ByteStr => f.write_fmt(format_args!("b\"{0}\"", symbol))write!(f, "b\"{symbol}\"")?,
263 ByteStrRaw(n) => f.write_fmt(format_args!("br{0}\"{1}\"{0}", "#".repeat(n as usize), symbol))write!(
264 f,
265 "br{delim}\"{string}\"{delim}",
266 delim = "#".repeat(n as usize),
267 string = symbol
268 )?,
269 CStr => f.write_fmt(format_args!("c\"{0}\"", symbol))write!(f, "c\"{symbol}\"")?,
270 CStrRaw(n) => {
271 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))?
272 }
273 Integer | Float | Bool | Err(_) => f.write_fmt(format_args!("{0}", symbol))write!(f, "{symbol}")?,
274 }
275
276 if let Some(suffix) = suffix {
277 f.write_fmt(format_args!("{0}", suffix))write!(f, "{suffix}")?;
278 }
279
280 Ok(())
281 }
282}
283
284impl LitKind {
285 pub fn article(self) -> &'static str {
287 match self {
288 Integer | Err(_) => "an",
289 _ => "a",
290 }
291 }
292
293 pub fn descr(self) -> &'static str {
294 match self {
295 Bool => "boolean",
296 Byte => "byte",
297 Char => "char",
298 Integer => "integer",
299 Float => "float",
300 Str | StrRaw(..) => "string",
301 ByteStr | ByteStrRaw(..) => "byte string",
302 CStr | CStrRaw(..) => "C string",
303 Err(_) => "error",
304 }
305 }
306
307 pub(crate) fn may_have_suffix(self) -> bool {
308 #[allow(non_exhaustive_omitted_patterns)] match self {
Integer | Float | Err(_) => true,
_ => false,
}matches!(self, Integer | Float | Err(_))
309 }
310}
311
312pub fn ident_can_begin_expr(name: Symbol, span: Span, kind: IdentKind) -> bool {
313 let ident_token = Token::new(Ident(name, kind), span);
317
318 !ident_token.is_reserved_ident()
321 || ident_token.is_path_segment_keyword()
322 || [
323 kw::Async,
324 kw::Do,
325 kw::Box,
326 kw::Break,
327 kw::Const,
328 kw::Continue,
329 kw::False,
330 kw::For,
331 kw::Gen,
332 kw::If,
333 kw::Let,
334 kw::Loop,
335 kw::Match,
336 kw::Move,
337 kw::Return,
338 kw::True,
339 kw::Try,
340 kw::Unsafe,
341 kw::While,
342 kw::Yield,
343 kw::Safe,
344 kw::Static,
345 ]
346 .contains(&name)
347}
348
349fn ident_can_begin_type(name: Symbol, span: Span, kind: IdentKind) -> bool {
350 let ident_token = Token::new(Ident(name, kind), span);
354
355 !ident_token.is_reserved_ident()
356 || ident_token.is_path_segment_keyword()
357 || [kw::Underscore, kw::For, kw::Impl, kw::Fn, kw::Unsafe, kw::Extern, kw::Typeof, kw::Dyn]
358 .contains(&name)
359}
360
361#[derive(#[automatically_derived]
impl ::core::marker::StructuralPartialEq for IdentKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IdentKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for IdentKind { }Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for IdentKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
IdentKind::Normal => { 0usize }
IdentKind::Raw => { 1usize }
IdentKind::ForcedKeyword => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for IdentKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { IdentKind::Normal }
1usize => { IdentKind::Raw }
2usize => { IdentKind::ForcedKeyword }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `IdentKind`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for IdentKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for IdentKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
IdentKind::Normal => "Normal",
IdentKind::Raw => "Raw",
IdentKind::ForcedKeyword => "ForcedKeyword",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for IdentKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for IdentKind { }
#[automatically_derived]
impl ::core::clone::Clone for IdentKind {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for IdentKind {
#[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 {
IdentKind::Normal => {}
IdentKind::Raw => {}
IdentKind::ForcedKeyword => {}
}
}
}
};StableHash)]
362pub enum IdentKind {
363 Normal,
364 Raw,
365 ForcedKeyword,
366}
367
368impl IdentKind {
369 pub fn to_print_mode_ident(self) -> IdentPrintMode {
370 match self {
371 IdentKind::Normal => IdentPrintMode::Normal,
372 IdentKind::Raw => IdentPrintMode::RawIdent,
373 IdentKind::ForcedKeyword => IdentPrintMode::ForcedKeywordIdent,
374 }
375 }
376
377 pub fn to_print_mode_lifetime(self) -> IdentPrintMode {
378 match self {
379 IdentKind::Normal => IdentPrintMode::Normal,
380 IdentKind::Raw => IdentPrintMode::RawLifetime,
381 IdentKind::ForcedKeyword => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
382 }
383 }
384}
385
386#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TokenKind { }
#[automatically_derived]
impl ::core::clone::Clone for TokenKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<InvisibleOrigin>;
let _: ::core::clone::AssertParamIsClone<Lit>;
let _: ::core::clone::AssertParamIsClone<Symbol>;
let _: ::core::clone::AssertParamIsClone<IdentKind>;
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::marker::StructuralPartialEq for TokenKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TokenKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::OpenInvisible(__self_0), Self::OpenInvisible(__arg1_0))
=> __self_0 == __arg1_0,
(Self::CloseInvisible(__self_0),
Self::CloseInvisible(__arg1_0)) => __self_0 == __arg1_0,
(Self::Literal(__self_0), Self::Literal(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Ident(__self_0, __self_1),
Self::Ident(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::NtIdent(__self_0, __self_1),
Self::NtIdent(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::Lifetime(__self_0, __self_1),
Self::Lifetime(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::NtLifetime(__self_0, __self_1),
Self::NtLifetime(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::DocComment(__self_0, __self_1, __self_2),
Self::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<IdentKind>;
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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::OpenInvisible(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::CloseInvisible(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::Literal(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::Ident(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
Self::NtIdent(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
Self::Lifetime(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
Self::NtLifetime(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
Self::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 {
Self::Eq => ::core::fmt::Formatter::write_str(f, "Eq"),
Self::Lt => ::core::fmt::Formatter::write_str(f, "Lt"),
Self::Le => ::core::fmt::Formatter::write_str(f, "Le"),
Self::EqEq => ::core::fmt::Formatter::write_str(f, "EqEq"),
Self::Ne => ::core::fmt::Formatter::write_str(f, "Ne"),
Self::Ge => ::core::fmt::Formatter::write_str(f, "Ge"),
Self::Gt => ::core::fmt::Formatter::write_str(f, "Gt"),
Self::AndAnd => ::core::fmt::Formatter::write_str(f, "AndAnd"),
Self::OrOr => ::core::fmt::Formatter::write_str(f, "OrOr"),
Self::Bang => ::core::fmt::Formatter::write_str(f, "Bang"),
Self::Tilde => ::core::fmt::Formatter::write_str(f, "Tilde"),
Self::Plus => ::core::fmt::Formatter::write_str(f, "Plus"),
Self::Minus => ::core::fmt::Formatter::write_str(f, "Minus"),
Self::Star => ::core::fmt::Formatter::write_str(f, "Star"),
Self::Slash => ::core::fmt::Formatter::write_str(f, "Slash"),
Self::Percent => ::core::fmt::Formatter::write_str(f, "Percent"),
Self::Caret => ::core::fmt::Formatter::write_str(f, "Caret"),
Self::And => ::core::fmt::Formatter::write_str(f, "And"),
Self::Or => ::core::fmt::Formatter::write_str(f, "Or"),
Self::Shl => ::core::fmt::Formatter::write_str(f, "Shl"),
Self::Shr => ::core::fmt::Formatter::write_str(f, "Shr"),
Self::PlusEq => ::core::fmt::Formatter::write_str(f, "PlusEq"),
Self::MinusEq => ::core::fmt::Formatter::write_str(f, "MinusEq"),
Self::StarEq => ::core::fmt::Formatter::write_str(f, "StarEq"),
Self::SlashEq => ::core::fmt::Formatter::write_str(f, "SlashEq"),
Self::PercentEq =>
::core::fmt::Formatter::write_str(f, "PercentEq"),
Self::CaretEq => ::core::fmt::Formatter::write_str(f, "CaretEq"),
Self::AndEq => ::core::fmt::Formatter::write_str(f, "AndEq"),
Self::OrEq => ::core::fmt::Formatter::write_str(f, "OrEq"),
Self::ShlEq => ::core::fmt::Formatter::write_str(f, "ShlEq"),
Self::ShrEq => ::core::fmt::Formatter::write_str(f, "ShrEq"),
Self::At => ::core::fmt::Formatter::write_str(f, "At"),
Self::Dot => ::core::fmt::Formatter::write_str(f, "Dot"),
Self::DotDot => ::core::fmt::Formatter::write_str(f, "DotDot"),
Self::DotDotDot =>
::core::fmt::Formatter::write_str(f, "DotDotDot"),
Self::DotDotEq =>
::core::fmt::Formatter::write_str(f, "DotDotEq"),
Self::Comma => ::core::fmt::Formatter::write_str(f, "Comma"),
Self::Semi => ::core::fmt::Formatter::write_str(f, "Semi"),
Self::Colon => ::core::fmt::Formatter::write_str(f, "Colon"),
Self::PathSep => ::core::fmt::Formatter::write_str(f, "PathSep"),
Self::RArrow => ::core::fmt::Formatter::write_str(f, "RArrow"),
Self::LArrow => ::core::fmt::Formatter::write_str(f, "LArrow"),
Self::FatArrow =>
::core::fmt::Formatter::write_str(f, "FatArrow"),
Self::Pound => ::core::fmt::Formatter::write_str(f, "Pound"),
Self::Dollar => ::core::fmt::Formatter::write_str(f, "Dollar"),
Self::Question =>
::core::fmt::Formatter::write_str(f, "Question"),
Self::SingleQuote =>
::core::fmt::Formatter::write_str(f, "SingleQuote"),
Self::OpenParen =>
::core::fmt::Formatter::write_str(f, "OpenParen"),
Self::CloseParen =>
::core::fmt::Formatter::write_str(f, "CloseParen"),
Self::OpenBrace =>
::core::fmt::Formatter::write_str(f, "OpenBrace"),
Self::CloseBrace =>
::core::fmt::Formatter::write_str(f, "CloseBrace"),
Self::OpenBracket =>
::core::fmt::Formatter::write_str(f, "OpenBracket"),
Self::CloseBracket =>
::core::fmt::Formatter::write_str(f, "CloseBracket"),
Self::OpenInvisible(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"OpenInvisible", &__self_0),
Self::CloseInvisible(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"CloseInvisible", &__self_0),
Self::Literal(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Literal", &__self_0),
Self::Ident(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Ident",
__self_0, &__self_1),
Self::NtIdent(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"NtIdent", __self_0, &__self_1),
Self::Lifetime(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"Lifetime", __self_0, &__self_1),
Self::NtLifetime(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"NtLifetime", __self_0, &__self_1),
Self::DocComment(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"DocComment", __self_0, __self_1, &__self_2),
Self::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)]
387pub enum TokenKind {
388 Eq,
391 Lt,
393 Le,
395 EqEq,
397 Ne,
399 Ge,
401 Gt,
403 AndAnd,
405 OrOr,
407 Bang,
409 Tilde,
411 Plus,
413 Minus,
415 Star,
417 Slash,
419 Percent,
421 Caret,
423 And,
425 Or,
427 Shl,
429 Shr,
431 PlusEq,
433 MinusEq,
435 StarEq,
437 SlashEq,
439 PercentEq,
441 CaretEq,
443 AndEq,
445 OrEq,
447 ShlEq,
449 ShrEq,
451
452 At,
455 Dot,
457 DotDot,
459 DotDotDot,
461 DotDotEq,
463 Comma,
465 Semi,
467 Colon,
469 PathSep,
471 RArrow,
473 LArrow,
475 FatArrow,
477 Pound,
479 Dollar,
481 Question,
483 SingleQuote,
485 OpenParen,
487 CloseParen,
489 OpenBrace,
491 CloseBrace,
493 OpenBracket,
495 CloseBracket,
497 OpenInvisible(InvisibleOrigin),
499 CloseInvisible(InvisibleOrigin),
501
502 Literal(Lit),
504
505 Ident(Symbol, IdentKind),
511 NtIdent(sp::Ident, IdentKind),
515
516 Lifetime(Symbol, IdentKind),
522 NtLifetime(sp::Ident, IdentKind),
526
527 DocComment(CommentKind, ast::AttrStyle, Symbol),
531
532 Eof,
534}
535
536#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Token { }
#[automatically_derived]
impl ::core::clone::Clone for Token {
#[inline]
fn clone(&self) -> Self {
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::marker::StructuralPartialEq for Token { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Token {
#[inline]
fn eq(&self, other: &Self) -> 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) {
let Token { kind: ref __binding_0, span: ref __binding_1 } =
*self;
::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)]
537pub struct Token {
538 pub kind: TokenKind,
539 pub span: Span,
540}
541
542impl TokenKind {
543 pub fn lit(kind: LitKind, symbol: Symbol, suffix: Option<Symbol>) -> TokenKind {
544 Literal(Lit::new(kind, symbol, suffix))
545 }
546
547 pub fn break_two_token_op(&self, n: u32) -> Option<(TokenKind, TokenKind)> {
552 if !(n == 1 || n == 2) {
::core::panicking::panic("assertion failed: n == 1 || n == 2")
};assert!(n == 1 || n == 2);
553 Some(match (self, n) {
554 (Le, 1) => (Lt, Eq),
555 (EqEq, 1) => (Eq, Eq),
556 (Ne, 1) => (Bang, Eq),
557 (Ge, 1) => (Gt, Eq),
558 (AndAnd, 1) => (And, And),
559 (OrOr, 1) => (Or, Or),
560 (Shl, 1) => (Lt, Lt),
561 (Shr, 1) => (Gt, Gt),
562 (PlusEq, 1) => (Plus, Eq),
563 (MinusEq, 1) => (Minus, Eq),
564 (StarEq, 1) => (Star, Eq),
565 (SlashEq, 1) => (Slash, Eq),
566 (PercentEq, 1) => (Percent, Eq),
567 (CaretEq, 1) => (Caret, Eq),
568 (AndEq, 1) => (And, Eq),
569 (OrEq, 1) => (Or, Eq),
570 (ShlEq, 1) => (Lt, Le), (ShlEq, 2) => (Shl, Eq), (ShrEq, 1) => (Gt, Ge), (ShrEq, 2) => (Shr, Eq), (DotDot, 1) => (Dot, Dot),
575 (DotDotDot, 1) => (Dot, DotDot), (DotDotDot, 2) => (DotDot, Dot), (DotDotEq, 2) => (DotDot, Eq),
578 (PathSep, 1) => (Colon, Colon),
579 (RArrow, 1) => (Minus, Gt),
580 (LArrow, 1) => (Lt, Minus),
581 (FatArrow, 1) => (Eq, Gt),
582 _ => return None,
583 })
584 }
585
586 pub fn similar_tokens(&self) -> &[TokenKind] {
589 match self {
590 Comma => &[Dot, Lt, Semi],
591 Semi => &[Colon, Comma],
592 Colon => &[Semi],
593 FatArrow => &[Eq, RArrow, Ge, Gt],
594 _ => &[],
595 }
596 }
597
598 pub fn should_end_const_arg(&self) -> bool {
599 #[allow(non_exhaustive_omitted_patterns)] match self {
Gt | Ge | Shr | ShrEq => true,
_ => false,
}matches!(self, Gt | Ge | Shr | ShrEq)
600 }
601
602 pub fn is_delim(&self) -> bool {
603 self.open_delim().is_some() || self.close_delim().is_some()
604 }
605
606 pub fn open_delim(&self) -> Option<Delimiter> {
607 match *self {
608 OpenParen => Some(Delimiter::Parenthesis),
609 OpenBrace => Some(Delimiter::Brace),
610 OpenBracket => Some(Delimiter::Bracket),
611 OpenInvisible(origin) => Some(Delimiter::Invisible(origin)),
612 _ => None,
613 }
614 }
615
616 pub fn close_delim(&self) -> Option<Delimiter> {
617 match *self {
618 CloseParen => Some(Delimiter::Parenthesis),
619 CloseBrace => Some(Delimiter::Brace),
620 CloseBracket => Some(Delimiter::Bracket),
621 CloseInvisible(origin) => Some(Delimiter::Invisible(origin)),
622 _ => None,
623 }
624 }
625
626 pub fn is_close_delim_or_eof(&self) -> bool {
627 match self {
628 CloseParen | CloseBrace | CloseBracket | CloseInvisible(_) | Eof => true,
629 _ => false,
630 }
631 }
632}
633
634impl Token {
635 pub const fn new(kind: TokenKind, span: Span) -> Self {
636 Token { kind, span }
637 }
638
639 pub const fn dummy() -> Self {
641 Token::new(TokenKind::Question, DUMMY_SP)
642 }
643
644 pub fn from_ast_ident(ident: sp::Ident) -> Self {
649 let kind = if ident.is_raw_guess() { IdentKind::Raw } else { IdentKind::Normal };
650 Token::new(Ident(ident.name, kind), ident.span)
651 }
652
653 pub fn is_range_separator(&self) -> bool {
654 [DotDot, DotDotDot, DotDotEq].contains(&self.kind)
655 }
656
657 pub fn is_punct(&self) -> bool {
658 match self.kind {
659 Eq | Lt | Le | EqEq | Ne | Ge | Gt | AndAnd | OrOr | Bang | Tilde | Plus | Minus
660 | Star | Slash | Percent | Caret | And | Or | Shl | Shr | PlusEq | MinusEq | StarEq
661 | SlashEq | PercentEq | CaretEq | AndEq | OrEq | ShlEq | ShrEq | At | Dot | DotDot
662 | DotDotDot | DotDotEq | Comma | Semi | Colon | PathSep | RArrow | LArrow
663 | FatArrow | Pound | Dollar | Question | SingleQuote => true,
664
665 OpenParen | CloseParen | OpenBrace | CloseBrace | OpenBracket | CloseBracket
666 | OpenInvisible(_) | CloseInvisible(_) | Literal(..) | DocComment(..) | Ident(..)
667 | NtIdent(..) | Lifetime(..) | NtLifetime(..) | Eof => false,
668 }
669 }
670
671 pub fn is_like_plus(&self) -> bool {
672 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Plus | PlusEq => true,
_ => false,
}matches!(self.kind, Plus | PlusEq)
673 }
674
675 pub fn can_begin_expr(&self) -> bool {
677 match self.uninterpolate().kind {
681 Ident(name, kind) =>
682 ident_can_begin_expr(name, self.span, kind), OpenParen | OpenBrace | OpenBracket | Literal(..) | Bang | Minus | Star | Or | OrOr | And | AndAnd | DotDot | DotDotDot | DotDotEq | Lt | Shl | PathSep | Lifetime(..) | Pound => true, OpenInvisible(InvisibleOrigin::MetaVar(
700 MetaVarKind::Block
701 | MetaVarKind::Expr { .. }
702 | MetaVarKind::Literal
703 | MetaVarKind::Path,
704 )) => true,
705 _ => false,
706 }
707 }
708
709 pub fn can_begin_pattern(&self, pat_kind: NtPatKind) -> bool {
711 match &self.uninterpolate().kind {
715 Ident(..) | NtIdent(..) |
717 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(
730 MetaVarKind::Expr { .. }
731 | MetaVarKind::Literal
732 | MetaVarKind::Meta { .. }
733 | MetaVarKind::Pat(_)
734 | MetaVarKind::Path
735 | MetaVarKind::Ty { .. },
736 )) => true,
737 _ => false,
738 }
739 }
740
741 pub fn can_begin_type(&self) -> bool {
743 match self.uninterpolate().kind {
750 Ident(name, kind) =>
751 ident_can_begin_type(name, self.span, kind), OpenParen | OpenBracket | Bang | Star | And | AndAnd | Question | Lifetime(..) | Lt | Shl | PathSep => true, OpenInvisible(InvisibleOrigin::MetaVar(MetaVarKind::Ty { .. } | MetaVarKind::Path)) => {
763 true
764 }
765 _ => false,
766 }
767 }
768
769 pub fn can_begin_const_arg(&self) -> bool {
771 match self.kind {
772 OpenBrace | Literal(..) | Minus => true,
773 Ident(name, IdentKind::Normal | IdentKind::ForcedKeyword) if name.is_bool_lit() => true,
774 OpenInvisible(InvisibleOrigin::MetaVar(
775 MetaVarKind::Expr { .. } | MetaVarKind::Block | MetaVarKind::Literal,
776 )) => true,
777 _ => false,
778 }
779 }
780
781 pub fn can_begin_item(&self) -> bool {
783 match self.kind {
784 Ident(name, _) => [
785 kw::Fn,
786 kw::Use,
787 kw::Struct,
788 kw::Enum,
789 kw::Pub,
790 kw::Trait,
791 kw::Extern,
792 kw::Impl,
793 kw::Unsafe,
794 kw::Const,
795 kw::Safe,
796 kw::Static,
797 kw::Union,
798 kw::Macro,
799 kw::Mod,
800 kw::Type,
801 ]
802 .contains(&name),
803 _ => false,
804 }
805 }
806
807 pub fn is_lit(&self) -> bool {
809 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Literal(..) => true,
_ => false,
}matches!(self.kind, Literal(..))
810 }
811
812 pub fn can_begin_literal_maybe_minus(&self) -> bool {
820 match self.uninterpolate().kind {
821 Literal(..) | Minus => true,
822 Ident(name, IdentKind::Normal | IdentKind::ForcedKeyword) if name.is_bool_lit() => true,
823 OpenInvisible(InvisibleOrigin::MetaVar(mv_kind)) => match mv_kind {
824 MetaVarKind::Literal => true,
825 MetaVarKind::Expr { can_begin_literal_maybe_minus, .. } => {
826 can_begin_literal_maybe_minus
827 }
828 _ => false,
829 },
830 _ => false,
831 }
832 }
833
834 pub fn can_begin_string_literal(&self) -> bool {
835 match self.uninterpolate().kind {
836 Literal(..) => true,
837 OpenInvisible(InvisibleOrigin::MetaVar(mv_kind)) => match mv_kind {
838 MetaVarKind::Literal => true,
839 MetaVarKind::Expr { can_begin_string_literal, .. } => can_begin_string_literal,
840 _ => false,
841 },
842 _ => false,
843 }
844 }
845
846 pub fn uninterpolate(&self) -> Cow<'_, Token> {
851 match self.kind {
852 NtIdent(ident, kind) => Cow::Owned(Token::new(Ident(ident.name, kind), ident.span)),
853 NtLifetime(ident, kind) => {
854 Cow::Owned(Token::new(Lifetime(ident.name, kind), ident.span))
855 }
856 _ => Cow::Borrowed(self),
857 }
858 }
859
860 #[inline]
862 pub fn ident(&self) -> Option<(sp::Ident, IdentKind)> {
863 match self.kind {
865 Ident(name, kind) => Some((sp::Ident::new(name, self.span), kind)),
866 NtIdent(ident, kind) => Some((ident, kind)),
867 _ => None,
868 }
869 }
870
871 #[inline]
873 pub fn lifetime(&self) -> Option<(sp::Ident, IdentKind)> {
874 match self.kind {
876 Lifetime(name, kind) => Some((sp::Ident::new(name, self.span), kind)),
877 NtLifetime(ident, kind) => Some((ident, kind)),
878 _ => None,
879 }
880 }
881
882 pub fn is_ident(&self) -> bool {
884 self.ident().is_some()
885 }
886
887 pub fn is_lifetime(&self) -> bool {
889 self.lifetime().is_some()
890 }
891
892 pub fn is_ident_named(&self, name: Symbol) -> bool {
895 self.ident().is_some_and(|(ident, _)| ident.name == name)
896 }
897
898 pub fn is_metavar_expr(&self) -> bool {
901 #[allow(non_exhaustive_omitted_patterns)] match self.is_metavar_seq() {
Some(MetaVarKind::Expr { .. } | MetaVarKind::Literal | MetaVarKind::Path |
MetaVarKind::Block) => true,
_ => false,
}matches!(
902 self.is_metavar_seq(),
903 Some(
904 MetaVarKind::Expr { .. }
905 | MetaVarKind::Literal
906 | MetaVarKind::Path
907 | MetaVarKind::Block
908 )
909 )
910 }
911
912 pub fn is_metavar_block(&self) -> bool {
914 #[allow(non_exhaustive_omitted_patterns)] match self.is_metavar_seq() {
Some(MetaVarKind::Block) => true,
_ => false,
}matches!(self.is_metavar_seq(), Some(MetaVarKind::Block))
915 }
916
917 pub fn is_mutability(&self) -> bool {
919 self.is_keyword(kw::Mut) || self.is_keyword(kw::Const)
920 }
921
922 pub fn is_qpath_start(&self) -> bool {
923 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Lt | Shl => true,
_ => false,
}matches!(self.kind, Lt | Shl)
924 }
925
926 pub fn is_path_start(&self) -> bool {
927 self.kind == PathSep
928 || self.is_qpath_start()
929 || #[allow(non_exhaustive_omitted_patterns)] match self.is_metavar_seq() {
Some(MetaVarKind::Path) => true,
_ => false,
}matches!(self.is_metavar_seq(), Some(MetaVarKind::Path))
930 || self.is_path_segment_keyword()
931 || self.is_non_reserved_ident()
932 }
933
934 pub fn is_keyword(&self, kw: Symbol) -> bool {
936 self.non_raw_ident().is_some_and(|id| id.name == kw)
937 }
938
939 pub fn is_keyword_case(&self, kw: Symbol, case: Case) -> bool {
942 self.is_keyword(kw)
943 || (case == Case::Insensitive
944 && self.non_raw_ident().is_some_and(|id| {
945 id.name.as_str().eq_ignore_ascii_case(kw.as_str())
947 }))
948 }
949
950 pub fn is_path_segment_keyword(&self) -> bool {
951 self.non_raw_ident().is_some_and(sp::Ident::is_path_segment_keyword)
952 }
953
954 pub fn is_special_ident(&self) -> bool {
957 self.non_raw_ident().is_some_and(sp::Ident::is_special)
958 }
959
960 pub fn is_used_keyword(&self) -> bool {
962 self.non_raw_ident().is_some_and(sp::Ident::is_used_keyword)
963 }
964
965 pub fn is_unused_keyword(&self) -> bool {
967 self.non_raw_ident().is_some_and(sp::Ident::is_unused_keyword)
968 }
969
970 pub fn is_reserved_ident(&self) -> bool {
972 self.ident().is_some_and(|(id, kind)| ident_of_kind_is_reserved(id, kind))
973 }
974
975 pub fn is_non_reserved_ident(&self) -> bool {
976 self.non_reserved_ident().is_some()
977 }
978
979 pub fn non_reserved_ident(&self) -> Option<sp::Ident> {
980 self.ident().filter(|&(id, kind)| !ident_of_kind_is_reserved(id, kind)).map(|(id, _)| id)
981 }
982
983 pub fn non_raw_ident(&self) -> Option<sp::Ident> {
985 match self.ident() {
986 Some((id, IdentKind::Normal | IdentKind::ForcedKeyword)) => Some(id),
987 _ => None,
988 }
989 }
990
991 pub fn is_bool_lit(&self) -> bool {
993 self.non_raw_ident().is_some_and(|id| id.name.is_bool_lit())
994 }
995
996 pub fn is_numeric_lit(&self) -> bool {
997 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Literal(Lit { kind: LitKind::Integer, .. }) |
Literal(Lit { kind: LitKind::Float, .. }) => true,
_ => false,
}matches!(
998 self.kind,
999 Literal(Lit { kind: LitKind::Integer, .. }) | Literal(Lit { kind: LitKind::Float, .. })
1000 )
1001 }
1002
1003 pub fn is_integer_lit(&self) -> bool {
1005 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
Literal(Lit { kind: LitKind::Integer, .. }) => true,
_ => false,
}matches!(self.kind, Literal(Lit { kind: LitKind::Integer, .. }))
1006 }
1007
1008 pub fn is_metavar_seq(&self) -> Option<MetaVarKind> {
1011 match self.kind {
1012 OpenInvisible(InvisibleOrigin::MetaVar(kind)) => Some(kind),
1013 _ => None,
1014 }
1015 }
1016
1017 pub fn glue(&self, joint: &Token) -> Option<Token> {
1018 let kind = match (&self.kind, &joint.kind) {
1019 (Eq, Eq) => EqEq,
1020 (Eq, Gt) => FatArrow,
1021 (Eq, _) => return None,
1022
1023 (Lt, Eq) => Le,
1024 (Lt, Lt) => Shl,
1025 (Lt, Le) => ShlEq,
1026 (Lt, Minus) => LArrow,
1027 (Lt, _) => return None,
1028
1029 (Gt, Eq) => Ge,
1030 (Gt, Gt) => Shr,
1031 (Gt, Ge) => ShrEq,
1032 (Gt, _) => return None,
1033
1034 (Bang, Eq) => Ne,
1035 (Bang, _) => return None,
1036
1037 (Plus, Eq) => PlusEq,
1038 (Plus, _) => return None,
1039
1040 (Minus, Eq) => MinusEq,
1041 (Minus, Gt) => RArrow,
1042 (Minus, _) => return None,
1043
1044 (Star, Eq) => StarEq,
1045 (Star, _) => return None,
1046
1047 (Slash, Eq) => SlashEq,
1048 (Slash, _) => return None,
1049
1050 (Percent, Eq) => PercentEq,
1051 (Percent, _) => return None,
1052
1053 (Caret, Eq) => CaretEq,
1054 (Caret, _) => return None,
1055
1056 (And, Eq) => AndEq,
1057 (And, And) => AndAnd,
1058 (And, _) => return None,
1059
1060 (Or, Eq) => OrEq,
1061 (Or, Or) => OrOr,
1062 (Or, _) => return None,
1063
1064 (Shl, Eq) => ShlEq,
1065 (Shl, _) => return None,
1066
1067 (Shr, Eq) => ShrEq,
1068 (Shr, _) => return None,
1069
1070 (Dot, Dot) => DotDot,
1071 (Dot, DotDot) => DotDotDot,
1072 (Dot, _) => return None,
1073
1074 (DotDot, Dot) => DotDotDot,
1075 (DotDot, Eq) => DotDotEq,
1076 (DotDot, _) => return None,
1077
1078 (Colon, Colon) => PathSep,
1079 (Colon, _) => return None,
1080
1081 (SingleQuote, Ident(name, kind)) => {
1082 Lifetime(Symbol::intern(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}", name))
})format!("'{name}")), *kind)
1083 }
1084 (SingleQuote, _) => return None,
1085
1086 (
1087 Le | EqEq | Ne | Ge | AndAnd | OrOr | Tilde | PlusEq | MinusEq | StarEq | SlashEq
1088 | PercentEq | CaretEq | AndEq | OrEq | ShlEq | ShrEq | At | DotDotDot | DotDotEq
1089 | Comma | Semi | PathSep | RArrow | LArrow | FatArrow | Pound | Dollar | Question
1090 | OpenParen | CloseParen | OpenBrace | CloseBrace | OpenBracket | CloseBracket
1091 | OpenInvisible(_) | CloseInvisible(_) | Literal(..) | Ident(..) | NtIdent(..)
1092 | Lifetime(..) | NtLifetime(..) | DocComment(..) | Eof,
1093 _,
1094 ) => {
1095 return None;
1096 }
1097 };
1098
1099 Some(Token::new(kind, self.span.to(joint.span)))
1100 }
1101}
1102
1103impl PartialEq<TokenKind> for Token {
1104 #[inline]
1105 fn eq(&self, rhs: &TokenKind) -> bool {
1106 self.kind == *rhs
1107 }
1108}
1109
1110pub fn ident_of_kind_is_reserved(id: sp::Ident, kind: IdentKind) -> bool {
1111 match kind {
1112 IdentKind::Normal => id.is_reserved(),
1113 IdentKind::Raw => false,
1114 IdentKind::ForcedKeyword => true,
1115 }
1116}
1117
1118#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NtPatKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::PatWithOr =>
::core::fmt::Formatter::write_str(f, "PatWithOr"),
Self::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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for NtPatKind { }
#[automatically_derived]
impl ::core::clone::Clone for NtPatKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for NtPatKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for NtPatKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::PatParam { inferred: __self_0 }, Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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)]
1119pub enum NtPatKind {
1120 PatWithOr,
1122 PatParam { inferred: bool },
1126}
1127
1128#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NtExprKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Expr => ::core::fmt::Formatter::write_str(f, "Expr"),
Self::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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for NtExprKind { }
#[automatically_derived]
impl ::core::clone::Clone for NtExprKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for NtExprKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for NtExprKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Expr2021 { inferred: __self_0 }, Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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)]
1129pub enum NtExprKind {
1130 Expr,
1133 Expr2021 { inferred: bool },
1137}
1138
1139#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NonterminalKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Item => ::core::fmt::Formatter::write_str(f, "Item"),
Self::Block => ::core::fmt::Formatter::write_str(f, "Block"),
Self::Stmt => ::core::fmt::Formatter::write_str(f, "Stmt"),
Self::Pat(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Pat",
&__self_0),
Self::Expr(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
&__self_0),
Self::Ty => ::core::fmt::Formatter::write_str(f, "Ty"),
Self::Ident => ::core::fmt::Formatter::write_str(f, "Ident"),
Self::Lifetime =>
::core::fmt::Formatter::write_str(f, "Lifetime"),
Self::Literal => ::core::fmt::Formatter::write_str(f, "Literal"),
Self::Meta => ::core::fmt::Formatter::write_str(f, "Meta"),
Self::Path => ::core::fmt::Formatter::write_str(f, "Path"),
Self::Vis => ::core::fmt::Formatter::write_str(f, "Vis"),
Self::Guard => ::core::fmt::Formatter::write_str(f, "Guard"),
Self::TT => ::core::fmt::Formatter::write_str(f, "TT"),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for NonterminalKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for NonterminalKind { }
#[automatically_derived]
impl ::core::clone::Clone for NonterminalKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<NtPatKind>;
let _: ::core::clone::AssertParamIsClone<NtExprKind>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for NonterminalKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for NonterminalKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Pat(__self_0), Self::Pat(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Expr(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Pat(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::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)]
1141pub enum NonterminalKind {
1142 Item,
1143 Block,
1144 Stmt,
1145 Pat(NtPatKind),
1146 Expr(NtExprKind),
1147 Ty,
1148 Ident,
1149 Lifetime,
1150 Literal,
1151 Meta,
1152 Path,
1153 Vis,
1154 Guard,
1155 TT,
1156}
1157
1158impl NonterminalKind {
1159 pub fn from_symbol(
1162 symbol: Symbol,
1163 edition: impl FnOnce() -> Edition,
1164 ) -> Option<NonterminalKind> {
1165 Some(match symbol {
1166 sym::item => NonterminalKind::Item,
1167 sym::block => NonterminalKind::Block,
1168 sym::stmt => NonterminalKind::Stmt,
1169 sym::pat => {
1170 if edition().at_least_rust_2021() {
1171 NonterminalKind::Pat(PatWithOr)
1172 } else {
1173 NonterminalKind::Pat(PatParam { inferred: true })
1174 }
1175 }
1176 sym::pat_param => NonterminalKind::Pat(PatParam { inferred: false }),
1177 sym::expr => {
1178 if edition().at_least_rust_2024() {
1179 NonterminalKind::Expr(Expr)
1180 } else {
1181 NonterminalKind::Expr(Expr2021 { inferred: true })
1182 }
1183 }
1184 sym::expr_2021 => NonterminalKind::Expr(Expr2021 { inferred: false }),
1185 sym::ty => NonterminalKind::Ty,
1186 sym::ident => NonterminalKind::Ident,
1187 sym::lifetime => NonterminalKind::Lifetime,
1188 sym::literal => NonterminalKind::Literal,
1189 sym::meta => NonterminalKind::Meta,
1190 sym::path => NonterminalKind::Path,
1191 sym::vis => NonterminalKind::Vis,
1192 sym::guard => NonterminalKind::Guard,
1193 sym::tt => NonterminalKind::TT,
1194 _ => return None,
1195 })
1196 }
1197
1198 fn symbol(self) -> Symbol {
1199 match self {
1200 NonterminalKind::Item => sym::item,
1201 NonterminalKind::Block => sym::block,
1202 NonterminalKind::Stmt => sym::stmt,
1203 NonterminalKind::Pat(PatParam { inferred: true } | PatWithOr) => sym::pat,
1204 NonterminalKind::Pat(PatParam { inferred: false }) => sym::pat_param,
1205 NonterminalKind::Expr(Expr2021 { inferred: true } | Expr) => sym::expr,
1206 NonterminalKind::Expr(Expr2021 { inferred: false }) => sym::expr_2021,
1207 NonterminalKind::Ty => sym::ty,
1208 NonterminalKind::Ident => sym::ident,
1209 NonterminalKind::Lifetime => sym::lifetime,
1210 NonterminalKind::Literal => sym::literal,
1211 NonterminalKind::Meta => sym::meta,
1212 NonterminalKind::Path => sym::path,
1213 NonterminalKind::Vis => sym::vis,
1214 NonterminalKind::Guard => sym::guard,
1215 NonterminalKind::TT => sym::tt,
1216 }
1217 }
1218}
1219
1220impl fmt::Display for NonterminalKind {
1221 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1222 f.write_fmt(format_args!("{0}", self.symbol()))write!(f, "{}", self.symbol())
1223 }
1224}
1225
1226#[cfg(target_pointer_width = "64")]
1228mod size_asserts {
1229 use rustc_data_structures::static_assert_size;
1230
1231 use super::*;
1232 const _: [(); 12] = [(); ::std::mem::size_of::<Lit>()];static_assert_size!(Lit, 12);
1234 const _: [(); 2] = [(); ::std::mem::size_of::<LitKind>()];static_assert_size!(LitKind, 2);
1235 const _: [(); 24] = [(); ::std::mem::size_of::<Token>()];static_assert_size!(Token, 24);
1236 const _: [(); 16] = [(); ::std::mem::size_of::<TokenKind>()];static_assert_size!(TokenKind, 16);
1237 }