File: test_parse_stream.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 893,176 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (187 lines) | stat: -rw-r--r-- 5,524 bytes parent folder | download | duplicates (21)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#![allow(clippy::items_after_statements, clippy::let_underscore_untyped)]

use proc_macro2::{Delimiter, Group, Punct, Spacing, Span, TokenStream, TokenTree};
use quote::quote;
use syn::ext::IdentExt as _;
use syn::parse::discouraged::AnyDelimiter;
use syn::parse::{ParseStream, Parser as _, Result};
use syn::{parenthesized, token, Ident, Lifetime, Token};

#[test]
fn test_peek_punct() {
    let tokens = quote!(+= + =);

    fn assert(input: ParseStream) -> Result<()> {
        assert!(input.peek(Token![+]));
        assert!(input.peek(Token![+=]));

        let _: Token![+] = input.parse()?;

        assert!(input.peek(Token![=]));
        assert!(!input.peek(Token![==]));
        assert!(!input.peek(Token![+]));

        let _: Token![=] = input.parse()?;

        assert!(input.peek(Token![+]));
        assert!(!input.peek(Token![+=]));

        let _: Token![+] = input.parse()?;
        let _: Token![=] = input.parse()?;
        Ok(())
    }

    assert.parse2(tokens).unwrap();
}

#[test]
fn test_peek_lifetime() {
    // 'static ;
    let tokens = TokenStream::from_iter([
        TokenTree::Punct(Punct::new('\'', Spacing::Joint)),
        TokenTree::Ident(Ident::new("static", Span::call_site())),
        TokenTree::Punct(Punct::new(';', Spacing::Alone)),
    ]);

    fn assert(input: ParseStream) -> Result<()> {
        assert!(input.peek(Lifetime));
        assert!(input.peek2(Token![;]));
        assert!(!input.peek2(Token![static]));

        let _: Lifetime = input.parse()?;

        assert!(input.peek(Token![;]));

        let _: Token![;] = input.parse()?;
        Ok(())
    }

    assert.parse2(tokens).unwrap();
}

#[test]
fn test_peek_not_lifetime() {
    // ' static
    let tokens = TokenStream::from_iter([
        TokenTree::Punct(Punct::new('\'', Spacing::Alone)),
        TokenTree::Ident(Ident::new("static", Span::call_site())),
    ]);

    fn assert(input: ParseStream) -> Result<()> {
        assert!(!input.peek(Lifetime));
        assert!(input.parse::<Option<Punct>>()?.is_none());

        let _: TokenTree = input.parse()?;

        assert!(input.peek(Token![static]));

        let _: Token![static] = input.parse()?;
        Ok(())
    }

    assert.parse2(tokens).unwrap();
}

#[test]
fn test_peek_ident() {
    let tokens = quote!(static var);

    fn assert(input: ParseStream) -> Result<()> {
        assert!(!input.peek(Ident));
        assert!(input.peek(Ident::peek_any));
        assert!(input.peek(Token![static]));

        let _: Token![static] = input.parse()?;

        assert!(input.peek(Ident));
        assert!(input.peek(Ident::peek_any));

        let _: Ident = input.parse()?;
        Ok(())
    }

    assert.parse2(tokens).unwrap();
}

#[test]
fn test_peek_groups() {
    // pub ( :: ) «∅ ! = ∅» static
    let tokens = TokenStream::from_iter([
        TokenTree::Ident(Ident::new("pub", Span::call_site())),
        TokenTree::Group(Group::new(
            Delimiter::Parenthesis,
            TokenStream::from_iter([
                TokenTree::Punct(Punct::new(':', Spacing::Joint)),
                TokenTree::Punct(Punct::new(':', Spacing::Alone)),
            ]),
        )),
        TokenTree::Group(Group::new(
            Delimiter::None,
            TokenStream::from_iter([
                TokenTree::Punct(Punct::new('!', Spacing::Alone)),
                TokenTree::Punct(Punct::new('=', Spacing::Alone)),
            ]),
        )),
        TokenTree::Ident(Ident::new("static", Span::call_site())),
    ]);

    fn assert(input: ParseStream) -> Result<()> {
        assert!(input.peek2(token::Paren));
        assert!(input.peek3(token::Group));
        assert!(input.peek3(Token![!]));

        let _: Token![pub] = input.parse()?;

        assert!(input.peek(token::Paren));
        assert!(!input.peek(Token![::]));
        assert!(!input.peek2(Token![::]));
        assert!(input.peek2(Token![!]));
        assert!(input.peek2(token::Group));
        assert!(input.peek3(Token![=]));
        assert!(!input.peek3(Token![static]));

        let content;
        parenthesized!(content in input);

        assert!(content.peek(Token![::]));
        assert!(content.peek2(Token![:]));
        assert!(!content.peek3(token::Group));
        assert!(!content.peek3(Token![!]));

        assert!(input.peek(token::Group));
        assert!(input.peek(Token![!]));

        let _: Token![::] = content.parse()?;

        assert!(input.peek(token::Group));
        assert!(input.peek(Token![!]));
        assert!(input.peek2(Token![=]));
        assert!(input.peek3(Token![static]));
        assert!(!input.peek2(Token![static]));

        let implicit = input.fork();
        let explicit = input.fork();

        let _: Token![!] = implicit.parse()?;
        assert!(implicit.peek(Token![=]));
        assert!(implicit.peek2(Token![static]));
        let _: Token![=] = implicit.parse()?;
        assert!(implicit.peek(Token![static]));

        let (delimiter, _span, grouped) = explicit.parse_any_delimiter()?;
        assert_eq!(delimiter, Delimiter::None);
        assert!(grouped.peek(Token![!]));
        assert!(grouped.peek2(Token![=]));
        assert!(!grouped.peek3(Token![static]));
        let _: Token![!] = grouped.parse()?;
        assert!(grouped.peek(Token![=]));
        assert!(!grouped.peek2(Token![static]));
        let _: Token![=] = grouped.parse()?;
        assert!(!grouped.peek(Token![static]));

        let _: TokenStream = input.parse()?;
        Ok(())
    }

    assert.parse2(tokens).unwrap();
}