mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 11:52:19 +00:00
Un-macro collection_inner
This commit is contained in:
parent
02c98f7519
commit
1c916202e7
2 changed files with 48 additions and 44 deletions
|
@ -10,11 +10,11 @@ use crate::blankspace::{
|
|||
use crate::ident::{integer_ident, lowercase_ident, parse_ident, Accessor, Ident};
|
||||
use crate::keyword;
|
||||
use crate::parser::{
|
||||
self, and, backtrackable, between, byte, byte_indent, either, increment_min_indent,
|
||||
indented_seq, line_min_indent, loc, map, map_with_arena, optional, reset_min_indent, sep_by1,
|
||||
sep_by1_e, set_min_indent, skip_first, skip_second, specialize_err, specialize_err_ref, then,
|
||||
two_bytes, zero_or_more, EClosure, EExpect, EExpr, EIf, EInParens, EList, ENumber, EPattern,
|
||||
ERecord, EString, EType, EWhen, Either, ParseResult, Parser,
|
||||
self, and, backtrackable, between, byte, byte_indent, collection_inner, either,
|
||||
increment_min_indent, indented_seq, line_min_indent, loc, map, map_with_arena, optional,
|
||||
reset_min_indent, sep_by1, sep_by1_e, set_min_indent, skip_first, skip_second, specialize_err,
|
||||
specialize_err_ref, then, two_bytes, zero_or_more, EClosure, EExpect, EExpr, EIf, EInParens,
|
||||
EList, ENumber, EPattern, ERecord, EString, EType, EWhen, Either, ParseResult, Parser,
|
||||
};
|
||||
use crate::pattern::{closure_param, loc_implements_parser};
|
||||
use crate::state::State;
|
||||
|
@ -3080,7 +3080,7 @@ fn record_help<'a>() -> impl Parser<'a, RecordHelp<'a>, ERecord<'a>> {
|
|||
),
|
||||
byte(b'&', ERecord::Ampersand)
|
||||
))),
|
||||
fields: collection_inner!(
|
||||
fields: collection_inner(
|
||||
loc(record_field()),
|
||||
byte(b',', ERecord::End),
|
||||
RecordField::SpaceBefore
|
||||
|
|
|
@ -1454,45 +1454,49 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! collection_inner {
|
||||
($elem:expr, $delimiter:expr, $space_before:expr) => {
|
||||
$crate::parser::map_with_arena(
|
||||
$crate::parser::and(
|
||||
$crate::parser::and(
|
||||
$crate::blankspace::spaces(),
|
||||
$crate::parser::trailing_sep_by0(
|
||||
$delimiter,
|
||||
$crate::blankspace::spaces_before_optional_after($elem),
|
||||
),
|
||||
pub fn collection_inner<'a, Elem: 'a + crate::ast::Spaceable<'a> + Clone, E: 'a + SpaceProblem>(
|
||||
elem: impl Parser<'a, Loc<Elem>, E> + 'a,
|
||||
delimiter: impl Parser<'a, (), E>,
|
||||
space_before: impl Fn(&'a Elem, &'a [crate::ast::CommentOrNewline<'a>]) -> Elem,
|
||||
) -> impl Parser<'a, crate::ast::Collection<'a, Loc<Elem>>, E> {
|
||||
map_with_arena(
|
||||
and(
|
||||
and(
|
||||
crate::blankspace::spaces(),
|
||||
trailing_sep_by0(
|
||||
delimiter,
|
||||
crate::blankspace::spaces_before_optional_after(elem),
|
||||
),
|
||||
$crate::blankspace::spaces(),
|
||||
),
|
||||
|arena: &'a bumpalo::Bump,
|
||||
((spaces, mut parsed_elems), mut final_comments): (
|
||||
(
|
||||
&'a [$crate::ast::CommentOrNewline<'a>],
|
||||
bumpalo::collections::vec::Vec<'a, Loc<_>>,
|
||||
),
|
||||
&'a [$crate::ast::CommentOrNewline<'a>],
|
||||
)| {
|
||||
if !spaces.is_empty() {
|
||||
if let Some(first) = parsed_elems.first_mut() {
|
||||
first.value = $space_before(arena.alloc(first.value), spaces)
|
||||
} else {
|
||||
debug_assert!(final_comments.is_empty());
|
||||
final_comments = spaces;
|
||||
}
|
||||
}
|
||||
crate::blankspace::spaces(),
|
||||
),
|
||||
#[allow(clippy::type_complexity)]
|
||||
move |arena: &'a bumpalo::Bump,
|
||||
out: (
|
||||
(
|
||||
&'a [crate::ast::CommentOrNewline<'a>],
|
||||
bumpalo::collections::Vec<'a, Loc<Elem>>,
|
||||
),
|
||||
&'a [crate::ast::CommentOrNewline<'a>],
|
||||
)| {
|
||||
let ((spaces, mut parsed_elems), mut final_comments) = out;
|
||||
|
||||
$crate::ast::Collection::with_items_and_comments(
|
||||
arena,
|
||||
parsed_elems.into_bump_slice(),
|
||||
final_comments,
|
||||
)
|
||||
},
|
||||
)
|
||||
};
|
||||
if !spaces.is_empty() {
|
||||
if let Some(first) = parsed_elems.first_mut() {
|
||||
first.value = space_before(arena.alloc(first.value.clone()), spaces);
|
||||
} else {
|
||||
debug_assert!(final_comments.is_empty());
|
||||
final_comments = spaces;
|
||||
}
|
||||
}
|
||||
|
||||
crate::ast::Collection::with_items_and_comments(
|
||||
arena,
|
||||
parsed_elems.into_bump_slice(),
|
||||
final_comments,
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
|
@ -1500,10 +1504,10 @@ macro_rules! collection_trailing_sep_e {
|
|||
($opening_brace:expr, $elem:expr, $delimiter:expr, $closing_brace:expr, $space_before:expr) => {
|
||||
$crate::parser::between(
|
||||
$opening_brace,
|
||||
$crate::parser::reset_min_indent($crate::collection_inner!(
|
||||
$crate::parser::reset_min_indent($crate::parser::collection_inner(
|
||||
$elem,
|
||||
$delimiter,
|
||||
$space_before
|
||||
$space_before,
|
||||
)),
|
||||
$closing_brace,
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue