1use std::borrow::Cow;
8use std::hash::Hash;
9use std::ops::Range;
10use std::sync::Arc;
11use std::{cmp, fmt, iter, mem};
12
13use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
14use rustc_data_structures::sync;
15use rustc_macros::{Decodable, Encodable, StableHash, Walkable};
16use rustc_serialize::{Decodable, Encodable};
17use rustc_span::{DUMMY_SP, Span, SpanDecoder, SpanEncoder, Symbol, sym};
18use thin_vec::ThinVec;
19
20use crate::ast::AttrStyle;
21use crate::ast_traits::HasTokens;
22use crate::token::{self, Delimiter, Token, TokenKind};
23use crate::{AttrVec, Attribute};
24
25#[cfg(test)]
26mod tests;
27
28#[derive(#[automatically_derived]
impl ::core::fmt::Debug for TokenTree {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
TokenTree::Token(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Token",
__self_0, &__self_1),
TokenTree::Delimited(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_tuple_field4_finish(f,
"Delimited", __self_0, __self_1, __self_2, &__self_3),
}
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for TokenTree {
#[inline]
fn clone(&self) -> TokenTree {
match self {
TokenTree::Token(__self_0, __self_1) =>
TokenTree::Token(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
TokenTree::Delimited(__self_0, __self_1, __self_2, __self_3) =>
TokenTree::Delimited(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2),
::core::clone::Clone::clone(__self_3)),
}
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for TokenTree {
#[inline]
fn eq(&self, other: &TokenTree) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(TokenTree::Token(__self_0, __self_1),
TokenTree::Token(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(TokenTree::Delimited(__self_0, __self_1, __self_2, __self_3),
TokenTree::Delimited(__arg1_0, __arg1_1, __arg1_2,
__arg1_3)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1 &&
__self_2 == __arg1_2 && __self_3 == __arg1_3,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TokenTree {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Token>;
let _: ::core::cmp::AssertParamIsEq<Spacing>;
let _: ::core::cmp::AssertParamIsEq<DelimSpan>;
let _: ::core::cmp::AssertParamIsEq<DelimSpacing>;
let _: ::core::cmp::AssertParamIsEq<Delimiter>;
let _: ::core::cmp::AssertParamIsEq<TokenStream>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for TokenTree {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
TokenTree::Token(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
TokenTree::Delimited(__self_0, __self_1, __self_2, __self_3) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state);
::core::hash::Hash::hash(__self_2, state);
::core::hash::Hash::hash(__self_3, state)
}
}
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for TokenTree {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
TokenTree::Token(ref __binding_0, ref __binding_1) => {
0usize
}
TokenTree::Delimited(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
1usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
TokenTree::Token(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
TokenTree::Delimited(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for TokenTree {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
TokenTree::Token(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
TokenTree::Delimited(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TokenTree`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for TokenTree {
#[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 {
TokenTree::Token(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TokenTree::Delimited(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
30pub enum TokenTree {
31 Token(Token, Spacing),
34 Delimited(DelimSpan, DelimSpacing, Delimiter, TokenStream),
36}
37
38fn _dummy()
40where
41 Token: sync::DynSend + sync::DynSync,
42 Spacing: sync::DynSend + sync::DynSync,
43 DelimSpan: sync::DynSend + sync::DynSync,
44 Delimiter: sync::DynSend + sync::DynSync,
45 TokenStream: sync::DynSend + sync::DynSync,
46{
47}
48
49impl TokenTree {
50 pub fn eq_unspanned(&self, other: &TokenTree) -> bool {
52 match (self, other) {
53 (TokenTree::Token(token, _), TokenTree::Token(token2, _)) => token.kind == token2.kind,
54 (TokenTree::Delimited(.., delim, tts), TokenTree::Delimited(.., delim2, tts2)) => {
55 delim == delim2 && tts.iter().eq_by(tts2.iter(), |a, b| a.eq_unspanned(b))
56 }
57 _ => false,
58 }
59 }
60
61 pub fn span(&self) -> Span {
63 match self {
64 TokenTree::Token(token, _) => token.span,
65 TokenTree::Delimited(sp, ..) => sp.entire(),
66 }
67 }
68
69 pub fn token_alone(kind: TokenKind, span: Span) -> TokenTree {
71 TokenTree::Token(Token::new(kind, span), Spacing::Alone)
72 }
73
74 pub fn token_joint(kind: TokenKind, span: Span) -> TokenTree {
76 TokenTree::Token(Token::new(kind, span), Spacing::Joint)
77 }
78
79 pub fn token_joint_hidden(kind: TokenKind, span: Span) -> TokenTree {
81 TokenTree::Token(Token::new(kind, span), Spacing::JointHidden)
82 }
83
84 pub fn uninterpolate(&self) -> Cow<'_, TokenTree> {
85 match self {
86 TokenTree::Token(token, spacing) => match token.uninterpolate() {
87 Cow::Owned(token) => Cow::Owned(TokenTree::Token(token, *spacing)),
88 Cow::Borrowed(_) => Cow::Borrowed(self),
89 },
90 _ => Cow::Borrowed(self),
91 }
92 }
93}
94
95#[derive(#[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for WithTokens<T> {
#[inline]
fn clone(&self) -> WithTokens<T> {
WithTokens {
node: ::core::clone::Clone::clone(&self.node),
tokens: ::core::clone::Clone::clone(&self.tokens),
}
}
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for WithTokens<T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "WithTokens",
"node", &self.node, "tokens", &&self.tokens)
}
}Debug)]
96pub struct WithTokens<T> {
97 pub node: T,
98 pub tokens: Option<LazyAttrTokenStream>,
99}
100
101impl<T> WithTokens<T> {
102 pub fn new(node: T) -> WithTokens<T> {
103 WithTokens { node, tokens: None }
104 }
105
106 pub fn map<U>(self, f: impl FnOnce(T) -> U) -> WithTokens<U> {
107 WithTokens { node: f(self.node), tokens: self.tokens }
108 }
109}
110
111#[derive(#[automatically_derived]
impl ::core::clone::Clone for LazyAttrTokenStream {
#[inline]
fn clone(&self) -> LazyAttrTokenStream {
LazyAttrTokenStream(::core::clone::Clone::clone(&self.0))
}
}Clone)]
114pub struct LazyAttrTokenStream(Arc<LazyAttrTokenStreamInner>);
115
116impl LazyAttrTokenStream {
117 pub fn new_direct(stream: AttrTokenStream) -> LazyAttrTokenStream {
118 LazyAttrTokenStream(Arc::new(LazyAttrTokenStreamInner::Direct(stream)))
119 }
120
121 pub fn new_pending(
122 start_token: (Token, Spacing),
123 cursor_snapshot: TokenCursor,
124 num_calls: u32,
125 break_last_token: u32,
126 node_replacements: ThinVec<NodeReplacement>,
127 ) -> LazyAttrTokenStream {
128 LazyAttrTokenStream(Arc::new(LazyAttrTokenStreamInner::Pending {
129 start_token,
130 cursor_snapshot,
131 num_calls,
132 break_last_token,
133 node_replacements,
134 }))
135 }
136
137 pub fn to_attr_token_stream(&self) -> AttrTokenStream {
138 self.0.to_attr_token_stream()
139 }
140}
141
142impl fmt::Debug for LazyAttrTokenStream {
143 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
144 f.write_fmt(format_args!("LazyAttrTokenStream({0:?})",
self.to_attr_token_stream()))write!(f, "LazyAttrTokenStream({:?})", self.to_attr_token_stream())
145 }
146}
147
148impl<S: SpanEncoder> Encodable<S> for LazyAttrTokenStream {
149 fn encode(&self, _s: &mut S) {
150 {
::core::panicking::panic_fmt(format_args!("Attempted to encode LazyAttrTokenStream"));
};panic!("Attempted to encode LazyAttrTokenStream");
151 }
152}
153
154impl<D: SpanDecoder> Decodable<D> for LazyAttrTokenStream {
155 fn decode(_d: &mut D) -> Self {
156 {
::core::panicking::panic_fmt(format_args!("Attempted to decode LazyAttrTokenStream"));
};panic!("Attempted to decode LazyAttrTokenStream");
157 }
158}
159
160impl StableHash for LazyAttrTokenStream {
161 fn stable_hash<Hcx: StableHashCtxt>(&self, _hcx: &mut Hcx, _hasher: &mut StableHasher) {
162 {
::core::panicking::panic_fmt(format_args!("Attempted to compute stable hash for LazyAttrTokenStream"));
};panic!("Attempted to compute stable hash for LazyAttrTokenStream");
163 }
164}
165
166#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParserRange {
#[inline]
fn clone(&self) -> ParserRange {
ParserRange(::core::clone::Clone::clone(&self.0))
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ParserRange {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "ParserRange",
&&self.0)
}
}Debug)]
168pub struct ParserRange(pub Range<u32>);
169
170#[derive(#[automatically_derived]
impl ::core::clone::Clone for NodeRange {
#[inline]
fn clone(&self) -> NodeRange {
NodeRange(::core::clone::Clone::clone(&self.0))
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for NodeRange {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "NodeRange",
&&self.0)
}
}Debug)]
174pub struct NodeRange(pub Range<u32>);
175
176pub type ParserReplacement = (ParserRange, Option<AttrsTarget>);
196
197pub type NodeReplacement = (NodeRange, Option<AttrsTarget>);
199
200impl NodeRange {
201 pub fn new(ParserRange(parser_range): ParserRange, start_pos: u32) -> NodeRange {
211 if !!parser_range.is_empty() {
::core::panicking::panic("assertion failed: !parser_range.is_empty()")
};assert!(!parser_range.is_empty());
212 if !(parser_range.start >= start_pos) {
::core::panicking::panic("assertion failed: parser_range.start >= start_pos")
};assert!(parser_range.start >= start_pos);
213 NodeRange((parser_range.start - start_pos)..(parser_range.end - start_pos))
214 }
215}
216
217enum LazyAttrTokenStreamInner {
218 Direct(AttrTokenStream),
220
221 Pending {
233 start_token: (Token, Spacing),
234 cursor_snapshot: TokenCursor,
235 num_calls: u32,
236 break_last_token: u32,
237 node_replacements: ThinVec<NodeReplacement>,
238 },
239}
240
241impl LazyAttrTokenStreamInner {
242 fn to_attr_token_stream(&self) -> AttrTokenStream {
243 match self {
244 LazyAttrTokenStreamInner::Direct(stream) => stream.clone(),
245 LazyAttrTokenStreamInner::Pending {
246 start_token,
247 cursor_snapshot,
248 num_calls,
249 break_last_token,
250 node_replacements,
251 } => {
252 let mut cursor_snapshot = cursor_snapshot.clone();
258 let tokens = iter::once(FlatToken::Token(*start_token))
259 .chain(iter::repeat_with(|| FlatToken::Token(cursor_snapshot.next())))
260 .take(*num_calls as usize);
261
262 if node_replacements.is_empty() {
263 make_attr_token_stream(tokens, *break_last_token)
264 } else {
265 let mut tokens: Vec<_> = tokens.collect();
266 let mut node_replacements = node_replacements.to_vec();
267 node_replacements.sort_by_key(|(range, _)| range.0.start);
268
269 #[cfg(debug_assertions)]
270 for [(node_range, tokens), (next_node_range, next_tokens)] in
271 node_replacements.array_windows()
272 {
273 if !(node_range.0.end <= next_node_range.0.start ||
node_range.0.end >= next_node_range.0.end) {
{
::core::panicking::panic_fmt(format_args!("Node ranges should be disjoint or nested: ({0:?}, {1:?}) ({2:?}, {3:?})",
node_range, tokens, next_node_range, next_tokens));
}
};assert!(
274 node_range.0.end <= next_node_range.0.start
275 || node_range.0.end >= next_node_range.0.end,
276 "Node ranges should be disjoint or nested: ({:?}, {:?}) ({:?}, {:?})",
277 node_range,
278 tokens,
279 next_node_range,
280 next_tokens,
281 );
282 }
283
284 for (node_range, target) in node_replacements.into_iter().rev() {
298 if !!node_range.0.is_empty() {
{
::core::panicking::panic_fmt(format_args!("Cannot replace an empty node range: {0:?}",
node_range.0));
}
};assert!(
299 !node_range.0.is_empty(),
300 "Cannot replace an empty node range: {:?}",
301 node_range.0
302 );
303
304 let target_len = target.is_some() as usize;
309 tokens.splice(
310 (node_range.0.start as usize)..(node_range.0.end as usize),
311 target.into_iter().map(|target| FlatToken::AttrsTarget(target)).chain(
312 iter::repeat(FlatToken::Empty)
313 .take(node_range.0.len() - target_len),
314 ),
315 );
316 }
317 make_attr_token_stream(tokens.into_iter(), *break_last_token)
318 }
319 }
320 }
321 }
322}
323
324#[derive(#[automatically_derived]
impl ::core::fmt::Debug for FlatToken {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
FlatToken::Token(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Token",
&__self_0),
FlatToken::AttrsTarget(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"AttrsTarget", &__self_0),
FlatToken::Empty => ::core::fmt::Formatter::write_str(f, "Empty"),
}
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for FlatToken {
#[inline]
fn clone(&self) -> FlatToken {
match self {
FlatToken::Token(__self_0) =>
FlatToken::Token(::core::clone::Clone::clone(__self_0)),
FlatToken::AttrsTarget(__self_0) =>
FlatToken::AttrsTarget(::core::clone::Clone::clone(__self_0)),
FlatToken::Empty => FlatToken::Empty,
}
}
}Clone)]
330enum FlatToken {
331 Token((Token, Spacing)),
334 AttrsTarget(AttrsTarget),
338 Empty,
342}
343
344#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrTokenStream {
#[inline]
fn clone(&self) -> AttrTokenStream {
AttrTokenStream(::core::clone::Clone::clone(&self.0))
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AttrTokenStream {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"AttrTokenStream", &&self.0)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for AttrTokenStream {
#[inline]
fn default() -> AttrTokenStream {
AttrTokenStream(::core::default::Default::default())
}
}Default, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for AttrTokenStream {
fn encode(&self, __encoder: &mut __E) {
match *self {
AttrTokenStream(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for AttrTokenStream {
fn decode(__decoder: &mut __D) -> Self {
AttrTokenStream(::rustc_serialize::Decodable::decode(__decoder))
}
}
};Decodable)]
349pub struct AttrTokenStream(pub Arc<Vec<AttrTokenTree>>);
350
351fn make_attr_token_stream(
355 iter: impl Iterator<Item = FlatToken>,
356 break_last_token: u32,
357) -> AttrTokenStream {
358 #[derive(#[automatically_derived]
impl ::core::fmt::Debug for FrameData {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "FrameData",
"open_delim_sp", &self.open_delim_sp, "inner", &&self.inner)
}
}Debug)]
359 struct FrameData {
360 open_delim_sp: Option<(Delimiter, Span, Spacing)>,
362 inner: Vec<AttrTokenTree>,
363 }
364 let mut stack_top = FrameData { open_delim_sp: None, inner: ::alloc::vec::Vec::new()vec![] };
366 let mut stack_rest = ::alloc::vec::Vec::new()vec![];
367 for flat_token in iter {
368 match flat_token {
369 FlatToken::Token((token @ Token { kind, span }, spacing)) => {
370 if let Some(delim) = kind.open_delim() {
371 stack_rest.push(mem::replace(
372 &mut stack_top,
373 FrameData { open_delim_sp: Some((delim, span, spacing)), inner: ::alloc::vec::Vec::new()vec![] },
374 ));
375 } else if let Some(delim) = kind.close_delim() {
376 let Some(frame) = stack_rest.pop() else {
380 return AttrTokenStream::new(stack_top.inner);
381 };
382 let frame_data = mem::replace(&mut stack_top, frame);
383 let (open_delim, open_sp, open_spacing) = frame_data.open_delim_sp.unwrap();
384 if !open_delim.eq_ignoring_invisible_origin(&delim) {
{
::core::panicking::panic_fmt(format_args!("Mismatched open/close delims: open={0:?} close={1:?}",
open_delim, span));
}
};assert!(
385 open_delim.eq_ignoring_invisible_origin(&delim),
386 "Mismatched open/close delims: open={open_delim:?} close={span:?}"
387 );
388 let dspan = DelimSpan::from_pair(open_sp, span);
389 let dspacing = DelimSpacing::new(open_spacing, spacing);
390 let stream = AttrTokenStream::new(frame_data.inner);
391 let delimited = AttrTokenTree::Delimited(dspan, dspacing, delim, stream);
392 stack_top.inner.push(delimited);
393 } else {
394 stack_top.inner.push(AttrTokenTree::Token(token, spacing))
395 }
396 }
397 FlatToken::AttrsTarget(target) => {
398 stack_top.inner.push(AttrTokenTree::AttrsTarget(target))
399 }
400 FlatToken::Empty => {}
401 }
402 }
403
404 if break_last_token > 0 {
405 let last_token = stack_top.inner.pop().unwrap();
406 if let AttrTokenTree::Token(last_token, spacing) = last_token {
407 let (unglued, _) = last_token.kind.break_two_token_op(break_last_token).unwrap();
408
409 let mut first_span = last_token.span.shrink_to_lo();
411 first_span =
412 first_span.with_hi(first_span.lo() + rustc_span::BytePos(break_last_token));
413
414 stack_top.inner.push(AttrTokenTree::Token(Token::new(unglued, first_span), spacing));
415 } else {
416 {
::core::panicking::panic_fmt(format_args!("Unexpected last token {0:?}",
last_token));
}panic!("Unexpected last token {last_token:?}")
417 }
418 }
419 AttrTokenStream::new(stack_top.inner)
420}
421
422#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrTokenTree {
#[inline]
fn clone(&self) -> AttrTokenTree {
match self {
AttrTokenTree::Token(__self_0, __self_1) =>
AttrTokenTree::Token(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
AttrTokenTree::Delimited(__self_0, __self_1, __self_2, __self_3)
=>
AttrTokenTree::Delimited(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2),
::core::clone::Clone::clone(__self_3)),
AttrTokenTree::AttrsTarget(__self_0) =>
AttrTokenTree::AttrsTarget(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AttrTokenTree {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
AttrTokenTree::Token(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Token",
__self_0, &__self_1),
AttrTokenTree::Delimited(__self_0, __self_1, __self_2, __self_3)
=>
::core::fmt::Formatter::debug_tuple_field4_finish(f,
"Delimited", __self_0, __self_1, __self_2, &__self_3),
AttrTokenTree::AttrsTarget(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"AttrsTarget", &__self_0),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for AttrTokenTree {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
AttrTokenTree::Token(ref __binding_0, ref __binding_1) => {
0usize
}
AttrTokenTree::Delimited(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
1usize
}
AttrTokenTree::AttrsTarget(ref __binding_0) => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
AttrTokenTree::Token(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
AttrTokenTree::Delimited(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
}
AttrTokenTree::AttrsTarget(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for AttrTokenTree {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
AttrTokenTree::Token(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
AttrTokenTree::Delimited(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
AttrTokenTree::AttrsTarget(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AttrTokenTree`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
424pub enum AttrTokenTree {
425 Token(Token, Spacing),
426 Delimited(DelimSpan, DelimSpacing, Delimiter, AttrTokenStream),
427 AttrsTarget(AttrsTarget),
431}
432
433impl AttrTokenStream {
434 pub fn new(tokens: Vec<AttrTokenTree>) -> AttrTokenStream {
435 AttrTokenStream(Arc::new(tokens))
436 }
437
438 pub fn to_token_trees(&self) -> Vec<TokenTree> {
443 let mut res = Vec::with_capacity(self.0.len());
444 for tree in self.0.iter() {
445 match tree {
446 AttrTokenTree::Token(inner, spacing) => {
447 res.push(TokenTree::Token(inner.clone(), *spacing));
448 }
449 AttrTokenTree::Delimited(span, spacing, delim, stream) => {
450 res.push(TokenTree::Delimited(
451 *span,
452 *spacing,
453 *delim,
454 TokenStream::new(stream.to_token_trees()),
455 ))
456 }
457 AttrTokenTree::AttrsTarget(target) => {
458 attrs_and_tokens_to_token_trees(&target.attrs, &target.tokens, &mut res);
459 }
460 }
461 }
462 res
463 }
464}
465
466fn attrs_and_tokens_to_token_trees(
475 attrs: &[Attribute],
476 target_tokens: &LazyAttrTokenStream,
477 res: &mut Vec<TokenTree>,
478) {
479 let idx = attrs.partition_point(|attr| #[allow(non_exhaustive_omitted_patterns)] match attr.style {
crate::AttrStyle::Outer => true,
_ => false,
}matches!(attr.style, crate::AttrStyle::Outer));
480 let (outer_attrs, inner_attrs) = attrs.split_at(idx);
481
482 for attr in outer_attrs {
484 res.extend(attr.token_trees());
485 }
486
487 res.extend(target_tokens.to_attr_token_stream().to_token_trees());
489
490 if !inner_attrs.is_empty() {
492 let found = insert_inner_attrs(inner_attrs, res);
493 if !found {
{
::core::panicking::panic_fmt(format_args!("Failed to find trailing delimited group in: {0:?}",
res));
}
};assert!(found, "Failed to find trailing delimited group in: {res:?}");
494 }
495
496 fn insert_inner_attrs(inner_attrs: &[Attribute], tts: &mut Vec<TokenTree>) -> bool {
510 for tree in tts.iter_mut().rev() {
511 if let TokenTree::Delimited(span, spacing, Delimiter::Brace, stream) = tree {
512 let mut tts = ::alloc::vec::Vec::new()vec![];
514 for inner_attr in inner_attrs {
515 tts.extend(inner_attr.token_trees());
516 }
517 tts.extend(stream.0.iter().cloned());
518 let stream = TokenStream::new(tts);
519 *tree = TokenTree::Delimited(*span, *spacing, Delimiter::Brace, stream);
520 return true;
521 } else if let TokenTree::Delimited(span, spacing, Delimiter::Invisible(src), stream) =
522 tree
523 {
524 let mut vec: Vec<_> = stream.iter().cloned().collect();
526 if insert_inner_attrs(inner_attrs, &mut vec) {
527 *tree = TokenTree::Delimited(
528 *span,
529 *spacing,
530 Delimiter::Invisible(*src),
531 TokenStream::new(vec),
532 );
533 return true;
534 }
535 }
536 }
537 false
538 }
539}
540
541#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrsTarget {
#[inline]
fn clone(&self) -> AttrsTarget {
AttrsTarget {
attrs: ::core::clone::Clone::clone(&self.attrs),
tokens: ::core::clone::Clone::clone(&self.tokens),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AttrsTarget {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "AttrsTarget",
"attrs", &self.attrs, "tokens", &&self.tokens)
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for AttrsTarget {
fn encode(&self, __encoder: &mut __E) {
match *self {
AttrsTarget {
attrs: ref __binding_0, tokens: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for AttrsTarget {
fn decode(__decoder: &mut __D) -> Self {
AttrsTarget {
attrs: ::rustc_serialize::Decodable::decode(__decoder),
tokens: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
554pub struct AttrsTarget {
555 pub attrs: AttrVec,
558 pub tokens: LazyAttrTokenStream,
561}
562
563#[derive(#[automatically_derived]
impl ::core::clone::Clone for Spacing {
#[inline]
fn clone(&self) -> Spacing { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Spacing { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Spacing {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
Spacing::Alone => "Alone",
Spacing::Joint => "Joint",
Spacing::JointHidden => "JointHidden",
})
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for Spacing {
#[inline]
fn eq(&self, other: &Spacing) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Spacing {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Spacing {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Spacing {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Spacing::Alone => { 0usize }
Spacing::Joint => { 1usize }
Spacing::JointHidden => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Spacing::Alone => {}
Spacing::Joint => {}
Spacing::JointHidden => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Spacing {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Spacing::Alone }
1usize => { Spacing::Joint }
2usize => { Spacing::JointHidden }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Spacing`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Spacing {
#[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 {
Spacing::Alone => {}
Spacing::Joint => {}
Spacing::JointHidden => {}
}
}
}
};StableHash)]
568pub enum Spacing {
569 Alone,
585
586 Joint,
599
600 JointHidden,
621}
622
623#[derive(#[automatically_derived]
impl ::core::clone::Clone for TokenStream {
#[inline]
fn clone(&self) -> TokenStream {
TokenStream(::core::clone::Clone::clone(&self.0))
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TokenStream {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "TokenStream",
&&self.0)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for TokenStream {
#[inline]
fn default() -> TokenStream {
TokenStream(::core::default::Default::default())
}
}Default, #[automatically_derived]
impl ::core::cmp::PartialEq for TokenStream {
#[inline]
fn eq(&self, other: &TokenStream) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TokenStream {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Arc<Vec<TokenTree>>>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for TokenStream {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for TokenStream {
fn encode(&self, __encoder: &mut __E) {
match *self {
TokenStream(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for TokenStream {
fn decode(__decoder: &mut __D) -> Self {
TokenStream(::rustc_serialize::Decodable::decode(__decoder))
}
}
};Decodable)]
625pub struct TokenStream(Arc<Vec<TokenTree>>);
626
627impl TokenStream {
628 pub fn new(tts: Vec<TokenTree>) -> TokenStream {
629 TokenStream(Arc::new(tts))
630 }
631
632 pub fn is_empty(&self) -> bool {
633 self.0.is_empty()
634 }
635
636 pub fn len(&self) -> usize {
637 self.0.len()
638 }
639
640 pub fn get(&self, index: usize) -> Option<&TokenTree> {
641 self.0.get(index)
642 }
643
644 pub fn iter(&self) -> TokenStreamIter<'_> {
645 TokenStreamIter::new(self)
646 }
647
648 pub fn token_alone(kind: TokenKind, span: Span) -> TokenStream {
653 TokenStream::new(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[TokenTree::token_alone(kind, span)]))vec![TokenTree::token_alone(kind, span)])
654 }
655
656 pub fn from_ast(node: &(impl HasTokens + fmt::Debug)) -> TokenStream {
657 let tokens = node.tokens().unwrap_or_else(|| {
::core::panicking::panic_fmt(format_args!("missing tokens for node: {0:?}",
node));
}panic!("missing tokens for node: {:?}", node));
658 let mut tts = ::alloc::vec::Vec::new()vec![];
659 attrs_and_tokens_to_token_trees(node.attrs(), tokens, &mut tts);
660 TokenStream::new(tts)
661 }
662
663 fn try_glue_to_last(vec: &mut [TokenTree], tt: &TokenTree) -> bool {
666 if let Some(TokenTree::Token(last_tok, Spacing::Joint | Spacing::JointHidden)) = vec.last()
667 && let TokenTree::Token(tok, spacing) = tt
668 && let Some(glued_tok) = last_tok.glue(tok)
669 {
670 *vec.last_mut().unwrap() = TokenTree::Token(glued_tok, *spacing);
672 true
673 } else {
674 false
675 }
676 }
677
678 pub fn push_tree_with_gluing(&mut self, tt: TokenTree) {
685 let vec_mut = Arc::make_mut(&mut self.0);
686
687 if Self::try_glue_to_last(vec_mut, &tt) {
688 } else {
690 vec_mut.push(tt);
691 }
692 }
693
694 pub fn push_stream_with_gluing(&mut self, stream: TokenStream) {
702 let vec_mut = Arc::make_mut(&mut self.0);
703
704 let stream_iter = stream.0.iter().cloned();
705
706 if let Some(first) = stream.0.first()
707 && Self::try_glue_to_last(vec_mut, first)
708 {
709 vec_mut.extend(stream_iter.skip(1));
711 } else {
712 vec_mut.extend(stream_iter);
714 }
715 }
716
717 pub fn desugar_doc_comments(&mut self) {
721 if let Some(desugared_stream) = desugar_inner(self.clone()) {
722 *self = desugared_stream;
723 }
724
725 fn desugar_inner(mut stream: TokenStream) -> Option<TokenStream> {
727 let mut i = 0;
728 let mut modified = false;
729 while let Some(tt) = stream.0.get(i) {
730 match tt {
731 &TokenTree::Token(
732 Token { kind: token::DocComment(_, attr_style, data), span },
733 _spacing,
734 ) => {
735 let desugared = desugared_tts(attr_style, data, span);
736 let desugared_len = desugared.len();
737 Arc::make_mut(&mut stream.0).splice(i..i + 1, desugared);
738 modified = true;
739 i += desugared_len;
740 }
741
742 &TokenTree::Token(..) => i += 1,
743
744 &TokenTree::Delimited(sp, spacing, delim, ref delim_stream) => {
745 if let Some(desugared_delim_stream) = desugar_inner(delim_stream.clone()) {
746 let new_tt =
747 TokenTree::Delimited(sp, spacing, delim, desugared_delim_stream);
748 Arc::make_mut(&mut stream.0)[i] = new_tt;
749 modified = true;
750 }
751 i += 1;
752 }
753 }
754 }
755 if modified { Some(stream) } else { None }
756 }
757
758 fn desugared_tts(attr_style: AttrStyle, data: Symbol, span: Span) -> Vec<TokenTree> {
759 let mut num_of_hashes = 0;
765 let mut count = 0;
766 for ch in data.as_str().chars() {
767 count = match ch {
768 '"' => 1,
769 '#' if count > 0 => count + 1,
770 _ => 0,
771 };
772 num_of_hashes = cmp::max(num_of_hashes, count);
773 }
774
775 let delim_span = DelimSpan::from_single(span);
777 let body = TokenTree::Delimited(
778 delim_span,
779 DelimSpacing::new(Spacing::JointHidden, Spacing::Alone),
780 Delimiter::Bracket,
781 [
782 TokenTree::token_alone(token::Ident(sym::doc, token::IdentIsRaw::No), span),
783 TokenTree::token_alone(token::Eq, span),
784 TokenTree::token_alone(
785 TokenKind::lit(token::StrRaw(num_of_hashes), data, None),
786 span,
787 ),
788 ]
789 .into_iter()
790 .collect::<TokenStream>(),
791 );
792
793 if attr_style == AttrStyle::Inner {
794 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[TokenTree::token_joint(token::Pound, span),
TokenTree::token_joint_hidden(token::Bang, span), body]))vec![
795 TokenTree::token_joint(token::Pound, span),
796 TokenTree::token_joint_hidden(token::Bang, span),
797 body,
798 ]
799 } else {
800 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[TokenTree::token_joint_hidden(token::Pound, span), body]))vec![TokenTree::token_joint_hidden(token::Pound, span), body]
801 }
802 }
803 }
804
805 pub fn add_comma(&self) -> Option<(TokenStream, Span)> {
808 let mut suggestion = None;
810 let mut iter = self.0.iter().enumerate().peekable();
811 while let Some((pos, ts)) = iter.next() {
812 if let Some((_, next)) = iter.peek() {
813 let sp = match (&ts, &next) {
814 (_, TokenTree::Token(Token { kind: token::Comma, .. }, _)) => continue,
815 (
816 TokenTree::Token(token_left, Spacing::Alone),
817 TokenTree::Token(token_right, _),
818 ) if (token_left.is_non_reserved_ident() || token_left.is_lit())
819 && (token_right.is_non_reserved_ident() || token_right.is_lit()) =>
820 {
821 token_left.span
822 }
823 (TokenTree::Delimited(sp, ..), _) => sp.entire(),
824 _ => continue,
825 };
826 let sp = sp.shrink_to_hi();
827 let comma = TokenTree::token_alone(token::Comma, sp);
828 suggestion = Some((pos, comma, sp));
829 }
830 }
831 if let Some((pos, comma, sp)) = suggestion {
832 let mut new_stream = Vec::with_capacity(self.0.len() + 1);
833 let parts = self.0.split_at(pos + 1);
834 new_stream.extend_from_slice(parts.0);
835 new_stream.push(comma);
836 new_stream.extend_from_slice(parts.1);
837 return Some((TokenStream::new(new_stream), sp));
838 }
839 None
840 }
841}
842
843impl FromIterator<TokenTree> for TokenStream {
844 fn from_iter<I: IntoIterator<Item = TokenTree>>(iter: I) -> Self {
845 TokenStream::new(iter.into_iter().collect::<Vec<TokenTree>>())
846 }
847}
848
849impl StableHash for TokenStream {
850 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
851 self.0.as_slice().stable_hash(hcx, hasher);
852 }
853}
854
855#[derive(#[automatically_derived]
impl<'t> ::core::clone::Clone for TokenStreamIter<'t> {
#[inline]
fn clone(&self) -> TokenStreamIter<'t> {
TokenStreamIter(::core::clone::Clone::clone(&self.0))
}
}Clone)]
856pub struct TokenStreamIter<'t>(std::slice::Iter<'t, TokenTree>);
857
858impl<'t> TokenStreamIter<'t> {
859 fn new(stream: &'t TokenStream) -> Self {
860 TokenStreamIter(stream.0.as_slice().iter())
861 }
862
863 pub fn peek(&self) -> Option<&'t TokenTree> {
867 self.0.as_slice().first()
868 }
869}
870
871impl<'t> Iterator for TokenStreamIter<'t> {
872 type Item = &'t TokenTree;
873
874 fn next(&mut self) -> Option<&'t TokenTree> {
875 self.0.next()
876 }
877
878 fn size_hint(&self) -> (usize, Option<usize>) {
879 self.0.size_hint()
880 }
881}
882
883#[derive(#[automatically_derived]
impl ::core::clone::Clone for TokenTreeCursor {
#[inline]
fn clone(&self) -> TokenTreeCursor {
TokenTreeCursor {
stream: ::core::clone::Clone::clone(&self.stream),
index: ::core::clone::Clone::clone(&self.index),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TokenTreeCursor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TokenTreeCursor", "stream", &self.stream, "index", &&self.index)
}
}Debug)]
884struct TokenTreeCursor {
885 stream: TokenStream,
886 index: usize,
890}
891
892impl TokenTreeCursor {
893 #[inline]
894 fn new(stream: TokenStream) -> Self {
895 TokenTreeCursor { stream, index: 0 }
896 }
897
898 #[inline]
899 fn curr(&self) -> Option<&TokenTree> {
900 self.stream.get(self.index)
901 }
902
903 fn look_ahead(&self, n: usize) -> Option<&TokenTree> {
904 self.stream.get(self.index + n)
905 }
906
907 #[inline]
908 fn bump(&mut self) {
909 self.index += 1;
910 }
911
912 #[inline]
914 fn bump_to_end(&mut self) {
915 self.index = self.stream.len();
916 }
917}
918
919#[derive(#[automatically_derived]
impl ::core::clone::Clone for TokenCursor {
#[inline]
fn clone(&self) -> TokenCursor {
TokenCursor {
curr: ::core::clone::Clone::clone(&self.curr),
stack: ::core::clone::Clone::clone(&self.stack),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TokenCursor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "TokenCursor",
"curr", &self.curr, "stack", &&self.stack)
}
}Debug)]
924pub struct TokenCursor {
925 curr: TokenTreeCursor,
931
932 stack: Vec<TokenTreeCursor>,
935}
936
937impl TokenCursor {
938 #[inline]
939 pub fn new(stream: TokenStream) -> Self {
940 TokenCursor { curr: TokenTreeCursor::new(stream), stack: ::alloc::vec::Vec::new()vec![] }
941 }
942
943 pub fn next(&mut self) -> (Token, Spacing) {
944 self.inlined_next()
945 }
946
947 #[inline]
950 pub fn look_ahead(&self, n: usize) -> Option<&TokenTree> {
951 self.curr.look_ahead(n)
952 }
953
954 #[inline]
957 pub fn look_ahead_past_close_delim(&self) -> Option<&TokenTree> {
958 self.stack.last().unwrap().look_ahead(1)
959 }
960
961 #[inline]
964 pub fn clone_enclosing_delim(&self) -> TokenTree {
965 self.stack.last().unwrap().curr().unwrap().clone()
966 }
967
968 #[inline]
970 pub fn bump_to_end(&mut self) {
971 self.curr.bump_to_end()
972 }
973
974 #[inline]
976 pub fn depth(&self) -> usize {
977 self.stack.len()
978 }
979
980 #[inline]
982 pub fn parent_delim_and_span(&self) -> Option<(Delimiter, DelimSpan)> {
983 if let Some(last) = self.stack.last()
984 && let Some(TokenTree::Delimited(span, _, delim, _)) = last.curr()
985 {
986 Some((*delim, *span))
987 } else {
988 None
989 }
990 }
991
992 #[inline(always)]
994 pub fn inlined_next(&mut self) -> (Token, Spacing) {
995 loop {
996 if let Some(tree) = self.curr.curr() {
1000 match tree {
1001 &TokenTree::Token(token, spacing) => {
1002 if true {
if !!token.kind.is_delim() {
::core::panicking::panic("assertion failed: !token.kind.is_delim()")
};
};debug_assert!(!token.kind.is_delim());
1003 let res = (token, spacing);
1004 self.curr.bump();
1005 return res;
1006 }
1007 &TokenTree::Delimited(sp, spacing, delim, ref tts) => {
1008 let trees = TokenTreeCursor::new(tts.clone());
1009 self.stack.push(mem::replace(&mut self.curr, trees));
1010 if !delim.skip() {
1011 return (Token::new(delim.as_open_token_kind(), sp.open), spacing.open);
1012 }
1013 }
1015 };
1016 } else if let Some(parent) = self.stack.pop() {
1017 let Some(&TokenTree::Delimited(span, spacing, delim, _)) = parent.curr() else {
1019 { ::core::panicking::panic_fmt(format_args!("parent should be Delimited")); }panic!("parent should be Delimited")
1020 };
1021 self.curr = parent;
1022 self.curr.bump(); if !delim.skip() {
1024 return (Token::new(delim.as_close_token_kind(), span.close), spacing.close);
1025 }
1026 } else {
1028 return (Token::new(token::Eof, DUMMY_SP), Spacing::Alone);
1032 }
1033 }
1034 }
1035}
1036
1037#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DelimSpan {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "DelimSpan",
"open", &self.open, "close", &&self.close)
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for DelimSpan { }Copy, #[automatically_derived]
impl ::core::clone::Clone for DelimSpan {
#[inline]
fn clone(&self) -> DelimSpan {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for DelimSpan {
#[inline]
fn eq(&self, other: &DelimSpan) -> bool {
self.open == other.open && self.close == other.close
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DelimSpan {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Span>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for DelimSpan {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.open, state);
::core::hash::Hash::hash(&self.close, state)
}
}Hash)]
1038#[derive(const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for DelimSpan {
fn encode(&self, __encoder: &mut __E) {
match *self {
DelimSpan { open: ref __binding_0, close: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for DelimSpan {
fn decode(__decoder: &mut __D) -> Self {
DelimSpan {
open: ::rustc_serialize::Decodable::decode(__decoder),
close: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for DelimSpan {
#[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 {
DelimSpan { open: ref __binding_0, close: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for DelimSpan
where __V: crate::visit::Visitor<'__ast> {
fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
match *self {
DelimSpan { open: ref __binding_0, close: ref __binding_1 }
=> {
{
match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
__visitor, ())) {
core::ops::ControlFlow::Continue(()) =>
(),
#[allow(unreachable_code)]
core::ops::ControlFlow::Break(r) => {
return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
__visitor, ())) {
core::ops::ControlFlow::Continue(()) =>
(),
#[allow(unreachable_code)]
core::ops::ControlFlow::Break(r) => {
return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
}
}
impl<__V> crate::mut_visit::MutWalkable<__V> for DelimSpan where
__V: crate::mut_visit::MutVisitor {
fn walk_mut(&mut self, __visitor: &mut __V) {
match *self {
DelimSpan {
open: ref mut __binding_0, close: ref mut __binding_1 } => {
{
crate::mut_visit::MutVisitable::visit_mut(__binding_0,
__visitor, ())
}
{
crate::mut_visit::MutVisitable::visit_mut(__binding_1,
__visitor, ())
}
}
}
}
}
};Walkable)]
1039pub struct DelimSpan {
1040 pub open: Span,
1041 pub close: Span,
1042}
1043
1044impl DelimSpan {
1045 pub fn from_single(sp: Span) -> Self {
1046 DelimSpan { open: sp, close: sp }
1047 }
1048
1049 pub fn from_pair(open: Span, close: Span) -> Self {
1050 DelimSpan { open, close }
1051 }
1052
1053 pub fn dummy() -> Self {
1054 Self::from_single(DUMMY_SP)
1055 }
1056
1057 pub fn entire(self) -> Span {
1058 self.open.with_hi(self.close.hi())
1059 }
1060}
1061
1062#[derive(#[automatically_derived]
impl ::core::marker::Copy for DelimSpacing { }Copy, #[automatically_derived]
impl ::core::clone::Clone for DelimSpacing {
#[inline]
fn clone(&self) -> DelimSpacing {
let _: ::core::clone::AssertParamIsClone<Spacing>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for DelimSpacing {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "DelimSpacing",
"open", &self.open, "close", &&self.close)
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for DelimSpacing {
#[inline]
fn eq(&self, other: &DelimSpacing) -> bool {
self.open == other.open && self.close == other.close
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DelimSpacing {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Spacing>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for DelimSpacing {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.open, state);
::core::hash::Hash::hash(&self.close, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for DelimSpacing {
fn encode(&self, __encoder: &mut __E) {
match *self {
DelimSpacing { open: ref __binding_0, close: ref __binding_1
} => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for DelimSpacing {
fn decode(__decoder: &mut __D) -> Self {
DelimSpacing {
open: ::rustc_serialize::Decodable::decode(__decoder),
close: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for DelimSpacing
{
#[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 {
DelimSpacing { open: ref __binding_0, close: ref __binding_1
} => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1063pub struct DelimSpacing {
1064 pub open: Spacing,
1065 pub close: Spacing,
1066}
1067
1068impl DelimSpacing {
1069 pub fn new(open: Spacing, close: Spacing) -> DelimSpacing {
1070 DelimSpacing { open, close }
1071 }
1072}
1073
1074#[cfg(target_pointer_width = "64")]
1076mod size_asserts {
1077 use rustc_data_structures::static_assert_size;
1078
1079 use super::*;
1080 const _: [(); 8] = [(); ::std::mem::size_of::<AttrTokenStream>()];static_assert_size!(AttrTokenStream, 8);
1082 const _: [(); 32] = [(); ::std::mem::size_of::<AttrTokenTree>()];static_assert_size!(AttrTokenTree, 32);
1083 const _: [(); 8] = [(); ::std::mem::size_of::<LazyAttrTokenStream>()];static_assert_size!(LazyAttrTokenStream, 8);
1084 const _: [(); 88] = [(); ::std::mem::size_of::<LazyAttrTokenStreamInner>()];static_assert_size!(LazyAttrTokenStreamInner, 88);
1085 const _: [(); 8] = [(); ::std::mem::size_of::<Option<LazyAttrTokenStream>>()];static_assert_size!(Option<LazyAttrTokenStream>, 8); const _: [(); 8] = [(); ::std::mem::size_of::<TokenStream>()];static_assert_size!(TokenStream, 8);
1087 const _: [(); 32] = [(); ::std::mem::size_of::<TokenTree>()];static_assert_size!(TokenTree, 32);
1088 }