1use proc_macro2::token_stream::IntoIter;
2use proc_macro2::{Delimiter, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
3
4#[macro_export]
5macro_rules! join_ts {
6 ($iter:expr) => {
7 {
8 #[allow(unused_mut)]
9 let mut tb = TokenBuilder::new();
10 for part in $iter {
11 tb.extend(part);
12 }
13 tb.end()
14 }
15 };
16 ($iter:expr, separator: $sep:expr) => {
17 {
18 #[allow(unused_mut)]
19 let mut tb = TokenBuilder::new();
20 let mut add_sep = false;
21 for part in $iter {
22 if add_sep {
23 $sep.add_to(&mut tb);
24 }
25 tb.extend(part);
26 add_sep = true;
27 }
28 tb.end()
29 }
30 };
31 ($iter:expr, $part_pat:pat, $($part:expr) *) => {
32 {
33 #[allow(unused_mut)]
34 let mut tb = TokenBuilder::new();
35 for $part_pat in $iter {
36 extend_ts!(&mut tb,
37 $($part) *
38 );
39 }
40 tb.end()
41 }
42 };
43 ($iter:expr, $part_pat:pat, $($part:expr) *, separator: $sep:expr) => {
44 {
45 #[allow(unused_mut)]
46 let mut tb = TokenBuilder::new();
47 let mut add_sep = false;
48 for $part_pat in $iter {
49 if add_sep {
50 $sep.add_to(&mut tb);
51 }
52 extend_ts!(&mut tb,
53 $($part) *
54 );
55 add_sep = true;
56 }
57 tb.end()
58 }
59 };
60}
61
62#[macro_export]
63macro_rules! extend_ts {
64 ($tb:expr, $($part:expr) *) => {
65 {
66 $(
67 $part.add_to($tb);
68 )*
69 }
70 };
71}
72
73#[macro_export]
74macro_rules! ts {
75 ($($part:expr) *) => {
76 {
77 #[allow(unused_mut)]
78 let mut tb = TokenBuilder::new();
79 $(
80 $part.add_to(&mut tb);
81 )*
82 tb.end()
83 }
84 };
85}
86
87#[macro_export]
88macro_rules! ident {
89 ($($x:expr) *) => {{
90 let mut s = String::new();
91 $(
92 s.push_str(&$x.to_string());
93 )*
94 Ident::new(&s, Span::call_site())
95 }};
96}
97
98use crate::token_builder::*;
99
100pub struct TokenParser {
101 backtracked: Option<Box<TokenParser>>,
102 iter_stack: Vec<IntoIter>,
103 current: Option<TokenTree>,
104}
105
106fn token_tree_as_punct(tt: &TokenTree, what: char) -> Option<Punct> {
107 if let TokenTree::Punct(p) = tt {
108 if p.as_char() == what {
109 Some(p.clone())
110 } else {
111 None
112 }
113 } else {
114 None
115 }
116}
117
118fn token_tree_as_ident(tt: &TokenTree, what: &str) -> Option<Ident> {
119 if let TokenTree::Ident(i) = tt {
120 if i.to_string() == what {
121 Some(i.clone())
122 } else {
123 None
124 }
125 } else {
126 None
127 }
128}
129
130#[derive(Clone, Copy)]
131pub enum StructKind {
132 Struct,
133 Tuple,
134}
135impl StructKind {
136 pub fn open(&self) -> &'static str {
137 match self {
138 StructKind::Struct => "{",
139 StructKind::Tuple => "(",
140 }
141 }
142 pub fn close(&self) -> &str {
143 match self {
144 StructKind::Struct => "}",
145 StructKind::Tuple => ")",
146 }
147 }
148}
149
150#[derive(Clone)]
151pub enum StructFieldIdentifier {
152 Named(Ident),
153 Position(usize),
154}
155impl Default for StructFieldIdentifier {
156 fn default() -> Self {
157 Self::Position(0)
158 }
159}
160
161#[derive(Clone)]
162pub struct Struct {
163 pub attributes: Vec<TokenStream>,
164 pub visibility: TokenStream,
165 pub ident: Ident,
166 pub generics: Generics,
167 pub kind: Option<StructKind>,
168 pub where_clause: Option<WhereClause>,
169 pub struct_fields: Vec<StructField>,
170}
171#[derive(Clone)]
172pub struct StructField {
173 pub attributes: Vec<TokenStream>,
174 pub visibility: TokenStream,
175 pub identifier: StructFieldIdentifier,
176 pub ty: Ty,
177}
178impl StructField {
179 pub fn access(&self) -> TokenStream {
180 match &self.identifier {
181 StructFieldIdentifier::Named(x) => ts!(x),
182 StructFieldIdentifier::Position(i) => ts!(i),
183 }
184 }
185
186 pub fn safe_ident(&self) -> Ident {
187 match &self.identifier {
188 StructFieldIdentifier::Named(x) => x.clone(),
189 StructFieldIdentifier::Position(i) => ident!("_" i),
190 }
191 }
192 pub fn expr_field(&self, rhs: TokenStream) -> TokenStream {
193 match &self.identifier {
194 StructFieldIdentifier::Named(x) => ts!(x ":" rhs),
195 StructFieldIdentifier::Position(_) => rhs,
196 }
197 }
198}
199#[derive(Clone)]
200pub struct Enum {
201 pub attributes: Vec<TokenStream>,
202 pub visibility: TokenStream,
203 pub ident: Ident,
204 pub generics: Generics,
205 pub where_clause: Option<WhereClause>,
206 pub items: Vec<EnumItem>,
207}
208#[derive(Clone)]
209pub struct EnumItem {
210 pub attributes: Vec<TokenStream>,
211 pub ident: Ident,
212 pub data: Option<EnumItemData>,
213}
214impl EnumItem {
215 pub fn get_struct_data(&self) -> Option<(StructKind, &[StructField])> {
216 match &self.data {
217 None | Some(EnumItemData::Discriminant(_)) => None,
218 Some(EnumItemData::Struct(kind, fields)) => Some((*kind, fields)),
219 }
220 }
221
222 pub fn pattern_match(&self, enum_ident: &Ident, binding_append: Option<Ident>) -> TokenStream {
223 match &self.data {
224 Some(EnumItemData::Struct(kind, fields)) => ts!(
225 enum_ident "::" self.ident
226 kind.open()
227 join_ts!(fields.iter(), field,
228 match &field.identifier {
229 StructFieldIdentifier::Named(x) => {
230 ts!(x ":")
231 }
232 StructFieldIdentifier::Position(_) => {
233 ts!("")
234 }
235 }
236 if let Some(binding_append) = &binding_append {
237 ident!(field.safe_ident() binding_append)
238 } else {
239 field.safe_ident()
240 }
241 , separator: ",")
242 kind.close()
243 ),
244 None | Some(EnumItemData::Discriminant(_)) => ts!(enum_ident "::" self.ident),
245 }
246 }
247}
248#[derive(Clone)]
249pub enum EnumItemData {
250 Discriminant(TokenTree),
251 Struct(StructKind, Vec<StructField>),
252}
253#[derive(Clone)]
254pub struct LifetimeParam {
255 pub ident: TokenStream,
256 pub bounds: Option<TokenStream>,
257}
258#[derive(Clone, Default)]
259pub struct TypeParam {
260 pub attributes: Vec<TokenStream>,
261 pub type_ident: TokenStream,
262 pub bounds: Option<TokenStream>,
263 pub equal_ty: Option<Ty>,
264}
265#[derive(Clone, Default)]
266pub struct Generics {
267 pub lifetime_params: Vec<LifetimeParam>,
268 pub type_params: Vec<TypeParam>,
269}
270#[derive(Clone)]
271pub struct WhereClauseItem {
272 pub for_lifetimes: Option<TokenStream>,
273 pub lhs: TokenStream,
274 pub rhs: TokenStream,
275}
276#[derive(Clone, Default)]
277pub struct WhereClause {
278 pub items: Vec<WhereClauseItem>,
279}
280#[derive(Clone)]
281pub struct Function {
282 pub attributes: Vec<TokenStream>,
283 pub visibility: TokenStream,
284 pub ident: Ident,
285 pub qualifiers: FunctionQualifiers,
286 pub generics: Generics,
287 pub parameters: Vec<FunctionParameter>,
288 pub return_ty: Option<Ty>,
289 pub where_clause: Option<WhereClause>,
290}
291#[derive(Clone, Default)]
292pub struct FunctionQualifiers {
293 pub async_or_const: Option<AsyncOrConst>,
294 pub unsafe_: bool,
295 pub extern_abi: Option<TokenStream>,
296}
297#[derive(Clone)]
298pub enum AsyncOrConst {
299 Async,
300 Const,
301}
302#[derive(Clone)]
303pub struct FunctionParameter {
304 pub attributes: Vec<TokenStream>,
305 pub pattern: TokenStream,
306 pub ty: Ty,
307}
308#[derive(Clone)]
309pub struct RefTy {
310 pub mutable: bool,
311 pub lifetime: Option<TokenStream>,
312 pub rest: Ty,
313}
314#[derive(Clone)]
315pub struct Ty {
316 pub stream: TokenStream,
317 pub kind: TyKind,
318}
319#[derive(Clone)]
320pub enum TyKind {
321 Ref(Box<RefTy>),
322 Other,
323}
324
325impl TokenBuilderExtend for Ty {
326 fn add_to(&self, tb: &mut TokenBuilder) {
327 self.stream.add_to(tb)
328 }
329}
330
331impl TokenBuilderExtend for AsyncOrConst {
332 fn add_to(&self, tb: &mut TokenBuilder) {
333 match self {
334 AsyncOrConst::Async => tb.extend(&ident!("async")),
335 AsyncOrConst::Const => tb.extend(&ident!("const")),
336 }
337 }
338}
339impl TokenBuilderExtend for FunctionParameter {
340 fn add_to(&self, tb: &mut TokenBuilder) {
341 extend_ts!(tb,
342 self.attributes self.pattern ":" self.ty
343 )
344 }
345}
346impl TokenBuilderExtend for FunctionQualifiers {
347 fn add_to(&self, tb: &mut TokenBuilder) {
348 extend_ts!(tb,
349 self.async_or_const if self.unsafe_ { ts!("unsafe") } else { ts!() } self.extern_abi
350 )
351 }
352}
353impl TokenBuilderExtend for Function {
354 fn add_to(&self, tb: &mut TokenBuilder) {
355 extend_ts!(tb,
356 self.attributes self.visibility self.qualifiers
357 "fn" self.ident self.generics "(" self.parameters ")"
358 if let Some(return_ty) = &self.return_ty {
359 ts!("->" return_ty)
360 } else {
361 ts!()
362 }
363 self.where_clause
364 )
365 }
366}
367
368impl Generics {
369 pub fn mutating_type_params(&self, mutate: impl Fn(&mut TypeParam)) -> Self {
370 let mut cloned = self.clone();
371 for lt in cloned.type_params.iter_mut() {
372 mutate(lt)
373 }
374 cloned
375 }
376}
377impl TokenBuilderExtend for Enum {
378 fn add_to(&self, tb: &mut TokenBuilder) {
379 extend_ts!(tb,
380 self.visibility "enum" self.ident self.generics self.where_clause
381 "{"
382 join_ts!(&self.items, item,
383 item.attributes item.ident
384 match &item.data {
385 Some(EnumItemData::Struct(kind, fields)) => {
386 ts!(
387 kind.open()
388 join_ts!(fields, separator: ",")
389 kind.close()
390 )
391 }
392 Some(EnumItemData::Discriminant(discriminant)) => {
393 ts!("=" discriminant)
394 }
395 None => {
396 ts!()
397 }
398 }
399 , separator: ",")
400 "}"
401 )
402 }
403}
404impl TokenBuilderExtend for Struct {
405 fn add_to(&self, tb: &mut TokenBuilder) {
406 let (first_where_clause_slot, second_where_clause_slot) = if matches!(self.kind, Some(StructKind::Struct)) {
407 (ts!(self.where_clause), ts!())
408 } else {
409 (ts!(), ts!(self.where_clause))
410 };
411
412 extend_ts!(tb,
413 self.visibility "struct" self.ident self.generics
414 first_where_clause_slot
415 self.kind.as_ref().map(|k| k.open())
416 join_ts!(&self.struct_fields, separator: ",")
417 self.kind.as_ref().map(|k| k.close())
418 second_where_clause_slot
419 match self.kind {
420 Some(StructKind::Tuple) | None => ";",
421 _ => ""
422 }
423 )
424 }
425}
426impl TokenBuilderExtend for StructField {
427 fn add_to(&self, tb: &mut TokenBuilder) {
428 extend_ts!(tb,
429 self.attributes
430 self.visibility
431 match &self.identifier {
432 StructFieldIdentifier::Named(x) => ts!(x ":"),
433 StructFieldIdentifier::Position(_) => ts!()
434 }
435 self.ty
436 )
437 }
438}
439impl TokenBuilderExtend for LifetimeParam {
440 fn add_to(&self, tb: &mut TokenBuilder) {
441 extend_ts!(tb,
442 self.ident
443 self.bounds.as_ref().map(|x| ts!(":" x))
444 )
445 }
446}
447impl TokenBuilderExtend for TypeParam {
448 fn add_to(&self, tb: &mut TokenBuilder) {
449 extend_ts!(tb,
450 self.attributes
451 self.type_ident
452 self.bounds.as_ref().map(|x| ts!(":" x))
453 self.equal_ty.as_ref().map(|x| ts!("=" x))
454 )
455 }
456}
457impl TokenBuilderExtend for Generics {
458 fn add_to(&self, tb: &mut TokenBuilder) {
459 if self.lifetime_params.is_empty() && self.type_params.is_empty() {
460 } else {
461 extend_ts!(tb,
462 "<"
463 join_ts!(&self.lifetime_params, separator: ",")
464 if !self.lifetime_params.is_empty() { ts!(",") } else { ts!() }
465 join_ts!(&self.type_params, separator: ",")
466 ">"
467 )
468 }
469 }
470}
471impl Generics {
472 pub fn removing_eq_type(&self) -> Self {
473 let mut new = self.clone();
474 for type_param in new.type_params.iter_mut() {
475 type_param.equal_ty = None;
476 }
477 new
478 }
479 pub fn removing_bounds_and_eq_type(&self) -> Self {
480 let mut new = self.clone();
481 for lifetime_param in new.lifetime_params.iter_mut() {
482 lifetime_param.bounds = None;
483 }
484 for type_param in new.type_params.iter_mut() {
485 type_param.bounds = None;
486 type_param.equal_ty = None;
487 }
488 new
489 }
490}
491impl TokenBuilderExtend for WhereClauseItem {
492 fn add_to(&self, tb: &mut TokenBuilder) {
493 extend_ts!(tb,
494 self.for_lifetimes self.lhs ":" self.rhs
495 )
496 }
497}
498impl TokenBuilderExtend for WhereClause {
499 fn add_to(&self, tb: &mut TokenBuilder) {
500 extend_ts!(tb,
501 "where"
502 join_ts!(&self.items, separator: ",")
503 )
504 }
505}
506
507impl WhereClause {
508 pub fn add_clause_items(&mut self, items: TokenStream) {
509 let mut parser = TokenParser::new(items);
510 let mut items = Vec::new();
511 while let Some(clause_item) = parser.eat_where_clause_item() {
512 items.push(clause_item);
513 if let Some(_) = parser.eat_punct(',') {
514 continue;
515 } else {
516 break;
517 }
518 }
519 self.items.extend(items);
520 }
521}
522
523impl TokenParser {
524 pub fn eat_function(&mut self) -> Option<Function> {
525 let mut attributes = Vec::new();
526 while let Some(attribute) = self.eat_outer_attribute() {
527 attributes.push(attribute);
528 }
529 let visibility = self.eat_visibility();
530 let async_or_const = if self.eat_ident("async").is_some() {
531 Some(AsyncOrConst::Async)
532 } else if self.eat_ident("const").is_some() {
533 Some(AsyncOrConst::Const)
534 } else {
535 None
536 };
537 let unsafe_ = self.eat_ident("unsafe").is_some();
538 let extern_abi = if let Some(extern_) = self.eat_ident("extern") {
539 if let Some(literal) = self.eat_literal() {
540 Some(ts!(extern_ literal))
541 } else {
542 return None;
543 }
544 } else {
545 None
546 };
547 if self.eat_ident("fn").is_some() {
548 if let Some(ident) = self.eat_any_ident() {
549 let generics = self.eat_generics();
550 if let Some(TokenTree::Group(content)) = self.eat_group(Delimiter::Parenthesis) {
551 let mut content_parser = TokenParser::new(content.stream());
552 let mut parameters = Vec::new();
553 while let Some(parameter) = content_parser.eat_function_parameter() {
554 parameters.push(parameter);
555 let _ = content_parser.eat_punct(',');
556 }
557 let return_ty = if self.eat_punct('-').is_some() {
558 if self.eat_punct('>').is_some() {
559 if let Some(return_ty) = self.eat_type() {
560 Some(return_ty)
561 } else {
562 return None;
563 }
564 } else {
565 return None;
566 }
567 } else {
568 None
569 };
570 let where_clause = self.eat_where_clause();
571 return Some(Function {
572 attributes,
573 visibility,
574 ident,
575 generics,
576 qualifiers: FunctionQualifiers {
577 async_or_const,
578 unsafe_,
579 extern_abi,
580 },
581 parameters,
582 return_ty,
583 where_clause,
584 });
585 }
586 }
587 }
588 return None;
589 }
590
591 pub fn eat_function_parameter(&mut self) -> Option<FunctionParameter> {
592 let mut attributes = Vec::new();
593 while let Some(attribute) = self.eat_outer_attribute() {
594 attributes.push(attribute);
595 }
596 let mut pattern = TokenBuilder::new();
597 let mut empty_pattern = true;
598 while let Some(tt) = self.advance_if(|tt| match tt {
599 TokenTree::Punct(p) => {
600 if p.as_char() != ':' {
601 Some(tt.clone())
602 } else {
603 None
604 }
605 }
606 _ => Some(tt.clone()),
607 }) {
608 empty_pattern = false;
609 pattern.extend_tree(tt);
610 }
611 if empty_pattern {
612 return None;
613 }
614 self.eat_punct(':').unwrap();
615
616 if let Some(ty) = self.eat_type() {
617 Some(FunctionParameter {
618 attributes,
619 pattern: pattern.end(),
620 ty,
621 })
622 } else {
623 return None;
624 }
625 }
626
627 pub fn new(start: TokenStream) -> Self {
628 let mut ret = Self {
629 backtracked: None,
630 iter_stack: vec![start.into_iter()],
631 current: None,
632 };
633 ret.advance();
634 ret
635 }
636
637 pub fn backtrack(&mut self, ts: TokenStream) {
638 if !ts.is_empty() {
639 if let Some(backtracked) = &mut self.backtracked {
640 backtracked.backtrack(ts)
641 } else {
642 self.backtracked = Some(Box::new(TokenParser::new(ts)));
643 }
644 }
645 }
646
647 pub fn peek(&mut self) -> Option<&TokenTree> {
648 if let Some(backtracked) = &mut self.backtracked {
649 backtracked.peek()
650 } else {
651 self.current.as_ref()
652 }
653 }
654
655 pub fn advance(&mut self) {
656 if let Some(backtracked) = &mut self.backtracked {
657 backtracked.advance();
658 if backtracked.peek().is_none() {
659 self.backtracked = None;
660 }
661 return;
662 }
663 let last = self.iter_stack.last_mut().unwrap();
664 let value = last.next();
665
666 if let Some(tok) = value {
667 self.current = Some(tok);
668 } else {
669 self.current = None;
670 }
671 }
672
673 pub fn advance_if<T>(&mut self, cond: impl FnOnce(&TokenTree) -> Option<T>) -> Option<T> {
674 let value = self.peek();
675 if let Some(tok) = value {
676 if let Some(value) = cond(tok) {
677 self.advance();
678 Some(value)
679 } else {
680 None
681 }
682 } else {
683 None
684 }
685 }
686
687 pub fn open_delim(&mut self, delim: Delimiter) -> bool {
688 let iter = if let Some(TokenTree::Group(group)) = self.peek() {
689 if group.delimiter() == delim {
690 Some(group.stream().into_iter())
691 } else {
692 None
693 }
694 } else {
695 None
696 };
697
698 if let Some(iter) = iter {
699 self.iter_stack.push(iter);
700 self.advance();
701 true
702 } else {
703 false
704 }
705 }
706
707 pub fn open_brace(&mut self) -> bool {
708 self.open_delim(Delimiter::Brace)
709 }
710
711 pub fn open_paren(&mut self) -> bool {
712 self.open_delim(Delimiter::Parenthesis)
713 }
714
715 pub fn is_eot(&mut self) -> bool {
721 if self.current.is_none() && self.iter_stack.len() != 0 {
722 return true;
723 } else {
724 return false;
725 }
726 }
727
728 pub fn eat_eot(&mut self) -> bool {
729 if self.is_eot() {
731 self.iter_stack.pop();
732 if self.iter_stack.len() != 0 {
733 self.advance()
734 }
735 return true;
736 }
737 return false;
738 }
739
740 pub fn eat_ident(&mut self, what: &str) -> Option<Ident> {
741 self.advance_if(|tt| token_tree_as_ident(tt, what))
742 }
743
744 pub fn eat_punct_with_spacing(&mut self, what: char, spacing: Spacing) -> Option<Punct> {
755 self.advance_if(|tt| {
756 if let TokenTree::Punct(p) = tt {
757 if p.as_char() == what && p.spacing() == spacing {
758 Some(p.clone())
759 } else {
760 None
761 }
762 } else {
763 None
764 }
765 })
766 }
767
768 pub fn eat_punct(&mut self, what: char) -> Option<Punct> {
769 self.advance_if(|tt| token_tree_as_punct(tt, what))
770 }
771
772 pub fn eat_any_ident(&mut self) -> Option<Ident> {
773 self.advance_if(|tt| {
774 if let TokenTree::Ident(id) = tt {
775 Some(id.clone())
776 } else {
777 None
778 }
779 })
780 }
781
782 pub fn eat_literal(&mut self) -> Option<Literal> {
783 self.advance_if(|tt| {
784 if let TokenTree::Literal(l) = tt {
785 Some(l.clone())
786 } else {
787 None
788 }
789 })
790 }
791
792 pub fn eat_type_bound_where_clause_item(&mut self) -> Option<WhereClauseItem> {
793 let for_lifetimes = self.eat_for_lifetimes();
794 if let Some(ty) = self.eat_type() {
795 let lhs = ty;
796 if let Some(_) = self.eat_punct(':') {
797 let mut rhs = TokenBuilder::new();
798 if let Some(typbs) = self.eat_type_param_bounds() {
799 rhs.stream(typbs);
800 }
801 let rhs = rhs.end();
802 return Some(WhereClauseItem {
803 for_lifetimes,
804 lhs: lhs.stream,
805 rhs,
806 });
807 }
808 }
809 None
810 }
811
812 pub fn eat_lifetime_bounds(&mut self) -> Option<TokenStream> {
813 let mut tb = TokenBuilder::new();
814 while let Some(lt) = self.eat_lifetime() {
815 tb.stream(lt);
816 if let Some(plus) = self.eat_punct('+') {
817 tb.extend(&plus);
818 continue;
819 } else {
820 break;
821 }
822 }
823 Some(tb.end())
824 }
825
826 pub fn eat_lifetime_where_clause_item(&mut self) -> Option<WhereClauseItem> {
827 if let Some(lt) = self.eat_lifetime() {
828 let lhs = lt;
829 if let Some(_) = self.eat_punct(':') {
830 if let Some(lt_bounds) = self.eat_lifetime_bounds() {
831 let rhs = lt_bounds;
832
833 return Some(WhereClauseItem {
834 for_lifetimes: None,
835 lhs,
836 rhs,
837 });
838 }
839 }
840 }
841 None
842 }
843
844 pub fn eat_where_clause_item(&mut self) -> Option<WhereClauseItem> {
845 self.eat_lifetime_where_clause_item()
846 .or_else(|| self.eat_type_bound_where_clause_item())
847 }
848
849 pub fn eat_where_clause(&mut self) -> Option<WhereClause> {
850 if let Some(_) = self.eat_ident("where") {
851 let mut items = Vec::new();
852 while let Some(clause_item) = self.eat_where_clause_item() {
853 items.push(clause_item);
854 if let Some(_) = self.eat_punct(',') {
855 continue;
856 } else {
857 break;
858 }
859 }
860 Some(WhereClause { items })
861 } else {
862 None
863 }
864 }
865
866 pub fn eat_struct(&mut self) -> Option<Struct> {
867 let mut attributes = Vec::new();
868 while let Some(attr) = self.eat_outer_attribute() {
869 attributes.push(attr);
870 }
871 let visibility = self.eat_visibility();
872 if let Some(_) = self.eat_ident("struct") {
873 if let Some(ident) = self.eat_any_ident() {
874 let generics = self.eat_generics();
875 if self.open_paren() {
876 let struct_fields = self.eat_tuple_fields();
877
878 if self.eat_eot() {
879 let where_clause = self.eat_where_clause();
880 if let Some(_) = self.eat_punct(';') {
881 return Some(Struct {
882 attributes,
883 visibility,
884 ident,
885 generics,
886 kind: Some(StructKind::Tuple),
887 where_clause,
888 struct_fields,
889 });
890 }
891 }
892 } else {
893 let where_clause = self.eat_where_clause();
895 if self.open_brace() {
896 let struct_fields = self.eat_struct_fields();
897
898 if self.eat_eot() {
899 return Some(Struct {
900 attributes,
901 visibility,
902 ident,
903 generics,
904 kind: Some(StructKind::Struct),
905 where_clause,
906 struct_fields,
907 });
908 }
909 } else {
910 return Some(Struct {
911 attributes,
912 visibility,
913 ident,
914 generics,
915 kind: None,
916 where_clause,
917 struct_fields: vec![],
918 });
919 }
920 }
921 }
922 }
923 self.backtrack(visibility);
924 None
925 }
926
927 pub fn eat_enum_item(&mut self) -> Option<EnumItem> {
928 let mut attributes = Vec::new();
929 while let Some(attr) = self.eat_outer_attribute() {
930 attributes.push(attr);
931 }
932 let _ = self.eat_visibility();
933
934 if let Some(ident) = self.eat_any_ident() {
935 if self.open_paren() {
936 let struct_fields = self.eat_tuple_fields();
937 self.eat_eot();
938 Some(EnumItem {
939 attributes,
940 ident,
941 data: Some(EnumItemData::Struct(StructKind::Tuple, struct_fields)),
942 })
943 } else if self.open_brace() {
944 let struct_fields = self.eat_struct_fields();
945 self.eat_eot();
946 Some(EnumItem {
947 attributes,
948 ident,
949 data: Some(EnumItemData::Struct(StructKind::Struct, struct_fields)),
950 })
951 } else if let Some(_) = self.eat_punct('=') {
952 let expr: Option<TokenTree> = self
953 .eat_literal()
954 .map(TokenTree::Literal)
955 .or_else(|| self.eat_any_ident().map(TokenTree::Ident))
956 .or_else(|| self.eat_group(Delimiter::Brace))
957 .into();
958 if let Some(expr) = expr {
959 Some(EnumItem {
960 attributes,
961 ident,
962 data: Some(EnumItemData::Discriminant(expr)),
963 })
964 } else {
965 None
967 }
968 } else {
969 Some(EnumItem {
970 attributes,
971 ident,
972 data: None,
973 })
974 }
975 } else {
976 None
978 }
979 }
980
981 pub fn eat_enumeration(&mut self) -> Option<Enum> {
982 let mut attributes = Vec::new();
983 while let Some(attr) = self.eat_outer_attribute() {
984 attributes.push(attr);
985 }
986 let visibility = self.eat_visibility();
987
988 if let Some(_) = self.eat_ident("enum") {
989 if let Some(ident) = self.eat_any_ident() {
990 let generics = self.eat_generics();
991 let where_clause = self.eat_where_clause();
992 if self.open_brace() {
993 let mut items = Vec::new();
994 while let Some(item) = self.eat_enum_item() {
995 items.push(item);
996 if let Some(_) = self.eat_punct(',') {
997 } else {
998 break;
999 }
1000 }
1001 if self.eat_eot() {
1002 return Some(Enum {
1003 attributes,
1004 visibility,
1005 ident,
1006 generics,
1007 where_clause,
1008 items,
1009 });
1010 }
1011 }
1012 }
1013 }
1014 self.backtrack(visibility);
1015 return None;
1016 }
1017
1018 pub fn eat_lifetime_param(&mut self) -> Option<LifetimeParam> {
1019 let mut attributes = Vec::new();
1020 while let Some(outer_attribute) = self.eat_outer_attribute() {
1021 attributes.push(outer_attribute);
1022 }
1023 if let Some(ident) = self.eat_lifetime_or_label() {
1024 if let Some(_) = self.eat_punct(':') {
1025 if let Some(bounds) = self.eat_lifetime_bounds() {
1026 Some(LifetimeParam {
1027 ident,
1028 bounds: Some(bounds),
1029 })
1030 } else {
1031 None
1033 }
1034 } else {
1035 Some(LifetimeParam { ident, bounds: None })
1036 }
1037 } else {
1038 return None;
1040 }
1041 }
1042
1043 pub fn eat_type_param(&mut self) -> Option<TypeParam> {
1044 let mut attributes = Vec::new();
1045 while let Some(attr) = self.eat_outer_attribute() {
1046 attributes.push(attr);
1047 }
1048 if let Some(ident) = self.eat_any_ident() {
1049 let bounds = if let Some(_) = self.eat_punct(':') {
1050 if let Some(bounds) = self.eat_type_param_bounds() {
1051 Some(bounds)
1052 } else {
1053 return None;
1055 }
1056 } else {
1057 None
1058 };
1059 let equal_ty = if let Some(_) = self.eat_punct('=') {
1060 if let Some(ty) = self.eat_type() {
1061 Some(ty)
1062 } else {
1063 return None;
1065 }
1066 } else {
1067 None
1068 };
1069 Some(TypeParam {
1070 attributes,
1071 type_ident: TokenTree::Ident(ident).into(),
1072 bounds,
1073 equal_ty,
1074 })
1075 } else {
1076 None
1078 }
1079 }
1080
1081 pub fn eat_generics(&mut self) -> Generics {
1082 if let Some(_) = self.eat_punct('<') {
1083 let mut lifetime_params = Vec::new();
1084 while let Some(lt_param) = self.eat_lifetime_param() {
1085 lifetime_params.push(lt_param);
1086 if let Some(_) = self.eat_punct(',') {}
1087 }
1088 let mut type_params = Vec::new();
1089 while let Some(ty_param) = self.eat_type_param() {
1090 type_params.push(ty_param);
1091 if let Some(_) = self.eat_punct(',') {
1092 } else {
1093 break;
1094 }
1095 }
1096
1097 if let Some(_) = self.eat_punct('>') {
1098 return Generics {
1099 lifetime_params,
1100 type_params,
1101 };
1102 }
1103 }
1104 Generics {
1105 lifetime_params: Vec::new(),
1106 type_params: Vec::new(),
1107 }
1108 }
1109
1110 pub fn eat_tuple_fields(&mut self) -> Vec<StructField> {
1111 let mut i = 0;
1112 if let Some(field) = self.eat_tuple_field(i) {
1113 i += 1;
1114 let mut fields = Vec::new();
1115 fields.push(field);
1116 while let Some(_) = self.eat_punct(',') {
1117 if let Some(field) = self.eat_tuple_field(i) {
1118 i += 1;
1119 fields.push(field);
1120 } else {
1121 break;
1122 }
1123 }
1124 fields
1125 } else {
1126 Vec::new()
1127 }
1128 }
1129
1130 pub fn eat_tuple_field(&mut self, i: usize) -> Option<StructField> {
1131 let mut attributes = Vec::new();
1132 while let Some(attribute) = self.eat_outer_attribute() {
1133 attributes.push(attribute);
1134 }
1135 let visibility = self.eat_visibility();
1136 if let Some(ty) = self.eat_type() {
1137 Some(StructField {
1138 attributes,
1139 visibility,
1140 identifier: StructFieldIdentifier::Position(i),
1141 ty,
1142 })
1143 } else {
1144 None
1146 }
1147 }
1148
1149 pub fn eat_struct_fields(&mut self) -> Vec<StructField> {
1150 let mut fields = Vec::new();
1151 while let Some(field) = self.eat_struct_field() {
1152 fields.push(field);
1153 if let Some(_) = self.eat_punct(',') {
1154 } else {
1155 break;
1156 }
1157 }
1158 fields
1159 }
1160
1161 pub fn eat_struct_field(&mut self) -> Option<StructField> {
1162 let mut attributes = vec![];
1163 while let Some(outer_attribute) = self.eat_outer_attribute() {
1164 attributes.push(outer_attribute.clone());
1165 }
1166 let visibility = self.eat_visibility();
1167 if let Some(identifier) = self.eat_any_ident() {
1168 let _ = self.eat_punct(':');
1169 if let Some(ty) = self.eat_type() {
1170 Some(StructField {
1171 attributes,
1172 visibility,
1173 identifier: StructFieldIdentifier::Named(identifier),
1174 ty,
1175 })
1176 } else {
1177 None
1179 }
1180 } else {
1181 None
1183 }
1184 }
1185
1186 pub fn eat_group_angle_bracket(&mut self) -> Option<TokenStream> {
1187 let mut tb = TokenBuilder::new();
1188 if let Some(ob) = self.eat_punct('<') {
1191 tb.extend_tree(ob);
1192 let mut stack = 1;
1193 while stack > 0 {
1195 if let Some(start_arrow) = self.eat_punct_with_spacing('-', Spacing::Joint) {
1196 tb.extend_tree(start_arrow);
1197 if let Some(end_arrow) = self.eat_punct('>') {
1198 tb.extend_tree(end_arrow);
1199 }
1200 }
1201 if let Some(ob) = self.eat_punct('<') {
1202 tb.extend_tree(ob);
1203 stack += 1;
1204 }
1205 if let Some(cb) = self.eat_punct('>') {
1206 tb.extend_tree(cb);
1207 stack -= 1;
1208 } else if self.eat_eot() {
1209 return None;
1211 } else {
1212 if let Some(current) = self.peek() {
1214 tb.extend_tree(current.clone());
1215 }
1216 self.advance();
1217 }
1218 }
1219 return Some(tb.end());
1220 } else {
1221 return None;
1222 }
1223 }
1224
1225 pub fn eat_lifetime_or_label(&mut self) -> Option<TokenStream> {
1227 let mut tb = TokenBuilder::new();
1228 if let Some(ap) = self.eat_punct('\'') {
1229 tb.extend_tree(ap);
1230 if let Some(lifetime) = self.eat_any_ident() {
1231 tb.extend_tree(lifetime);
1232 } else {
1233 return None;
1235 }
1236 Some(tb.end())
1237 } else {
1238 None
1239 }
1240 }
1241
1242 pub fn eat_lifetime(&mut self) -> Option<TokenStream> {
1243 self.eat_lifetime_or_label().or_else(|| {
1244 let mut tb = TokenBuilder::new();
1245 if let Some(ap) = self.eat_punct_with_spacing('\'', Spacing::Joint) {
1246 tb.extend_tree(ap);
1247 if let Some(anon) = self.eat_punct_with_spacing('_', Spacing::Alone) {
1248 tb.extend_tree(anon);
1249 } else {
1250 return None;
1252 }
1253 Some(tb.end())
1254 } else {
1255 None
1256 }
1257 })
1258 }
1259
1260 pub fn eat_double_colon(&mut self) -> Option<TokenStream> {
1261 if let Some(c1) = self.eat_punct_with_spacing(':', Spacing::Joint) {
1262 let mut tb = TokenBuilder::new();
1263 tb.extend_tree(c1);
1264 if let Some(c2) = self.eat_punct_with_spacing(':', Spacing::Alone) {
1265 tb.extend_tree(c2);
1266 Some(tb.end())
1267 } else {
1268 self.backtrack(tb.end());
1269 None
1270 }
1271 } else {
1272 None
1273 }
1274 }
1275
1276 pub fn eat_fn_arrow(&mut self) -> Option<TokenStream> {
1277 if let Some(c1) = self.eat_punct_with_spacing('-', Spacing::Joint) {
1278 let mut tb = TokenBuilder::new();
1279 tb.extend_tree(c1);
1280 if let Some(c2) = self.eat_punct_with_spacing('>', Spacing::Alone) {
1281 tb.extend_tree(c2);
1282 Some(tb.end())
1283 } else {
1284 None
1286 }
1287 } else {
1288 None
1289 }
1290 }
1291
1292 pub fn eat_type_path_segment(&mut self) -> Option<TokenStream> {
1293 let mut tb = TokenBuilder::new();
1294 if let Some(ident) = self.eat_any_ident() {
1295 tb.extend_tree(ident);
1296 let mut colons_tb = TokenBuilder::new();
1297 if let Some(colons) = self.eat_double_colon() {
1298 colons_tb.stream(colons);
1299 }
1300 if let Some(generic) = self.eat_group_angle_bracket() {
1301 tb.stream(colons_tb.end());
1302 tb.stream(generic);
1303 } else if let Some(fn_args) = self.eat_group(Delimiter::Parenthesis) {
1304 tb.stream(colons_tb.end());
1305 tb.extend_tree(fn_args);
1306 if let Some(arrow) = self.eat_fn_arrow() {
1307 tb.stream(arrow);
1308 if let Some(ty) = self.eat_type() {
1309 tb.stream(ty.stream);
1310 } else {
1311 return None;
1313 }
1314 }
1315 } else {
1316 self.backtrack(colons_tb.end());
1317 }
1318 Some(tb.end())
1319 } else {
1320 None
1321 }
1322 }
1323
1324 pub fn eat_type_path(&mut self) -> Option<TokenStream> {
1325 let mut tb = TokenBuilder::new();
1326 if let Some(colons) = self.eat_double_colon() {
1327 tb.stream(colons);
1328 }
1329 if let Some(segment) = self.eat_type_path_segment() {
1330 tb.stream(segment);
1331 } else {
1332 return None;
1334 }
1335 while let Some(colons) = self.eat_double_colon() {
1336 tb.stream(colons);
1337 if let Some(segment) = self.eat_type_path_segment() {
1338 tb.stream(segment);
1339 } else {
1340 return None;
1342 }
1343 }
1344 Some(tb.end())
1345 }
1346
1347 pub fn eat_raw_pointer_type(&mut self) -> Option<TokenStream> {
1348 if let Some(star) = self.eat_punct('*') {
1349 let mut tb = TokenBuilder::new();
1350 tb.extend_tree(star);
1351 if let Some(ident) = self.eat_ident("cont").or_else(|| self.eat_ident("mut")) {
1352 tb.extend_tree(ident);
1353 if let Some(ty) = self.eat_type_no_bounds() {
1354 tb.stream(ty.stream);
1355 Some(tb.end())
1356 } else {
1357 return None;
1359 }
1360 } else {
1361 return None;
1363 }
1364 } else {
1365 None
1366 }
1367 }
1368
1369 pub fn eat_qualified_path_in_type(&mut self) -> Option<TokenStream> {
1370 let mut tb = TokenBuilder::new();
1372 if let Some(qtp) = self.eat_group_angle_bracket() {
1373 tb.stream(qtp);
1374
1375 if let Some(colons) = self.eat_double_colon() {
1376 tb.stream(colons);
1377 if let Some(tps) = self.eat_type_path_segment() {
1378 tb.stream(tps);
1379
1380 while let Some(colons) = self.eat_double_colon() {
1381 tb.stream(colons);
1382 if let Some(tps) = self.eat_type_path_segment() {
1383 tb.stream(tps);
1384 } else {
1385 return None;
1387 }
1388 }
1389 Some(tb.end())
1390 } else {
1391 None
1393 }
1394 } else {
1395 None
1397 }
1398 } else {
1399 None
1400 }
1401 }
1402
1403 pub fn eat_for_lifetimes(&mut self) -> Option<TokenStream> {
1404 let mut tb = TokenBuilder::new();
1405
1406 if let Some(for_ident) = self.eat_ident("for") {
1407 tb.extend_tree(for_ident);
1408 if let Some(lifetime_params) = self.eat_group_angle_bracket() {
1409 tb.stream(lifetime_params);
1410 Some(tb.end())
1411 } else {
1412 None
1414 }
1415 } else {
1416 None
1417 }
1418 }
1419
1420 pub fn eat_outer_attribute(&mut self) -> Option<TokenStream> {
1421 let nbr_sign = self.eat_punct('#')?;
1422 if let Some(content) = self.eat_group(Delimiter::Bracket) {
1423 let mut tb = TokenBuilder::new();
1424 tb.extend_tree(nbr_sign);
1425 tb.extend_tree(content);
1426 Some(tb.end())
1427 } else {
1428 None
1429 }
1430 }
1431
1432 pub fn eat_simple_path(&mut self) -> Option<TokenStream> {
1433 let mut tb = TokenBuilder::new();
1434 if let Some(db) = self.eat_double_colon() {
1435 tb.stream(db);
1436 }
1437 if let Some(sps) = self.eat_any_ident() {
1438 tb.extend_tree(sps);
1440 while let Some(db) = self.eat_double_colon() {
1441 if let Some(sps) = self.eat_any_ident() {
1442 tb.stream(db);
1444 tb.extend_tree(sps);
1445 } else {
1446 return None;
1448 }
1449 }
1450 Some(tb.end())
1451 } else {
1452 None
1454 }
1455 }
1456
1457 pub fn eat_macro_invocation(&mut self) -> Option<TokenStream> {
1458 if let Some(sp) = self.eat_simple_path() {
1459 let mut tb = TokenBuilder::new();
1460 tb.stream(sp);
1461 if let Some(tree) = self.eat_any_group() {
1462 tb.extend_tree(tree);
1463 Some(tb.end())
1464 } else {
1465 None
1467 }
1468 } else {
1469 None
1470 }
1471 }
1472
1473 pub fn eat_trait_bound(&mut self) -> Option<TokenStream> {
1475 if let Some(g) = self.eat_group(Delimiter::Parenthesis) {
1476 let mut tb = TokenBuilder::new();
1477 tb.extend_tree(g);
1478 Some(tb.end())
1479 } else {
1480 let q = self.eat_punct('?');
1481 let for_lt = self.eat_for_lifetimes();
1482
1483 let mut tb = TokenBuilder::new();
1484
1485 if let Some(tp) = self.eat_type_path() {
1486 if let Some(q) = q {
1487 tb.extend_tree(q);
1488 }
1489 if let Some(for_lt) = for_lt {
1490 tb.stream(for_lt);
1491 }
1492 tb.stream(tp);
1493
1494 Some(tb.end())
1495 } else {
1496 return None;
1498 }
1499 }
1500 }
1501
1502 pub fn eat_trait_object_type_one_bound(&mut self) -> Option<TokenStream> {
1503 let mut tb = TokenBuilder::new();
1504 if let Some(dyn_ident) = self.eat_ident("dyn") {
1505 tb.extend_tree(dyn_ident);
1506 }
1507 if let Some(trait_bound) = self.eat_trait_bound() {
1508 tb.stream(trait_bound);
1509 Some(tb.end())
1510 } else {
1511 None
1513 }
1514 }
1515
1516 pub fn eat_impl_trait_type_one_bound(&mut self) -> Option<TokenStream> {
1517 if let Some(impl_ident) = self.eat_ident("impl") {
1518 let mut tb = TokenBuilder::new();
1519 if let Some(trait_bound) = self.eat_trait_bound() {
1520 tb.extend_tree(impl_ident);
1521 tb.stream(trait_bound);
1522 Some(tb.end())
1523 } else {
1524 None
1526 }
1527 } else {
1528 None
1529 }
1530 }
1531
1532 pub fn eat_type_no_bounds(&mut self) -> Option<Ty> {
1533 let mut tb = TokenBuilder::new();
1534
1535 if let Some(tys) = self.eat_group(Delimiter::Parenthesis) {
1536 tb.extend_tree(tys);
1538 } else if let Some(ittob) = self.eat_impl_trait_type_one_bound() {
1539 tb.stream(ittob);
1541 } else if let Some(itotob) = self.eat_trait_object_type_one_bound() {
1542 tb.stream(itotob);
1543 } else if let Some(typath) = self.eat_type_path() {
1544 tb.stream(typath);
1546 } else if let Some(tuple) = self.eat_group(Delimiter::Parenthesis) {
1547 tb.extend_tree(tuple);
1549 } else if let Some(never) = self.eat_punct('!') {
1550 tb.extend_tree(never);
1552 } else if let Some(raw_ptr) = self.eat_raw_pointer_type() {
1553 tb.stream(raw_ptr);
1555 } else if let Some(amp) = self.eat_punct('&') {
1556 let mut mutable = false;
1558 let mut lifetime = None;
1559 tb.extend_tree(amp);
1560 if let Some(lt) = self.eat_lifetime() {
1561 lifetime = Some(lt.clone());
1562 tb.stream(lt);
1563 }
1564 if let Some(mut_ident) = self.eat_ident("mut") {
1565 mutable = true;
1566 tb.extend_tree(mut_ident);
1567 }
1568 let rest = self.eat_type_no_bounds()?;
1569 tb.stream(rest.clone().stream);
1570 return Some(Ty {
1571 stream: tb.end(),
1572 kind: TyKind::Ref(Box::new(RefTy {
1573 mutable,
1574 lifetime,
1575 rest,
1576 })),
1577 });
1578 } else if let Some(arr_or_slice) = self.eat_group(Delimiter::Bracket) {
1579 tb.extend_tree(arr_or_slice);
1581 } else if let Some(punct) = self.eat_punct('_') {
1582 tb.extend_tree(punct);
1584 } else if let Some(qpit) = self.eat_qualified_path_in_type() {
1585 tb.stream(qpit);
1587 } else if let Some(m) = self.eat_macro_invocation() {
1588 tb.stream(m);
1589 } else {
1590 return None;
1591 }
1592 return Some(Ty {
1593 stream: tb.end(),
1594 kind: TyKind::Other,
1595 });
1596 }
1597
1598 pub fn eat_type_param_bounds(&mut self) -> Option<TokenStream> {
1599 if let Some(tpb) = self.eat_type_param_bound() {
1600 let mut tb = TokenBuilder::new();
1601 tb.stream(tpb);
1602 while let Some(plus) = self.eat_punct('+') {
1603 tb.extend_tree(plus);
1604 if let Some(bound) = self.eat_type_param_bound() {
1605 tb.stream(bound);
1606 }
1607 }
1608 Some(tb.end())
1609 } else {
1610 None
1611 }
1612 }
1613
1614 pub fn eat_type_param_bound(&mut self) -> Option<TokenStream> {
1615 self.eat_lifetime().or_else(|| self.eat_trait_bound())
1616 }
1617
1618 pub fn eat_impl_trait_type(&mut self) -> Option<TokenStream> {
1619 if let Some(impl_ident) = self.eat_ident("impl") {
1620 let mut tb = TokenBuilder::new();
1621 tb.extend_tree(impl_ident);
1622 if let Some(tpbs) = self.eat_type_param_bounds() {
1623 tb.stream(tpbs);
1624 Some(tb.end())
1625 } else {
1626 None
1628 }
1629 } else {
1630 None
1631 }
1632 }
1633
1634 pub fn eat_trait_object_type(&mut self) -> Option<TokenStream> {
1635 let mut tb = TokenBuilder::new();
1636 if let Some(dyn_ident) = self.eat_ident("dyn") {
1637 tb.extend_tree(dyn_ident);
1638 }
1639 if let Some(tpbs) = self.eat_type_param_bounds() {
1640 tb.stream(tpbs);
1641 Some(tb.end())
1642 } else {
1643 None
1645 }
1646 }
1647
1648 pub fn eat_type(&mut self) -> Option<Ty> {
1649 self.eat_type_no_bounds()
1650 .or_else(|| {
1651 self.eat_impl_trait_type().map(|stream| Ty {
1652 stream,
1653 kind: TyKind::Other,
1654 })
1655 })
1656 .or_else(|| {
1657 self.eat_trait_object_type().map(|stream| Ty {
1658 stream,
1659 kind: TyKind::Other,
1660 })
1661 })
1662 }
1663
1664 pub fn eat_group(&mut self, delim: Delimiter) -> Option<TokenTree> {
1665 if let Some(TokenTree::Group(group)) = self.peek() {
1666 if group.delimiter() == delim {
1667 let ret = Some(TokenTree::Group(group.clone()));
1668 self.advance();
1669 ret
1670 } else {
1671 None
1672 }
1673 } else {
1674 None
1675 }
1676 }
1677
1678 pub fn eat_any_group(&mut self) -> Option<TokenTree> {
1679 if let Some(TokenTree::Group(group)) = self.peek() {
1680 let ret = Some(TokenTree::Group(group.clone()));
1681 self.advance();
1682 return ret;
1683 }
1684 return None;
1685 }
1686
1687 pub fn eat_visibility(&mut self) -> TokenStream {
1688 let mut tb = TokenBuilder::new();
1689 if let Some(pub_ident) = self.eat_ident("pub") {
1690 tb.extend_tree(pub_ident);
1691 if let Some(tt) = self.eat_group(Delimiter::Bracket) {
1692 tb.extend_tree(tt);
1693 }
1694 }
1695 tb.end()
1696 }
1697}
1698
1699#[cfg(test)]
1700mod test {
1701 use super::TokenParser;
1702 use proc_macro2::TokenStream;
1703 #[test]
1704 fn parse_function() {
1705 let content = "
1706 pub const fn hello<T>(Some(&mut x): Vec<T>) -> bool where T: Default {}
1707 "
1708 .parse::<TokenStream>()
1709 .unwrap();
1710 let mut parser = TokenParser::new(content);
1711 let function1 = parser.eat_function();
1712 assert!(function1.is_some());
1713 let content = "
1716 async fn hello<T, V: Clone>((x, y, z): (Vec<T>, u8, dyn Clone))
1717 "
1718 .parse::<TokenStream>()
1719 .unwrap();
1720 let mut parser = TokenParser::new(content);
1721 let function2 = parser.eat_function();
1722 assert!(function2.is_some());
1723 let content = "
1726 fn hello() -> impl Fn(&u8) -> dyn Fn(u8)
1727 "
1728 .parse::<TokenStream>()
1729 .unwrap();
1730 let mut parser = TokenParser::new(content);
1731 let function3 = parser.eat_function();
1732
1733 assert!(function3.is_some());
1734 }
1736}