debug3 0.4.1

Space Efficient Pretty Printer
Documentation
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
#![cfg(feature = "syn")]

use crate::check;
use expect_test::expect;
use syn::{ExprCall, ExprField, ItemMacro};

#[test]
fn char_lit() {
    let x = "'x'";
    let y: syn::Expr = syn::parse_str(x).unwrap();
    check(
        y,
        expect![[r#"
        Lit(
            ExprLit {
                attrs: [],
                lit: Char(LitChar { token: 'x' }),
            },
        )"#]],
    );
}

/*
Lit(
    ExprLit {
        attrs: [],
        lit: Char(
            LitChar {
                token: 'x',
            },
        ),
    },
)
*/

#[test]
fn ref_mut() {
    let x = "&mut x";
    let y: syn::Expr = syn::parse_str(x).unwrap();
    check(
        y,
        expect![[r#"
            Reference(
                ExprReference {
                    attrs: [],
                    and_token: And,
                    raw: Reserved,
                    mutability: Some(Mut),
                    expr: Path(
                        ExprPath {
                            attrs: [],
                            qself: None,
                            path: Path {
                                leading_colon: None,
                                segments: [
                                    PathSegment {
                                        ident: Ident {
                                            sym: "x",
                                            span: Span(1:5: 1:6),
                                        },
                                        arguments: None,
                                    },
                                ],
                            },
                        },
                    ),
                },
            )"#]],
    );
}

/*
Reference(
    ExprReference {
        attrs: [],
        and_token: And,
        raw: Reserved,
        mutability: Some(
            Mut,
        ),
        expr: Path(
            ExprPath {
                attrs: [],
                qself: None,
                path: Path {
                    leading_colon: None,
                    segments: [
                        PathSegment {
                            ident: Ident {
                                sym: x,
                                span: bytes(6..7),
                            },
                            arguments: None,
                        },
                    ],
                },
            },
        ),
    },
)
*/

#[test]
fn punct() {
    let no_punct: ExprCall = syn::parse_str("Foo(1)").unwrap();
    let punct: ExprCall = syn::parse_str("Foo(1,2)").unwrap();
    let trailing_comma: ExprCall = syn::parse_str("Foo(1,2,)").unwrap();
    check(
        no_punct,
        expect![[r#"
            ExprCall {
                attrs: [],
                func: Path(
                    ExprPath {
                        attrs: [],
                        qself: None,
                        path: Path {
                            leading_colon: None,
                            segments: [
                                PathSegment {
                                    ident: Ident {
                                        sym: "Foo",
                                        span: Span(1:0: 1:3),
                                    },
                                    arguments: None,
                                },
                            ],
                        },
                    },
                ),
                paren_token: Paren,
                args: [
                    Lit(
                        ExprLit {
                            attrs: [],
                            lit: Int(LitInt { token: 1 }),
                        },
                    ),
                ],
            }"#]],
    );
    check(
        punct,
        expect![[r#"
            ExprCall {
                attrs: [],
                func: Path(
                    ExprPath {
                        attrs: [],
                        qself: None,
                        path: Path {
                            leading_colon: None,
                            segments: [
                                PathSegment {
                                    ident: Ident {
                                        sym: "Foo",
                                        span: Span(1:0: 1:3),
                                    },
                                    arguments: None,
                                },
                            ],
                        },
                    },
                ),
                paren_token: Paren,
                args: [
                    Lit(
                        ExprLit {
                            attrs: [],
                            lit: Int(LitInt { token: 1 }),
                        },
                    ),
                    Comma,
                    Lit(
                        ExprLit {
                            attrs: [],
                            lit: Int(LitInt { token: 2 }),
                        },
                    ),
                ],
            }"#]],
    );
    check(
        trailing_comma,
        expect![[r#"
            ExprCall {
                attrs: [],
                func: Path(
                    ExprPath {
                        attrs: [],
                        qself: None,
                        path: Path {
                            leading_colon: None,
                            segments: [
                                PathSegment {
                                    ident: Ident {
                                        sym: "Foo",
                                        span: Span(1:0: 1:3),
                                    },
                                    arguments: None,
                                },
                            ],
                        },
                    },
                ),
                paren_token: Paren,
                args: [
                    Lit(
                        ExprLit {
                            attrs: [],
                            lit: Int(LitInt { token: 1 }),
                        },
                    ),
                    Comma,
                    Lit(
                        ExprLit {
                            attrs: [],
                            lit: Int(LitInt { token: 2 }),
                        },
                    ),
                    Comma,
                ],
            }"#]],
    );
}

#[test]
fn tuple_index_span() {
    let expr: ExprField = syn::parse_str("answer.42").unwrap();
    check(
        expr,
        expect![[r#"
            ExprField {
                attrs: [],
                base: Path(
                    ExprPath {
                        attrs: [],
                        qself: None,
                        path: Path {
                            leading_colon: None,
                            segments: [
                                PathSegment {
                                    ident: Ident {
                                        sym: "answer",
                                        span: Span(1:0: 1:6),
                                    },
                                    arguments: None,
                                },
                            ],
                        },
                    },
                ),
                dot_token: Dot,
                member: Unnamed(
                    Index {
                        index: 42,
                        span: Span(1:7: 1:9),
                    },
                ),
            }"#]],
    )
}

/*
ExprField {
    attrs: [],
    base: Path(
        ExprPath {
            attrs: [],
            qself: None,
            path: Path {
                leading_colon: None,
                segments: [
                    PathSegment {
                        ident: Ident {
                            sym: answer,
                            span: bytes(1..7),
                        },
                        arguments: None,
                    },
                ],
            },
        },
    ),
    dot_token: Dot,
    member: Unnamed(
        Index {
            index: 42,
            span: bytes(8..10),
        },
    ),
}
*/

#[test]
fn attrs() {
    let x: syn::File = syn::parse_str("#![feature(no_core)]").unwrap();
    check(
        x,
        expect![[r#"
            File {
                shebang: None,
                attrs: [
                    Attribute {
                        pound_token: Pound,
                        style: Inner(Bang),
                        bracket_token: Bracket,
                        path: Path {
                            leading_colon: None,
                            segments: [
                                PathSegment {
                                    ident: Ident {
                                        sym: "feature",
                                        span: Span(1:3: 1:10),
                                    },
                                    arguments: None,
                                },
                            ],
                        },
                        tokens: TokenStream [
                            Group {
                                delimiter: Parenthesis,
                                stream: TokenStream [
                                    Ident {
                                        sym: "no_core",
                                        span: Span(1:11: 1:18),
                                    },
                                ],
                                span: Span(1:10: 1:19),
                            },
                        ],
                    },
                ],
                items: [],
            }"#]],
    )
}

/*
File {
    shebang: None,
    attrs: [
        Attribute {
            pound_token: Pound,
            style: Inner(
                Bang,
            ),
            bracket_token: Bracket,
            path: Path {
                leading_colon: None,
                segments: [
                    PathSegment {
                        ident: Ident {
                            sym: feature,
                            span: bytes(4..11),
                        },
                        arguments: None,
                    },
                ],
            },
            tokens: TokenStream [
                Group {
                    delimiter: Parenthesis,
                    stream: TokenStream [
                        Ident {
                            sym: no_core,
                            span: bytes(12..19),
                        },
                    ],
                    span: bytes(11..20),
                },
            ],
        },
    ],
    items: [],
}
*/

#[test]
fn macros() {
    let x: ItemMacro = syn::parse_str(
        "macro_rules! baz {
    () => {
        fn main() {
            let mut x = 3;
            x += 1;
        }
    };
}",
    )
    .unwrap();
    check(
        x,
        expect![[r#"
            ItemMacro {
                attrs: [],
                ident: Some(
                    Ident {
                        sym: "baz",
                        span: Span(1:13: 1:16),
                    },
                ),
                mac: Macro {
                    path: Path {
                        leading_colon: None,
                        segments: [
                            PathSegment {
                                ident: Ident {
                                    sym: "macro_rules",
                                    span: Span(1:0: 1:11),
                                },
                                arguments: None,
                            },
                        ],
                    },
                    bang_token: Bang,
                    delimiter: Brace(Brace),
                    tokens: TokenStream [
                        Group {
                            delimiter: Parenthesis,
                            stream: TokenStream [],
                            span: Span(2:4: 2:6),
                        },
                        Punct {
                            char: '=',
                            spacing: Joint,
                            span: Joint,
                        },
                        Punct {
                            char: '>',
                            spacing: Alone,
                            span: Alone,
                        },
                        Group {
                            delimiter: Brace,
                            stream: TokenStream [
                                Ident {
                                    sym: "fn",
                                    span: Span(3:8: 3:10),
                                },
                                Ident {
                                    sym: "main",
                                    span: Span(3:11: 3:15),
                                },
                                Group {
                                    delimiter: Parenthesis,
                                    stream: TokenStream [],
                                    span: Span(3:15: 3:17),
                                },
                                Group {
                                    delimiter: Brace,
                                    stream: TokenStream [
                                        Ident {
                                            sym: "let",
                                            span: Span(4:12: 4:15),
                                        },
                                        Ident {
                                            sym: "mut",
                                            span: Span(4:16: 4:19),
                                        },
                                        Ident {
                                            sym: "x",
                                            span: Span(4:20: 4:21),
                                        },
                                        Punct {
                                            char: '=',
                                            spacing: Alone,
                                            span: Alone,
                                        },
                                        Literal {
                                            lit: 3,
                                            span: Span(4:24: 4:25),
                                        },
                                        Punct {
                                            char: ';',
                                            spacing: Alone,
                                            span: Alone,
                                        },
                                        Ident {
                                            sym: "x",
                                            span: Span(5:12: 5:13),
                                        },
                                        Punct {
                                            char: '+',
                                            spacing: Joint,
                                            span: Joint,
                                        },
                                        Punct {
                                            char: '=',
                                            spacing: Alone,
                                            span: Alone,
                                        },
                                        Literal {
                                            lit: 1,
                                            span: Span(5:17: 5:18),
                                        },
                                        Punct {
                                            char: ';',
                                            spacing: Alone,
                                            span: Alone,
                                        },
                                    ],
                                    span: Span(3:18: 6:9),
                                },
                            ],
                            span: Span(2:10: 7:5),
                        },
                        Punct {
                            char: ';',
                            spacing: Alone,
                            span: Alone,
                        },
                    ],
                },
                semi_token: None,
            }"#]],
    );
}