use super::*;
pub fn parse_state_subaction<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::STATE_SUBACTION);
bump_keyword(p);
if p.at(SyntaxKind::ASSIGN_KW) {
parse_assign_action(p);
} else if p.at(SyntaxKind::SEND_KW) {
parse_send_action(p);
} else if p.at(SyntaxKind::ACCEPT_KW) {
parse_accept_action(p);
} else if p.at(SyntaxKind::ACTION_KW) {
p.bump(); p.skip_trivia();
if p.at_name_token() || p.at(SyntaxKind::LT) {
p.parse_identification();
p.skip_trivia();
}
if p.at(SyntaxKind::COLON) {
p.parse_typing();
p.skip_trivia();
}
parse_specializations(p);
p.skip_trivia();
if p.at(SyntaxKind::L_BRACKET) {
p.parse_multiplicity();
p.skip_trivia();
}
parse_action_body(p);
} else if p.at(SyntaxKind::SEMICOLON) {
p.bump();
} else if p.at_name_token() {
p.parse_identification();
p.skip_trivia();
if p.at(SyntaxKind::COLON) {
p.parse_typing();
p.skip_trivia();
}
parse_specializations(p);
p.skip_trivia();
if p.at(SyntaxKind::L_BRACKET) {
p.parse_multiplicity();
p.skip_trivia();
}
if p.at(SyntaxKind::L_BRACE) {
parse_action_body(p);
} else if p.at(SyntaxKind::SEMICOLON) {
p.bump();
}
}
p.finish_node();
}
pub fn parse_transition<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::USAGE);
p.start_node(SyntaxKind::TRANSITION_USAGE);
p.expect(SyntaxKind::TRANSITION_KW);
p.skip_trivia();
if p.at_name_token() && !p.at(SyntaxKind::FIRST_KW) {
let is_transition_name = p.peek_kind(1) == SyntaxKind::FIRST_KW
|| p.peek_kind(1) == SyntaxKind::WHITESPACE && p.peek_kind(2) == SyntaxKind::FIRST_KW;
if is_transition_name {
p.parse_identification();
p.skip_trivia();
}
}
if p.at(SyntaxKind::FIRST_KW) {
bump_keyword(p);
}
if p.at_name_token()
&& !p.at(SyntaxKind::ACCEPT_KW)
&& !p.at(SyntaxKind::IF_KW)
&& !p.at(SyntaxKind::DO_KW)
&& !p.at(SyntaxKind::THEN_KW)
{
p.start_node(SyntaxKind::SPECIALIZATION);
p.parse_qualified_name();
p.finish_node();
p.skip_trivia();
}
if p.at(SyntaxKind::ACCEPT_KW) {
p.bump(); p.skip_trivia();
if (p.at_name_token() || p.at(SyntaxKind::LT))
&& !p.at(SyntaxKind::AT_KW)
&& !p.at(SyntaxKind::AFTER_KW)
&& !p.at(SyntaxKind::WHEN_KW)
&& !p.at(SyntaxKind::VIA_KW)
{
p.parse_identification();
p.skip_trivia();
}
if p.at(SyntaxKind::COLON) || p.at(SyntaxKind::COLON_GT) {
p.parse_typing();
p.skip_trivia();
}
if p.at(SyntaxKind::AT_KW) || p.at(SyntaxKind::AFTER_KW) || p.at(SyntaxKind::WHEN_KW) {
p.bump();
p.skip_trivia();
parse_expression(p);
p.skip_trivia();
}
if p.at(SyntaxKind::VIA_KW) {
p.bump();
p.skip_trivia();
p.parse_qualified_name();
p.skip_trivia();
}
}
if consume_if(p, SyntaxKind::IF_KW) {
parse_expression(p);
p.skip_trivia();
}
if consume_if(p, SyntaxKind::DO_KW) {
if p.at(SyntaxKind::SEND_KW) {
parse_inline_send_action(p);
} else if p.at(SyntaxKind::ACCEPT_KW) {
parse_accept_action(p);
} else if p.at(SyntaxKind::ASSIGN_KW) {
bump_keyword(p);
p.parse_qualified_name();
p.skip_trivia();
if p.at(SyntaxKind::COLON_EQ) {
bump_keyword(p);
parse_expression(p);
}
} else if p.at(SyntaxKind::ACTION_KW) {
parse_inline_action(p);
} else if p.at_name_token() {
p.parse_qualified_name();
}
p.skip_trivia();
}
if p.at(SyntaxKind::THEN_KW) {
p.bump();
p.skip_trivia();
if p.at_name_token() {
p.start_node(SyntaxKind::SPECIALIZATION);
p.parse_qualified_name();
p.finish_node();
p.skip_trivia();
}
}
p.finish_node();
p.parse_body();
p.finish_node(); }