use super::*;
pub fn parse_subject_usage<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::SUBJECT_USAGE);
p.expect(SyntaxKind::SUBJECT_KW);
p.skip_trivia();
parse_optional_identification(p);
parse_optional_multiplicity(p);
parse_optional_typing(p);
parse_specializations_with_skip(p);
parse_optional_multiplicity(p);
parse_optional_default_value(p);
p.parse_body();
p.finish_node();
}
pub fn parse_actor_usage<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::ACTOR_USAGE);
p.expect(SyntaxKind::ACTOR_KW);
p.skip_trivia();
parse_optional_identification(p);
parse_optional_multiplicity(p);
parse_optional_typing(p);
parse_specializations_with_skip(p);
parse_optional_multiplicity(p);
parse_optional_default_value(p);
p.expect(SyntaxKind::SEMICOLON);
p.finish_node();
}
pub fn parse_stakeholder_usage<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::STAKEHOLDER_USAGE);
p.expect(SyntaxKind::STAKEHOLDER_KW);
p.skip_trivia();
parse_optional_identification(p);
parse_optional_multiplicity(p);
parse_optional_typing(p);
p.expect(SyntaxKind::SEMICOLON);
p.finish_node();
}
pub fn parse_objective_usage<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::OBJECTIVE_USAGE);
p.expect(SyntaxKind::OBJECTIVE_KW);
p.skip_trivia();
parse_optional_identification(p);
parse_optional_multiplicity(p);
parse_optional_typing(p);
parse_specializations_with_skip(p);
parse_optional_multiplicity(p);
p.parse_body();
p.finish_node();
}
pub fn parse_requirement_constraint<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::USAGE);
p.start_node(SyntaxKind::REQUIREMENT_CONSTRAINT);
p.bump();
p.skip_trivia();
while p.at(SyntaxKind::HASH) {
parse_prefix_metadata(p);
p.skip_trivia();
}
let has_constraint_kw = p.at(SyntaxKind::CONSTRAINT_KW);
if has_constraint_kw {
p.bump();
p.skip_trivia();
}
p.finish_node();
if p.at_name_token() || p.at(SyntaxKind::LT) {
if has_constraint_kw {
p.parse_identification();
} else {
p.parse_qualified_name();
}
p.skip_trivia();
}
if p.at(SyntaxKind::COLON) || p.at(SyntaxKind::COLON_GT) || p.at(SyntaxKind::COLON_GT_GT) {
if p.at(SyntaxKind::COLON) {
p.parse_typing();
p.skip_trivia();
} else {
p.start_node(SyntaxKind::SPECIALIZATION);
p.bump(); p.skip_trivia();
if p.at_name_token() {
p.parse_qualified_name();
}
p.finish_node();
p.skip_trivia();
}
}
if p.at(SyntaxKind::L_BRACE) || p.at(SyntaxKind::L_PAREN) {
p.parse_constraint_body();
} else {
p.expect(SyntaxKind::SEMICOLON);
}
p.finish_node(); }
pub fn parse_requirement_verification<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::USAGE);
p.start_node(SyntaxKind::REQUIREMENT_VERIFICATION);
consume_if(p, SyntaxKind::ASSERT_KW);
consume_if(p, SyntaxKind::NOT_KW);
if p.at(SyntaxKind::SATISFY_KW) || p.at(SyntaxKind::VERIFY_KW) {
bump_keyword(p);
}
consume_if(p, SyntaxKind::REQUIREMENT_KW);
if p.at(SyntaxKind::COLON) {
p.parse_typing();
p.skip_trivia();
} else if p.at_name_token() || p.at(SyntaxKind::LT) {
parse_qualified_name_and_skip(p);
if p.at(SyntaxKind::COLON) {
p.parse_typing();
p.skip_trivia();
}
}
if consume_if(p, SyntaxKind::BY_KW) {
p.parse_qualified_name();
p.skip_trivia();
}
p.finish_node();
if p.at(SyntaxKind::L_BRACE) {
p.parse_constraint_body();
} else {
p.expect(SyntaxKind::SEMICOLON);
}
p.finish_node(); }
pub fn parse_exhibit_usage<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::USAGE);
expect_and_skip(p, SyntaxKind::EXHIBIT_KW);
if p.at(SyntaxKind::STATE_KW) {
bump_keyword(p);
if p.at_name_token() || p.at(SyntaxKind::LT) {
p.parse_identification();
}
p.skip_trivia();
if p.at(SyntaxKind::L_BRACKET) {
p.parse_multiplicity();
}
p.skip_trivia();
if p.at(SyntaxKind::COLON) {
p.parse_typing();
}
p.skip_trivia();
parse_specializations(p);
p.skip_trivia();
parse_state_body(p);
} else {
if p.at_name_token() {
p.parse_qualified_name();
}
p.skip_trivia();
p.expect(SyntaxKind::SEMICOLON);
}
p.finish_node();
}
pub fn parse_allocate_usage<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::USAGE);
expect_and_skip(p, SyntaxKind::ALLOCATE_KW);
if p.at(SyntaxKind::L_PAREN) {
bump_keyword(p);
if p.at_name_token() {
p.parse_qualified_name();
p.skip_trivia();
}
while p.at(SyntaxKind::COMMA) {
bump_keyword(p); if p.at_name_token() {
p.parse_qualified_name();
p.skip_trivia();
}
}
p.expect(SyntaxKind::R_PAREN);
p.skip_trivia();
} else {
if p.at_name_token() {
p.parse_qualified_name();
p.skip_trivia();
}
if p.at(SyntaxKind::TO_KW) {
p.bump();
p.skip_trivia();
if p.at_name_token() {
p.parse_qualified_name();
p.skip_trivia();
}
}
}
parse_body_or_semicolon(p);
p.finish_node();
}
pub fn parse_include_usage<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::USAGE);
expect_and_skip(p, SyntaxKind::INCLUDE_KW);
consume_if(p, SyntaxKind::USE_KW);
consume_if(p, SyntaxKind::CASE_KW);
if p.at_name_token() {
let peek1 = p.peek_kind(1);
let has_typing_or_spec = matches!(
peek1,
SyntaxKind::COLON
| SyntaxKind::TYPED_KW
| SyntaxKind::OF_KW
| SyntaxKind::COLON_GT
| SyntaxKind::COLON_GT_GT
| SyntaxKind::COLON_COLON_GT
| SyntaxKind::SPECIALIZES_KW
| SyntaxKind::SUBSETS_KW
| SyntaxKind::REDEFINES_KW
| SyntaxKind::REFERENCES_KW
| SyntaxKind::L_BRACKET | SyntaxKind::L_BRACE );
if has_typing_or_spec {
p.parse_identification();
} else {
p.parse_qualified_name();
}
}
p.skip_trivia();
if p.at_any(&[
SyntaxKind::COLON,
SyntaxKind::TYPED_KW,
SyntaxKind::OF_KW,
SyntaxKind::COLON_GT,
SyntaxKind::COLON_GT_GT,
SyntaxKind::COLON_COLON_GT,
SyntaxKind::SPECIALIZES_KW,
SyntaxKind::SUBSETS_KW,
SyntaxKind::REDEFINES_KW,
SyntaxKind::REFERENCES_KW,
]) {
parse_specializations(p);
p.skip_trivia();
}
if p.at(SyntaxKind::L_BRACKET) {
p.parse_multiplicity();
p.skip_trivia();
}
parse_body_or_semicolon(p);
p.finish_node();
}
pub fn parse_expose_statement<P: SysMLParser>(p: &mut P) {
p.start_node(SyntaxKind::IMPORT);
p.expect(SyntaxKind::EXPOSE_KW);
p.skip_trivia();
if p.at_name_token() {
p.parse_qualified_name();
p.skip_trivia();
}
if p.at(SyntaxKind::COLON_COLON) {
p.bump();
p.skip_trivia();
if p.at(SyntaxKind::STAR) || p.at(SyntaxKind::STAR_STAR) {
p.bump();
p.skip_trivia();
}
}
p.expect(SyntaxKind::SEMICOLON);
p.finish_node();
}