• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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