ktrs-parser 0.5.0

Kotlin parser producing PSI-identical lossless trees, ported from the Kotlin compiler
Documentation
//! Token sets and token-class predicates from `KtTokens.java` (psi-api/.../lexer/KtTokens.java).
//! Individual token kinds live in [`SyntaxKind`] under their `KtTokens` field names.

use ktrs_syntax::SyntaxKind::{self, *};

use crate::token_set::TokenSet;

/// `token instanceof KtKeywordToken` (includes `KtModifierKeywordToken`).
pub fn is_keyword_token(kind: SyntaxKind) -> bool {
    kind.keyword_text().is_some()
}

/// `((KtKeywordToken) token).isSoft()`; false for non-keyword kinds.
pub fn is_soft_keyword(kind: SyntaxKind) -> bool {
    SOFT_KEYWORDS.contains(kind)
}

/// `AbstractKotlinParsing.SOFT_KEYWORD_TEXTS.get(text)`.
pub fn soft_keyword_by_text(text: Option<&str>) -> Option<SyntaxKind> {
    text.and_then(SyntaxKind::soft_keyword).filter(|&k| SOFT_KEYWORDS.contains(k))
}

pub const KEYWORDS: TokenSet = TokenSet::create(&[
    PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, CLASS_KEYWORD, INTERFACE_KEYWORD,
    THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD,
    NULL_KEYWORD,
    TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD,
    IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD,
    ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, TRY_KEYWORD, WHEN_KEYWORD,
    NOT_IN, NOT_IS, AS_SAFE,
    TYPEOF_KEYWORD,
]);

pub const SOFT_KEYWORDS: TokenSet = TokenSet::create(&[
    FILE_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD,
    SET_KEYWORD, ABSTRACT_KEYWORD, ENUM_KEYWORD, CONTRACT_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD,
    OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD,
    CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, REIFIED_KEYWORD,
    DYNAMIC_KEYWORD, COMPANION_KEYWORD, CONSTRUCTOR_KEYWORD, INIT_KEYWORD, SEALED_KEYWORD,
    FIELD_KEYWORD, PROPERTY_KEYWORD, RECEIVER_KEYWORD, PARAM_KEYWORD, SETPARAM_KEYWORD,
    DELEGATE_KEYWORD, ALL_KEYWORD,
    LATEINIT_KEYWORD,
    DATA_KEYWORD, INLINE_KEYWORD, NOINLINE_KEYWORD, TAILREC_KEYWORD, EXTERNAL_KEYWORD,
    ANNOTATION_KEYWORD, CROSSINLINE_KEYWORD, CONST_KEYWORD, OPERATOR_KEYWORD, INFIX_KEYWORD,
    SUSPEND_KEYWORD, EXPECT_KEYWORD, ACTUAL_KEYWORD,
    VALUE_KEYWORD, CONTEXT_KEYWORD,
]);

/// Canonical order matters upstream (stub serialization); keep it.
pub const MODIFIER_KEYWORDS_ARRAY: &[SyntaxKind] = &[
    PUBLIC_KEYWORD, PROTECTED_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD,
    EXPECT_KEYWORD, ACTUAL_KEYWORD,
    FINAL_KEYWORD, OPEN_KEYWORD, ABSTRACT_KEYWORD, SEALED_KEYWORD,
    CONST_KEYWORD,
    EXTERNAL_KEYWORD,
    OVERRIDE_KEYWORD,
    LATEINIT_KEYWORD,
    TAILREC_KEYWORD,
    VARARG_KEYWORD,
    SUSPEND_KEYWORD,
    INNER_KEYWORD,
    ENUM_KEYWORD, ANNOTATION_KEYWORD, FUN_KEYWORD,
    COMPANION_KEYWORD,
    INLINE_KEYWORD,
    VALUE_KEYWORD,
    INFIX_KEYWORD,
    OPERATOR_KEYWORD,
    DATA_KEYWORD,
    OUT_KEYWORD, IN_KEYWORD,
    REIFIED_KEYWORD,
    NOINLINE_KEYWORD,
    CROSSINLINE_KEYWORD,
];

pub const MODIFIER_KEYWORDS: TokenSet = TokenSet::create(MODIFIER_KEYWORDS_ARRAY);

pub const TYPE_MODIFIER_KEYWORDS: TokenSet = TokenSet::create(&[SUSPEND_KEYWORD]);
pub const TYPE_ARGUMENT_MODIFIER_KEYWORDS: TokenSet = TokenSet::create(&[IN_KEYWORD, OUT_KEYWORD]);
pub const RESERVED_VALUE_PARAMETER_MODIFIER_KEYWORDS: TokenSet = TokenSet::create(&[OUT_KEYWORD, VARARG_KEYWORD]);

pub const VISIBILITY_MODIFIERS: TokenSet =
    TokenSet::create(&[PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD]);
pub const MODALITY_MODIFIERS: TokenSet = TokenSet::create(&[ABSTRACT_KEYWORD, FINAL_KEYWORD, SEALED_KEYWORD, OPEN_KEYWORD]);

pub const WHITESPACES: TokenSet = TokenSet::create(&[WHITE_SPACE]);

pub const COMMENTS: TokenSet = TokenSet::create(&[EOL_COMMENT, BLOCK_COMMENT, DOC_COMMENT, SHEBANG_COMMENT]);
pub const WHITE_SPACE_OR_COMMENT_BIT_SET: TokenSet = TokenSet::or_set(&[COMMENTS, WHITESPACES]);

pub const STRINGS: TokenSet = TokenSet::create(&[CHARACTER_LITERAL, REGULAR_STRING_PART]);

pub const OPERATIONS: TokenSet = TokenSet::create(&[
    AS_KEYWORD, AS_SAFE, IS_KEYWORD, IN_KEYWORD, DOT, PLUSPLUS, MINUSMINUS, EXCLEXCL, MUL, PLUS,
    MINUS, EXCL, DIV, PERC, LT, GT, LTEQ, GTEQ, EQEQEQ, EXCLEQEQEQ, EQEQ, EXCLEQ, ANDAND, OROR,
    SAFE_ACCESS, ELVIS,
    RANGE, RANGE_UNTIL, EQ, MULTEQ, DIVEQ, PERCEQ, PLUSEQ, MINUSEQ,
    NOT_IN, NOT_IS,
    IDENTIFIER,
]);

pub const AUGMENTED_ASSIGNMENTS: TokenSet = TokenSet::create(&[PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ]);
pub const ALL_ASSIGNMENTS: TokenSet = TokenSet::create(&[EQ, PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ]);
pub const INCREMENT_AND_DECREMENT: TokenSet = TokenSet::create(&[PLUSPLUS, MINUSMINUS]);
pub const QUALIFIED_ACCESS: TokenSet = TokenSet::create(&[DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION]);
pub const VAL_VAR: TokenSet = TokenSet::create(&[VAL_KEYWORD, VAR_KEYWORD]);