parol-ls 4.4.0

Language server for parol parser generator
use crate::{
    parol_ls_grammar::OwnedToken,
    parol_ls_grammar_trait::{
        ScannerDirectivesPercentSkipIdentifierList,
        ScannerDirectivesPercentOnIdentifierListScannerStateDirectives, ScannerStateDirectives,
        TokenLiteral, UserTypeName,
    },
};

pub(super) trait LastToken {
    fn get_last_token(&self) -> &OwnedToken;
}

impl LastToken for UserTypeName {
    fn get_last_token(&self) -> &OwnedToken {
        if self.user_type_name_list.is_empty() {
            &self.identifier.identifier
        } else {
            &self
                .user_type_name_list
                .last()
                .unwrap()
                .identifier
                .identifier
        }
    }
}

impl LastToken for TokenLiteral {
    fn get_last_token(&self) -> &OwnedToken {
        match self {
            TokenLiteral::String(s) => &s.string.string,
            TokenLiteral::LiteralString(l) => &l.literal_string.literal_string,
            TokenLiteral::Regex(r) => &r.regex.regex,
        }
    }
}

impl LastToken for ScannerDirectivesPercentOnIdentifierListScannerStateDirectives {
    fn get_last_token(&self) -> &OwnedToken {
        match &self.scanner_state_directives {
            ScannerStateDirectives::PercentEnterIdentifier(
                scanner_state_directives_percent_enter_identifier,
            ) => {
                &scanner_state_directives_percent_enter_identifier
                    .identifier
                    .identifier
            }
            ScannerStateDirectives::PercentPushIdentifier(
                scanner_state_directives_percent_push_identifier,
            ) => {
                &scanner_state_directives_percent_push_identifier
                    .identifier
                    .identifier
            }
            ScannerStateDirectives::PercentPop(scanner_state_directives_percent_pop) => {
                &scanner_state_directives_percent_pop.percent_pop
            }
        }
    }
}

impl LastToken for ScannerDirectivesPercentSkipIdentifierList {
    fn get_last_token(&self) -> &OwnedToken {
        if self.identifier_list.identifier_list_list.is_empty() {
            &self.identifier_list.identifier.identifier
        } else {
            &self
                .identifier_list
                .identifier_list_list
                .last()
                .unwrap()
                .identifier
                .identifier
        }
    }
}