mirror of
https://github.com/roc-lang/roc.git
synced 2025-07-24 06:55:15 +00:00
Parse ability definitions using record exprs, not types
This commit is contained in:
parent
cb084c9738
commit
73cd5b8c7c
3 changed files with 30 additions and 18 deletions
|
@ -2440,7 +2440,7 @@ fn list_literal_help<'a>(min_indent: u32) -> impl Parser<'a, Expr<'a>, EList<'a>
|
|||
}
|
||||
}
|
||||
|
||||
fn record_field_help<'a>(
|
||||
pub fn record_value_field<'a>(
|
||||
min_indent: u32,
|
||||
) -> impl Parser<'a, AssignedField<'a, Expr<'a>>, ERecord<'a>> {
|
||||
use AssignedField::*;
|
||||
|
@ -2543,7 +2543,7 @@ fn record_help<'a>(
|
|||
trailing_sep_by0(
|
||||
word1(b',', ERecord::End),
|
||||
space0_before_optional_after(
|
||||
loc!(record_field_help(min_indent)),
|
||||
loc!(record_value_field(min_indent)),
|
||||
min_indent,
|
||||
ERecord::IndentEnd,
|
||||
ERecord::IndentEnd
|
||||
|
|
|
@ -666,22 +666,33 @@ pub enum ETypeAbilityImpl<'a> {
|
|||
IndentColon(Position),
|
||||
IndentOptional(Position),
|
||||
IndentEnd(Position),
|
||||
Updateable(Position),
|
||||
QuestionMark(Position),
|
||||
Bar(Position),
|
||||
Ampersand(Position),
|
||||
Expr(&'a EExpr<'a>, Position),
|
||||
IndentBar(Position),
|
||||
IndentAmpersand(Position),
|
||||
}
|
||||
|
||||
impl<'a> From<ETypeRecord<'a>> for ETypeAbilityImpl<'a> {
|
||||
fn from(e: ETypeRecord<'a>) -> Self {
|
||||
impl<'a> From<ERecord<'a>> for ETypeAbilityImpl<'a> {
|
||||
fn from(e: ERecord<'a>) -> Self {
|
||||
match e {
|
||||
ETypeRecord::End(p) => ETypeAbilityImpl::End(p),
|
||||
ETypeRecord::Open(p) => ETypeAbilityImpl::Open(p),
|
||||
ETypeRecord::Field(p) => ETypeAbilityImpl::Field(p),
|
||||
ETypeRecord::Colon(p) => ETypeAbilityImpl::Colon(p),
|
||||
ETypeRecord::Optional(p) => ETypeAbilityImpl::Optional(p),
|
||||
ETypeRecord::Type(t, p) => ETypeAbilityImpl::Type(t, p),
|
||||
ETypeRecord::Space(s, p) => ETypeAbilityImpl::Space(s, p),
|
||||
ETypeRecord::IndentOpen(p) => ETypeAbilityImpl::IndentOpen(p),
|
||||
ETypeRecord::IndentColon(p) => ETypeAbilityImpl::IndentColon(p),
|
||||
ETypeRecord::IndentOptional(p) => ETypeAbilityImpl::IndentOptional(p),
|
||||
ETypeRecord::IndentEnd(p) => ETypeAbilityImpl::IndentEnd(p),
|
||||
ERecord::End(p) => ETypeAbilityImpl::End(p),
|
||||
ERecord::Open(p) => ETypeAbilityImpl::Open(p),
|
||||
ERecord::Field(p) => ETypeAbilityImpl::Field(p),
|
||||
ERecord::Colon(p) => ETypeAbilityImpl::Colon(p),
|
||||
ERecord::Space(s, p) => ETypeAbilityImpl::Space(s, p),
|
||||
ERecord::IndentOpen(p) => ETypeAbilityImpl::IndentOpen(p),
|
||||
ERecord::IndentColon(p) => ETypeAbilityImpl::IndentColon(p),
|
||||
ERecord::IndentEnd(p) => ETypeAbilityImpl::IndentEnd(p),
|
||||
ERecord::Updateable(p) => ETypeAbilityImpl::Updateable(p),
|
||||
ERecord::QuestionMark(p) => ETypeAbilityImpl::QuestionMark(p),
|
||||
ERecord::Bar(p) => ETypeAbilityImpl::Bar(p),
|
||||
ERecord::Ampersand(p) => ETypeAbilityImpl::Ampersand(p),
|
||||
ERecord::Expr(e, p) => ETypeAbilityImpl::Expr(e, p),
|
||||
ERecord::IndentBar(p) => ETypeAbilityImpl::IndentBar(p),
|
||||
ERecord::IndentAmpersand(p) => ETypeAbilityImpl::IndentAmpersand(p),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ use crate::ast::{
|
|||
Spaced, Tag, TypeAnnotation, TypeHeader,
|
||||
};
|
||||
use crate::blankspace::{space0_around_ee, space0_before_e, space0_e};
|
||||
use crate::expr::record_value_field;
|
||||
use crate::ident::lowercase_ident;
|
||||
use crate::keyword;
|
||||
use crate::parser::{
|
||||
|
@ -10,7 +11,7 @@ use crate::parser::{
|
|||
ETypeApply, ETypeInParens, ETypeInlineAlias, ETypeRecord, ETypeTagUnion, ParseResult, Parser,
|
||||
Progress::{self, *},
|
||||
};
|
||||
use crate::parser::{then, ETypeAbilityImpl};
|
||||
use crate::parser::{then, ERecord, ETypeAbilityImpl};
|
||||
use crate::state::State;
|
||||
use bumpalo::collections::vec::Vec;
|
||||
use bumpalo::Bump;
|
||||
|
@ -515,8 +516,8 @@ fn parse_has_ability<'a>(min_indent: u32) -> impl Parser<'a, HasAbility<'a>, ETy
|
|||
collection_trailing_sep_e!(
|
||||
word1(b'{', ETypeAbilityImpl::Open),
|
||||
specialize(
|
||||
|e: ETypeRecord<'_>, _| e.into(),
|
||||
loc!(record_type_field(min_indent + 1))
|
||||
|e: ERecord<'_>, _| e.into(),
|
||||
loc!(record_value_field(min_indent + 1))
|
||||
),
|
||||
word1(b',', ETypeAbilityImpl::End),
|
||||
word1(b'}', ETypeAbilityImpl::End),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue