mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
actually use the new parser
This commit is contained in:
parent
fa9ac912a0
commit
bab81fd941
3 changed files with 35 additions and 86 deletions
|
@ -391,6 +391,19 @@ impl<'a> Defs<'a> {
|
|||
self.push_def_help(tag, region, spaces_before, spaces_after)
|
||||
}
|
||||
|
||||
pub fn replace_with_value_def(
|
||||
&mut self,
|
||||
index: usize,
|
||||
value_def: ValueDef<'a>,
|
||||
region: Region,
|
||||
) {
|
||||
let value_def_index = Index::push_new(&mut self.value_defs, value_def);
|
||||
let tag = EitherIndex::from_right(value_def_index);
|
||||
|
||||
self.tags[index] = tag;
|
||||
self.regions[index] = region;
|
||||
}
|
||||
|
||||
pub fn push_type_def(
|
||||
&mut self,
|
||||
type_def: TypeDef<'a>,
|
||||
|
|
|
@ -945,11 +945,10 @@ fn parse_toplevel_defs_end<'a>(
|
|||
|
||||
let region = Region::span_across(&ann_pattern.region, ®ion);
|
||||
|
||||
defs.push_value_def(
|
||||
defs.replace_with_value_def(
|
||||
defs.tags.len() - 1,
|
||||
value_def,
|
||||
region,
|
||||
spaces_before_current,
|
||||
&[],
|
||||
)
|
||||
}
|
||||
Some(Ok(TypeDef::Alias {
|
||||
|
@ -982,11 +981,10 @@ fn parse_toplevel_defs_end<'a>(
|
|||
|
||||
let region = Region::span_across(&header.name.region, ®ion);
|
||||
|
||||
defs.push_value_def(
|
||||
defs.replace_with_value_def(
|
||||
defs.tags.len() - 1,
|
||||
value_def,
|
||||
region,
|
||||
spaces_before_current,
|
||||
&[],
|
||||
)
|
||||
}
|
||||
_ => {
|
||||
|
@ -2313,16 +2311,18 @@ pub fn toplevel_defs<'a>(min_indent: u32) -> impl Parser<'a, Defs<'a>, EExpr<'a>
|
|||
let (_, final_space, state) =
|
||||
space0_e(start_column, EExpr::IndentEnd).parse(arena, state)?;
|
||||
|
||||
// add surrounding whitespace
|
||||
let before = Slice::extend_new(&mut output.spaces, initial_space.iter().copied());
|
||||
let after = Slice::extend_new(&mut output.spaces, final_space.iter().copied());
|
||||
if !output.tags.is_empty() {
|
||||
// add surrounding whitespace
|
||||
let after = Slice::extend_new(&mut output.spaces, final_space.iter().copied());
|
||||
let before = Slice::extend_new(&mut output.spaces, initial_space.iter().copied());
|
||||
|
||||
debug_assert!(output.space_before[0].is_empty());
|
||||
output.space_before[0] = before;
|
||||
debug_assert!(output.space_before[0].is_empty());
|
||||
output.space_before[0] = before;
|
||||
|
||||
let last = output.tags.len() - 1;
|
||||
debug_assert!(output.space_after[last].is_empty() || after.is_empty());
|
||||
output.space_after[last] = after;
|
||||
let last = output.tags.len() - 1;
|
||||
debug_assert!(output.space_after[last].is_empty() || after.is_empty());
|
||||
output.space_after[last] = after;
|
||||
}
|
||||
|
||||
Ok((MadeProgress, output, state))
|
||||
}
|
||||
|
|
|
@ -15,7 +15,6 @@ use crate::state::State;
|
|||
use crate::string_literal;
|
||||
use crate::type_annotation;
|
||||
use bumpalo::collections::Vec;
|
||||
use roc_collections::soa::{EitherIndex, Index, Slice};
|
||||
use roc_region::all::{Loc, Position};
|
||||
|
||||
fn end_of_file<'a>() -> impl Parser<'a, (), SyntaxError<'a>> {
|
||||
|
@ -30,77 +29,14 @@ fn end_of_file<'a>() -> impl Parser<'a, (), SyntaxError<'a>> {
|
|||
|
||||
#[inline(always)]
|
||||
pub fn module_defs<'a>() -> impl Parser<'a, Defs<'a>, SyntaxError<'a>> {
|
||||
|arena, state: State<'a>| {
|
||||
let (progress, defs_vec, state) = module_defs_help().parse(arena, state)?;
|
||||
|
||||
let cap = defs_vec.len();
|
||||
|
||||
let mut defs = Defs {
|
||||
tags: std::vec::Vec::with_capacity(cap),
|
||||
regions: std::vec::Vec::with_capacity(cap),
|
||||
space_before: std::vec::Vec::with_capacity(cap),
|
||||
space_after: std::vec::Vec::with_capacity(cap),
|
||||
spaces: std::vec::Vec::with_capacity(cap),
|
||||
type_defs: std::vec::Vec::with_capacity(cap),
|
||||
value_defs: std::vec::Vec::with_capacity(cap),
|
||||
};
|
||||
|
||||
for def in defs_vec.iter() {
|
||||
defs.regions.push(def.region);
|
||||
|
||||
let mut def = &def.value;
|
||||
|
||||
loop {
|
||||
match def {
|
||||
Def::Type(type_def) => {
|
||||
if defs.space_before.len() != defs.regions.len() {
|
||||
defs.space_before.push(Slice::default());
|
||||
}
|
||||
|
||||
if defs.space_after.len() != defs.regions.len() {
|
||||
defs.space_after.push(Slice::default());
|
||||
}
|
||||
|
||||
let def_index = Index::push_new(&mut defs.type_defs, *type_def);
|
||||
defs.tags.push(EitherIndex::from_left(def_index));
|
||||
|
||||
break;
|
||||
}
|
||||
Def::Value(value_def) => {
|
||||
if defs.space_before.len() != defs.regions.len() {
|
||||
defs.space_before.push(Slice::default());
|
||||
}
|
||||
|
||||
if defs.space_after.len() != defs.regions.len() {
|
||||
defs.space_after.push(Slice::default());
|
||||
}
|
||||
|
||||
let def_index = Index::push_new(&mut defs.value_defs, *value_def);
|
||||
defs.tags.push(EitherIndex::from_right(def_index));
|
||||
|
||||
break;
|
||||
}
|
||||
Def::SpaceBefore(inner, spaces) => {
|
||||
let slice = Slice::extend_new(&mut defs.spaces, spaces.iter().copied());
|
||||
defs.space_before.push(slice);
|
||||
debug_assert_eq!(defs.regions.len(), defs.space_before.len());
|
||||
|
||||
def = inner;
|
||||
}
|
||||
Def::SpaceAfter(inner, spaces) => {
|
||||
let slice = Slice::extend_new(&mut defs.spaces, spaces.iter().copied());
|
||||
defs.space_after.push(slice);
|
||||
debug_assert_eq!(defs.regions.len(), defs.space_after.len());
|
||||
|
||||
def = inner;
|
||||
}
|
||||
Def::NotYetImplemented(_) => todo!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok((progress, defs, state))
|
||||
}
|
||||
let min_indent = 0;
|
||||
skip_second!(
|
||||
specialize_region(
|
||||
|e, r| SyntaxError::Expr(e, r.start()),
|
||||
crate::expr::toplevel_defs(min_indent),
|
||||
),
|
||||
end_of_file()
|
||||
)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue