From a3ae75d66fec8cd76f734b9dc7146ffcc219f431 Mon Sep 17 00:00:00 2001 From: James Harton Date: Thu, 6 Sep 2018 18:02:55 +1200 Subject: [PATCH] Tidy up grammar around method predicates and exploders. --- parser/src/grammar.pest | 7 +++--- parser/src/grammar/test/call.rs | 38 +++++++++++++++++++++++++++++++++ parser/src/grammar/test/def.rs | 18 ++++++++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 9163de2..6e22677 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -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 } diff --git a/parser/src/grammar/test/call.rs b/parser/src/grammar/test/call.rs index 642848f..0baabd3 100644 --- a/parser/src/grammar/test/call.rs +++ b/parser/src/grammar/test/call.rs @@ -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) + ]) + ] + ) +} diff --git a/parser/src/grammar/test/def.rs b/parser/src/grammar/test/def.rs index 08b7bd7..6cb3728 100644 --- a/parser/src/grammar/test/def.rs +++ b/parser/src/grammar/test/def.rs @@ -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!(