use super::*;
fn parse_featuring_relationship<P: KerMLParser>(p: &mut P) {
bump_and_skip(p);
if p.at_name_token() {
parse_identification_and_skip(p);
if p.at(SyntaxKind::OF_KW) {
bump_and_skip(p);
parse_optional_qualified_name(p);
}
}
if p.at(SyntaxKind::BY_KW) {
bump_and_skip(p);
parse_optional_qualified_name(p);
}
}
fn parse_typing_relationship<P: KerMLParser>(p: &mut P) {
bump_and_skip(p);
parse_optional_qualified_name(p);
if p.at(SyntaxKind::COLON) || p.at(SyntaxKind::TYPED_KW) {
parse_typing(p);
}
}
fn parse_conjugation_relationship<P: KerMLParser>(p: &mut P) {
let is_shorthand = p.at(SyntaxKind::CONJUGATE_KW);
bump_and_skip(p);
if is_shorthand {
parse_optional_qualified_name(p);
if p.at(SyntaxKind::CONJUGATES_KW) || p.at(SyntaxKind::TILDE) {
bump_and_skip(p);
}
parse_optional_qualified_name(p);
} else {
if p.at_name_token() && !p.at(SyntaxKind::CONJUGATE_KW) {
parse_identification_and_skip(p);
}
consume_if(p, SyntaxKind::CONJUGATE_KW);
parse_optional_qualified_name(p);
if p.at(SyntaxKind::CONJUGATES_KW) || p.at(SyntaxKind::TILDE) {
bump_and_skip(p);
}
parse_optional_qualified_name(p);
}
}
fn parse_generic_relationship<P: KerMLParser>(p: &mut P) {
if p.at_any(STANDALONE_RELATIONSHIP_KEYWORDS) {
bump_and_skip(p);
}
parse_optional_qualified_name(p);
if p.at_any(RELATIONSHIP_OPERATORS) {
bump_and_skip(p);
}
parse_optional_qualified_name(p);
}
pub fn parse_standalone_relationship<P: KerMLParser>(p: &mut P) {
p.start_node(SyntaxKind::RELATIONSHIP);
if p.at(SyntaxKind::SPECIALIZATION_KW) {
bump_and_skip(p);
if p.at_name_token()
&& !p.at_any(&[
SyntaxKind::SUBCLASSIFIER_KW,
SyntaxKind::SUBTYPE_KW,
SyntaxKind::SUBSET_KW,
SyntaxKind::REDEFINITION_KW,
SyntaxKind::TYPING_KW,
])
{
parse_identification_and_skip(p);
}
}
if p.at(SyntaxKind::FEATURING_KW) {
parse_featuring_relationship(p);
} else if p.at(SyntaxKind::TYPING_KW) {
parse_typing_relationship(p);
} else if p.at(SyntaxKind::CONJUGATION_KW) || p.at(SyntaxKind::CONJUGATE_KW) {
parse_conjugation_relationship(p);
} else {
parse_generic_relationship(p);
}
p.parse_body();
p.finish_node();
}
pub fn parse_dependency<P: KerMLParser>(p: &mut P) {
p.start_node(SyntaxKind::DEPENDENCY);
expect_and_skip(p, SyntaxKind::DEPENDENCY_KW);
if p.at(SyntaxKind::FROM_KW) {
bump_and_skip(p);
} else if p.at(SyntaxKind::LT) {
parse_identification_and_skip(p);
if p.at(SyntaxKind::FROM_KW) {
bump_and_skip(p);
}
} else if p.at_name_token() && !p.at(SyntaxKind::TO_KW) {
let peek1 = p.peek_kind(1);
let peek2 = p.peek_kind(2);
if peek1 == SyntaxKind::FROM_KW || peek2 == SyntaxKind::FROM_KW {
parse_identification_and_skip(p);
if p.at(SyntaxKind::FROM_KW) {
bump_and_skip(p);
}
}
}
if p.at_name_token() && !p.at(SyntaxKind::TO_KW) {
parse_comma_separated_names(p);
}
expect_and_skip(p, SyntaxKind::TO_KW);
if p.at_name_token() {
parse_comma_separated_names(p);
}
p.parse_body();
p.finish_node();
}
pub fn parse_textual_representation<P: KerMLParser>(p: &mut P) {
p.start_node(SyntaxKind::TEXTUAL_REP);
if p.at(SyntaxKind::REP_KW) {
bump_and_skip(p);
if p.at_name_token() || p.at(SyntaxKind::LT) {
parse_identification_and_skip(p);
}
}
expect_and_skip(p, SyntaxKind::LANGUAGE_KW);
expect_and_skip(p, SyntaxKind::STRING);
if p.at(SyntaxKind::SEMICOLON) {
p.bump();
}
p.finish_node();
}
pub fn parse_disjoint<P: KerMLParser>(p: &mut P) {
p.start_node(SyntaxKind::RELATIONSHIP);
expect_and_skip(p, SyntaxKind::DISJOINT_KW);
if p.at_name_token() {
parse_feature_chain_or_qualified_name(p);
}
if p.at(SyntaxKind::FROM_KW) {
bump_and_skip(p);
if p.at_name_token() {
parse_feature_chain_or_qualified_name(p);
}
}
p.parse_body();
p.finish_node();
}
pub fn parse_feature_chain_or_qualified_name<P: KerMLParser>(p: &mut P) {
p.start_node(SyntaxKind::QUALIFIED_NAME);
if p.at_name_token() {
p.bump();
}
p.skip_trivia();
while p.at(SyntaxKind::COLON_COLON) || p.at(SyntaxKind::DOT) {
p.bump(); p.skip_trivia();
if p.at_name_token() {
p.bump();
}
p.skip_trivia();
}
p.finish_node();
p.skip_trivia();
}
pub fn parse_filter<P: KerMLParser>(p: &mut P) {
p.start_node(SyntaxKind::ELEMENT_FILTER_MEMBER);
expect_and_skip(p, SyntaxKind::FILTER_KW);
kerml_expressions::parse_expression(p);
p.skip_trivia();
p.expect(SyntaxKind::SEMICOLON);
p.finish_node();
}
pub fn parse_inverting_relationship<P: KerMLParser>(p: &mut P) {
p.start_node(SyntaxKind::RELATIONSHIP);
if p.at(SyntaxKind::INVERTING_KW) {
bump_and_skip(p);
if p.at_name_token() && !p.at(SyntaxKind::INVERSE_KW) {
parse_identification_and_skip(p);
}
}
expect_and_skip(p, SyntaxKind::INVERSE_KW);
parse_optional_qualified_name(p);
expect_and_skip(p, SyntaxKind::OF_KW);
parse_optional_qualified_name(p);
p.parse_body();
p.finish_node();
}