actually use the new parser

This commit is contained in:
Folkert 2022-05-26 15:32:04 +02:00
parent fa9ac912a0
commit bab81fd941
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
3 changed files with 35 additions and 86 deletions

View file

@ -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>,

View file

@ -945,11 +945,10 @@ fn parse_toplevel_defs_end<'a>(
let region = Region::span_across(&ann_pattern.region, &region);
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, &region);
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))
}

View file

@ -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)]