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