mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
Change syntax for requires in platform modules
This commit is contained in:
parent
61edcc7d03
commit
ea150b0101
3 changed files with 28 additions and 33 deletions
|
@ -19,7 +19,9 @@ use roc_mono::ir::{
|
||||||
CapturedSymbols, ExternalSpecializations, PartialProc, PendingSpecialization, Proc, Procs,
|
CapturedSymbols, ExternalSpecializations, PartialProc, PendingSpecialization, Proc, Procs,
|
||||||
};
|
};
|
||||||
use roc_mono::layout::{Layout, LayoutCache};
|
use roc_mono::layout::{Layout, LayoutCache};
|
||||||
use roc_parse::ast::{self, Attempting, ExposesEntry, ImportsEntry, PlatformHeader};
|
use roc_parse::ast::{
|
||||||
|
self, Attempting, ExposesEntry, ImportsEntry, PlatformHeader, TypeAnnotation, TypedIdent,
|
||||||
|
};
|
||||||
use roc_parse::module::module_defs;
|
use roc_parse::module::module_defs;
|
||||||
use roc_parse::parser::{self, Fail, Parser};
|
use roc_parse::parser::{self, Fail, Parser};
|
||||||
use roc_region::all::{Located, Region};
|
use roc_region::all::{Located, Region};
|
||||||
|
@ -2434,18 +2436,11 @@ fn build_effect_actual(effect_tag_name: TagName, a_type: Type, var_store: &mut V
|
||||||
|
|
||||||
fn unpack_exposes_entries<'a>(
|
fn unpack_exposes_entries<'a>(
|
||||||
arena: &'a Bump,
|
arena: &'a Bump,
|
||||||
entries: &'a [Located<roc_parse::ast::EffectsEntry<'a>>],
|
entries: &'a [Located<TypedIdent<'a>>],
|
||||||
) -> bumpalo::collections::Vec<
|
) -> bumpalo::collections::Vec<'a, (&'a Located<&'a str>, &'a Located<TypeAnnotation<'a>>)> {
|
||||||
'a,
|
|
||||||
(
|
|
||||||
&'a Located<&'a str>,
|
|
||||||
&'a Located<roc_parse::ast::TypeAnnotation<'a>>,
|
|
||||||
),
|
|
||||||
> {
|
|
||||||
use bumpalo::collections::Vec;
|
use bumpalo::collections::Vec;
|
||||||
use roc_parse::ast::EffectsEntry;
|
|
||||||
|
|
||||||
let mut stack: Vec<&EffectsEntry> = Vec::with_capacity_in(entries.len(), arena);
|
let mut stack: Vec<&TypedIdent> = Vec::with_capacity_in(entries.len(), arena);
|
||||||
let mut output = Vec::with_capacity_in(entries.len(), arena);
|
let mut output = Vec::with_capacity_in(entries.len(), arena);
|
||||||
|
|
||||||
for entry in entries.iter() {
|
for entry in entries.iter() {
|
||||||
|
@ -2454,14 +2449,14 @@ fn unpack_exposes_entries<'a>(
|
||||||
|
|
||||||
while let Some(effects_entry) = stack.pop() {
|
while let Some(effects_entry) = stack.pop() {
|
||||||
match effects_entry {
|
match effects_entry {
|
||||||
EffectsEntry::Effect {
|
TypedIdent::Entry {
|
||||||
ident,
|
ident,
|
||||||
spaces_before_colon: _,
|
spaces_before_colon: _,
|
||||||
ann,
|
ann,
|
||||||
} => {
|
} => {
|
||||||
output.push((ident, ann));
|
output.push((ident, ann));
|
||||||
}
|
}
|
||||||
EffectsEntry::SpaceAfter(nested, _) | EffectsEntry::SpaceBefore(nested, _) => {
|
TypedIdent::SpaceAfter(nested, _) | TypedIdent::SpaceBefore(nested, _) => {
|
||||||
stack.push(nested);
|
stack.push(nested);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ pub struct AppHeader<'a> {
|
||||||
pub struct PlatformHeader<'a> {
|
pub struct PlatformHeader<'a> {
|
||||||
pub name: Loc<PackageName<'a>>,
|
pub name: Loc<PackageName<'a>>,
|
||||||
pub provides: Vec<'a, Loc<ExposesEntry<'a>>>,
|
pub provides: Vec<'a, Loc<ExposesEntry<'a>>>,
|
||||||
pub requires: Vec<'a, Loc<ExposesEntry<'a>>>,
|
pub requires: Vec<'a, Loc<TypedIdent<'a>>>,
|
||||||
pub imports: Vec<'a, Loc<ImportsEntry<'a>>>,
|
pub imports: Vec<'a, Loc<ImportsEntry<'a>>>,
|
||||||
pub effects: Effects<'a>,
|
pub effects: Effects<'a>,
|
||||||
|
|
||||||
|
@ -72,23 +72,23 @@ pub struct Effects<'a> {
|
||||||
pub spaces_after_effects_keyword: &'a [CommentOrNewline<'a>],
|
pub spaces_after_effects_keyword: &'a [CommentOrNewline<'a>],
|
||||||
pub spaces_after_type_name: &'a [CommentOrNewline<'a>],
|
pub spaces_after_type_name: &'a [CommentOrNewline<'a>],
|
||||||
pub type_name: &'a str,
|
pub type_name: &'a str,
|
||||||
pub entries: Vec<'a, Loc<EffectsEntry<'a>>>,
|
pub entries: Vec<'a, Loc<TypedIdent<'a>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
pub enum EffectsEntry<'a> {
|
pub enum TypedIdent<'a> {
|
||||||
/// e.g.
|
/// e.g.
|
||||||
///
|
///
|
||||||
/// printLine : Str -> Effect {}
|
/// printLine : Str -> Effect {}
|
||||||
Effect {
|
Entry {
|
||||||
ident: Loc<&'a str>,
|
ident: Loc<&'a str>,
|
||||||
spaces_before_colon: &'a [CommentOrNewline<'a>],
|
spaces_before_colon: &'a [CommentOrNewline<'a>],
|
||||||
ann: Loc<TypeAnnotation<'a>>,
|
ann: Loc<TypeAnnotation<'a>>,
|
||||||
},
|
},
|
||||||
|
|
||||||
// Spaces
|
// Spaces
|
||||||
SpaceBefore(&'a EffectsEntry<'a>, &'a [CommentOrNewline<'a>]),
|
SpaceBefore(&'a TypedIdent<'a>, &'a [CommentOrNewline<'a>]),
|
||||||
SpaceAfter(&'a EffectsEntry<'a>, &'a [CommentOrNewline<'a>]),
|
SpaceAfter(&'a TypedIdent<'a>, &'a [CommentOrNewline<'a>]),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
|
@ -628,12 +628,12 @@ impl<'a> Spaceable<'a> for ImportsEntry<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Spaceable<'a> for EffectsEntry<'a> {
|
impl<'a> Spaceable<'a> for TypedIdent<'a> {
|
||||||
fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self {
|
fn before(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self {
|
||||||
EffectsEntry::SpaceBefore(self, spaces)
|
TypedIdent::SpaceBefore(self, spaces)
|
||||||
}
|
}
|
||||||
fn after(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self {
|
fn after(&'a self, spaces: &'a [CommentOrNewline<'a>]) -> Self {
|
||||||
EffectsEntry::SpaceAfter(self, spaces)
|
TypedIdent::SpaceAfter(self, spaces)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::ast::{
|
use crate::ast::{
|
||||||
AppHeader, Attempting, CommentOrNewline, Def, Effects, EffectsEntry, ExposesEntry,
|
AppHeader, Attempting, CommentOrNewline, Def, Effects, ExposesEntry, ImportsEntry,
|
||||||
ImportsEntry, InterfaceHeader, Module, PlatformHeader,
|
InterfaceHeader, Module, PlatformHeader, TypedIdent,
|
||||||
};
|
};
|
||||||
use crate::blankspace::{space0, space0_around, space0_before, space1};
|
use crate::blankspace::{space0, space0_around, space0_before, space1};
|
||||||
use crate::expr::def;
|
use crate::expr::def;
|
||||||
|
@ -268,16 +268,16 @@ fn requires<'a>() -> impl Parser<
|
||||||
'a,
|
'a,
|
||||||
(
|
(
|
||||||
(&'a [CommentOrNewline<'a>], &'a [CommentOrNewline<'a>]),
|
(&'a [CommentOrNewline<'a>], &'a [CommentOrNewline<'a>]),
|
||||||
Vec<'a, Located<ExposesEntry<'a>>>,
|
Vec<'a, Located<TypedIdent<'a>>>,
|
||||||
),
|
),
|
||||||
> {
|
> {
|
||||||
and!(
|
and!(
|
||||||
and!(skip_second!(space1(1), ascii_string("requires")), space1(1)),
|
and!(skip_second!(space1(1), ascii_string("requires")), space1(1)),
|
||||||
collection!(
|
collection!(
|
||||||
ascii_char(b'['),
|
ascii_char(b'{'),
|
||||||
loc!(exposes_entry()),
|
loc!(typed_ident()),
|
||||||
ascii_char(b','),
|
ascii_char(b','),
|
||||||
ascii_char(b']'),
|
ascii_char(b'}'),
|
||||||
1
|
1
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -333,7 +333,7 @@ fn effects<'a>() -> impl Parser<'a, Effects<'a>> {
|
||||||
and!(uppercase_ident(), space1(0)).parse(arena, state)?;
|
and!(uppercase_ident(), space1(0)).parse(arena, state)?;
|
||||||
let (entries, state) = collection!(
|
let (entries, state) = collection!(
|
||||||
ascii_char(b'{'),
|
ascii_char(b'{'),
|
||||||
loc!(effects_entry()),
|
loc!(typed_ident()),
|
||||||
ascii_char(b','),
|
ascii_char(b','),
|
||||||
ascii_char(b'}'),
|
ascii_char(b'}'),
|
||||||
1
|
1
|
||||||
|
@ -354,7 +354,7 @@ fn effects<'a>() -> impl Parser<'a, Effects<'a>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn effects_entry<'a>() -> impl Parser<'a, EffectsEntry<'a>> {
|
fn typed_ident<'a>() -> impl Parser<'a, TypedIdent<'a>> {
|
||||||
move |arena, state| {
|
move |arena, state| {
|
||||||
// You must have a field name, e.g. "email"
|
// You must have a field name, e.g. "email"
|
||||||
let (ident, state) = loc!(lowercase_ident()).parse(arena, state)?;
|
let (ident, state) = loc!(lowercase_ident()).parse(arena, state)?;
|
||||||
|
@ -372,7 +372,7 @@ fn effects_entry<'a>() -> impl Parser<'a, EffectsEntry<'a>> {
|
||||||
// printLine : Str -> Effect {}
|
// printLine : Str -> Effect {}
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
EffectsEntry::Effect {
|
TypedIdent::Entry {
|
||||||
ident,
|
ident,
|
||||||
spaces_before_colon,
|
spaces_before_colon,
|
||||||
ann,
|
ann,
|
||||||
|
@ -397,10 +397,10 @@ fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>> {
|
||||||
optional(skip_first!(
|
optional(skip_first!(
|
||||||
ascii_char(b'.'),
|
ascii_char(b'.'),
|
||||||
collection!(
|
collection!(
|
||||||
ascii_char(b'{'),
|
ascii_char(b'['),
|
||||||
loc!(exposes_entry()),
|
loc!(exposes_entry()),
|
||||||
ascii_char(b','),
|
ascii_char(b','),
|
||||||
ascii_char(b'}'),
|
ascii_char(b']'),
|
||||||
1
|
1
|
||||||
)
|
)
|
||||||
))
|
))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue