use super::*;
use df_ls_diagnostics::{DMExtraInfo, DiagnosticsInfo};
#[derive(Debug, PartialEq, Eq)]
enum TokenizeTokenNamePhase {
TokenNameFound,
TokenNameError,
TokenNameEoF,
}
pub(crate) fn tokenize_token_name(
tok_help: &mut TokenizerHelper,
regex_list: &RegexList,
diagnostics: &mut DiagnosticsInfo,
token_id: u64,
) -> TokenizerResult {
let current_phase = if tok_help.check_if_next_char_matches_any_of(&[':', '[', ']']) {
TokenizeTokenNamePhase::TokenNameError
} else {
let token_name = tok_help.get_next_match(
®ex_list.token_name,
"token_name",
Some("token_name"),
false,
true,
);
match token_name {
TokenMatchStatus::Ok(result) => {
tok_help.add_node_to_tree(result, token_id);
TokenizeTokenNamePhase::TokenNameFound
}
TokenMatchStatus::OkWithPrefixFound(prefix, result) => {
utils::handle_prefix(prefix, diagnostics);
tok_help.add_node_to_tree(result, token_id);
TokenizeTokenNamePhase::TokenNameFound
}
TokenMatchStatus::NoMatch => TokenizeTokenNamePhase::TokenNameError,
TokenMatchStatus::EoF => TokenizeTokenNamePhase::TokenNameEoF,
}
};
if current_phase == TokenizeTokenNamePhase::TokenNameError
|| current_phase == TokenizeTokenNamePhase::TokenNameEoF
{
let token_name = tok_help.create_start_tsnode("token_name", Some("token_name"));
diagnostics.add_message(
DMExtraInfo::new(token_name.get_range()),
"missing_token_name",
);
tok_help.add_node_to_tree(token_name, token_id);
}
if current_phase == TokenizeTokenNamePhase::TokenNameEoF {
return TokenizerResult::Err(TokenizerEnd::UnexpectedEoF);
}
let token_name_incorrect = tok_help.get_next_match(
®ex_list.token_argument_all,
"ERROR",
Some("ERROR"),
true,
true,
);
if let TokenMatchStatus::Ok(result) = token_name_incorrect {
diagnostics.add_message(
DMExtraInfo::new(result.get_range()),
"unexpected_characters",
);
tok_help.add_node_to_tree(result, token_id);
}
Ok(())
}