Tidy up grammar around method predicates and exploders.

This commit is contained in:
James Harton 2018-09-06 18:02:55 +12:00
parent 4892ba3d4e
commit a3ae75d66f
3 changed files with 60 additions and 3 deletions

View file

@ -140,8 +140,7 @@ def_type = { "deftype" }
def_impl = { "defimpl" }
def_name = ${ identifier ~ def_modifier? }
def_predicate = { "?" }
def_bang = { "!" }
def_modifier = _{ def_predicate | def_bang }
def_modifier = _{ def_predicate }
def_return_type = { "<" ~ variable ~ ">" }
def_fn = _{ def_fn_keyword ~ def_return_type? ~ def_name ~ argument_list? }
def_ty = _{ def_type_keyword ~ def_name ~ argument_list? }
@ -207,6 +206,8 @@ unary_operator = _{ plus | minus | logical_not }
call_test = _{ soi ~ call ~ eoi }
call = ${ call_receiver ~ "." ~ call_message ~ call_arguments }
call_receiver = { identifier }
call_message = { identifier }
call_message = ${ identifier ~ (call_predicate | call_bang)? }
call_predicate = { "?" }
call_bang = { "!" }
call_arguments = !{ "(" ~ (call_argument ~ ("," ~ call_argument)*)? ~ ")" }
call_argument = { expression }

View file

@ -34,3 +34,41 @@ fn call_with_args() {
]
)
}
#[test]
fn call_with_predicate() {
parses_to!(
parser: Grammar,
input: "marty.mcfly?()",
rule: Rule::call_test,
tokens: [
call(0, 14, [
call_receiver(0, 5, [identifier(0, 5)]),
call_message(6, 12, [
identifier(6, 11),
call_predicate(11, 12)
]),
call_arguments(12, 14)
])
]
)
}
#[test]
fn call_with_explosion() {
parses_to!(
parser: Grammar,
input: "marty.mcfly!()",
rule: Rule::call_test,
tokens: [
call(0, 14, [
call_receiver(0, 5, [identifier(0, 5)]),
call_message(6, 12, [
identifier(6, 11),
call_bang(11, 12)
]),
call_arguments(12, 14)
])
]
)
}

View file

@ -133,6 +133,24 @@ fn define_constructor() {
)
}
#[test]
fn define_function_with_predicate() {
parses_to!(
parser: Grammar,
input: "defp name?",
rule: Rule::def_test,
tokens: [
def(0, 10, [
def_private(0, 4),
def_name(5, 10, [
identifier(5, 9),
def_predicate(9, 10),
])
])
]
)
}
#[test]
fn def_trait_type_only() {
parses_to!(