rustfmt_nightly/parse/macros/
lazy_static.rs

1use rustc_ast::ast;
2use rustc_ast::ptr::P;
3use rustc_ast::token;
4use rustc_ast::tokenstream::TokenStream;
5use rustc_parse::exp;
6use rustc_span::symbol;
7
8use crate::rewrite::RewriteContext;
9
10pub(crate) fn parse_lazy_static(
11    context: &RewriteContext<'_>,
12    ts: TokenStream,
13) -> Option<Vec<(ast::Visibility, symbol::Ident, P<ast::Ty>, P<ast::Expr>)>> {
14    let mut result = vec![];
15    let mut parser = super::build_parser(context, ts);
16    macro_rules! parse_or {
17        ($method:ident $(,)* $($arg:expr),* $(,)*) => {
18            match parser.$method($($arg,)*) {
19                Ok(val) => {
20                    if parser.psess.dcx().has_errors().is_some() {
21                        parser.psess.dcx().reset_err_count();
22                        return None;
23                    } else {
24                        val
25                    }
26                }
27                Err(err) => {
28                    err.cancel();
29                    parser.psess.dcx().reset_err_count();
30                    return None;
31                }
32            }
33        }
34    }
35    while parser.token.kind != token::Eof {
36        // Parse a `lazy_static!` item.
37        // FIXME: These `eat_*` calls should be converted to `parse_or` to avoid
38        // silently formatting malformed lazy-statics.
39        let vis = parse_or!(parse_visibility, rustc_parse::parser::FollowedByType::No);
40        let _ = parser.eat_keyword(exp!(Static));
41        let _ = parser.eat_keyword(exp!(Ref));
42        let id = parse_or!(parse_ident);
43        let _ = parser.eat(exp!(Colon));
44        let ty = parse_or!(parse_ty);
45        let _ = parser.eat(exp!(Eq));
46        let expr = parse_or!(parse_expr);
47        let _ = parser.eat(exp!(Semi));
48        result.push((vis, id, ty, expr));
49    }
50
51    Some(result)
52}