Skip to content

Commit c8cf454

Browse files
refactor: move lazy_static parsing to parse mod
1 parent 9ce5470 commit c8cf454

File tree

3 files changed

+58
-37
lines changed

3 files changed

+58
-37
lines changed

src/macros.rs

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use crate::config::lists::*;
2828
use crate::expr::{rewrite_array, rewrite_assign_rhs, RhsAssignKind};
2929
use crate::lists::{itemize_list, write_list, ListFormatting};
3030
use crate::overflow;
31+
use crate::parse::macros::lazy_static::parse_lazy_static;
3132
use crate::parse::macros::{build_parser, parse_macro_args, ParsedMacroArgs};
3233
use crate::rewrite::{Rewrite, RewriteContext};
3334
use crate::shape::{Indent, Shape};
@@ -1297,50 +1298,18 @@ fn format_lazy_static(
12971298
ts: TokenStream,
12981299
) -> Option<String> {
12991300
let mut result = String::with_capacity(1024);
1300-
let mut parser = build_parser(context, ts);
13011301
let nested_shape = shape
13021302
.block_indent(context.config.tab_spaces())
13031303
.with_max_width(context.config);
13041304

13051305
result.push_str("lazy_static! {");
13061306
result.push_str(&nested_shape.indent.to_string_with_newline(context.config));
13071307

1308-
macro_rules! parse_or {
1309-
($method:ident $(,)* $($arg:expr),* $(,)*) => {
1310-
match parser.$method($($arg,)*) {
1311-
Ok(val) => {
1312-
if parser.sess.span_diagnostic.has_errors() {
1313-
parser.sess.span_diagnostic.reset_err_count();
1314-
return None;
1315-
} else {
1316-
val
1317-
}
1318-
}
1319-
Err(mut err) => {
1320-
err.cancel();
1321-
parser.sess.span_diagnostic.reset_err_count();
1322-
return None;
1323-
}
1324-
}
1325-
}
1326-
}
1327-
1328-
while parser.token.kind != TokenKind::Eof {
1329-
// Parse a `lazy_static!` item.
1330-
let vis = crate::utils::format_visibility(
1331-
context,
1332-
&parse_or!(parse_visibility, rustc_parse::parser::FollowedByType::No),
1333-
);
1334-
parser.eat_keyword(kw::Static);
1335-
parser.eat_keyword(kw::Ref);
1336-
let id = parse_or!(parse_ident);
1337-
parser.eat(&TokenKind::Colon);
1338-
let ty = parse_or!(parse_ty);
1339-
parser.eat(&TokenKind::Eq);
1340-
let expr = parse_or!(parse_expr);
1341-
parser.eat(&TokenKind::Semi);
1342-
1308+
let parsed_elems = parse_lazy_static(context, ts)?;
1309+
let last = parsed_elems.len() - 1;
1310+
for (i, (vis, id, ty, expr)) in parsed_elems.iter().enumerate() {
13431311
// Rewrite as a static item.
1312+
let vis = crate::utils::format_visibility(context, vis);
13441313
let mut stmt = String::with_capacity(128);
13451314
stmt.push_str(&format!(
13461315
"{}static ref {}: {} =",
@@ -1356,7 +1325,7 @@ fn format_lazy_static(
13561325
nested_shape.sub_width(1)?,
13571326
)?);
13581327
result.push(';');
1359-
if parser.token.kind != TokenKind::Eof {
1328+
if i != last {
13601329
result.push_str(&nested_shape.indent.to_string_with_newline(context.config));
13611330
}
13621331
}

src/parse/macros/lazy_static.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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+
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() {
20+
parser.sess.span_diagnostic.reset_err_count();
21+
return None;
22+
} else {
23+
val
24+
}
25+
}
26+
Err(mut 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+
}

src/parse/macros/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ use rustc_span::{
1111
use crate::macros::MacroArg;
1212
use crate::rewrite::{Rewrite, RewriteContext};
1313

14+
pub(crate) mod lazy_static;
15+
1416
pub(crate) fn build_parser<'a>(context: &RewriteContext<'a>, tokens: TokenStream) -> Parser<'a> {
1517
stream_to_parser(context.parse_sess.inner(), tokens, MACRO_ARGUMENTS)
1618
}

0 commit comments

Comments
 (0)