///|
pub fn Token::to_expect_string(self : Self) -> String {
  self.kind().to_expect_string()
}

///|
pub fn TokenKind::to_expect_string(self : Self) -> String {
  match self {
    TK_CHAR => "char"
    TK_INT => "int"
    TK_BYTE => "b'...'"
    TK_BYTES => "b\"...\""
    TK_FLOAT => "float"
    TK_DOUBLE => "double"
    TK_STRING => "string"
    TK_MULTILINE_STRING => "`#|...`"
    TK_MULTILINE_INTERP => "`$|...`"
    TK_INTERP => "string interpolation"
    TK_BYTES_INTERP => "bytes interpolation"
    TK_ATTRIBUTE => "`#attribute`"
    TK_LIDENT => "id (lowercase start)"
    TK_UIDENT => "id (uppercase start)"
    TK_POST_LABEL => "`label~`"
    TK_POST_LABEL_TRANSPARENT => "`label~~`"
    TK_COMMENT => "COMMENT"
    TK_NEWLINE => "NEWLINE"
    TK_INFIX1 | TK_INFIX2 | TK_INFIX3 | TK_INFIX4 => "infix operator"
    TK_AUGMENTED_ASSIGNMENT => "augmented assignment"
    TK_PLUS_EQUAL => "`+=`"
    TK_EOF => "EOF"
    TK_FALSE => "`false`"
    TK_TRUE => "`true`"
    TK_PUB => "`pub`"
    TK_PRIV => "`priv`"
    TK_READONLY => "`readonly`"
    TK_IMPORT => "`import`"
    TK_EXTERN => "`extern`"
    TK_BREAK => "`break`"
    TK_CONTINUE => "`continue`"
    TK_STRUCT => "`struct`"
    TK_ENUM => "`enum`"
    TK_TRAIT => "`trait`"
    TK_DERIVE => "`derive`"
    TK_IMPL => "`impl`"
    TK_WITH => "`with`"
    TK_RAISE => "`raise`"
    TK_THROW => "`throw`"
    TK_TRY => "`try`"
    TK_CATCH => "`catch`"
    TK_ASYNC => "`async`"
    TK_TYPEALIAS => "`typealias`"
    TK_TRAITALIAS => "`traitalias`"
    TK_FNALIAS => "`fnalias`"
    TK_EQUAL => "`=`"
    TK_EQ_TILDE => "`=~`"
    TK_LPAREN => "`(`"
    TK_RPAREN => "`)`"
    TK_COMMA => "`,`"
    TK_MINUS => "`-`"
    TK_QUESTION => "`?`"
    TK_EXCLAMATION => "`!`"
    TK_DOT_LIDENT => "`.id` (lowercase start)"
    TK_DOT_UIDENT => "`.id` (uppercase start)"
    TK_DOT_INT => "`.` int"
    TK_DOT_LPAREN => "`.(`"
    TK_COLONCOLON => "`::`"
    TK_COLON => "`:`"
    TK_SEMI => "`;`"
    TK_LBRACKET => "`[`"
    TK_LBRACKET_BAR => "`[|`"
    TK_PLUS => "`+`"
    TK_RBRACKET => "`]`"
    TK_BAR_RBRACKET => "`|]`"
    TK_UNDERSCORE => "`_`"
    TK_BAR => "`|`"
    TK_LBRACE => "`{`"
    TK_RBRACE => "`}`"
    TK_AMPERAMPER => "`&&`"
    TK_AMPER => "`&`"
    TK_CARET => "`^`"
    TK_BARBAR => "`||`"
    TK_PACKAGE_NAME => "`@pkg.id`"
    TK_AS => "`as`"
    TK_PIPE => "`|>`"
    TK_PIPE_LEFT => "`<|`"
    TK_LT_PLUS => "`<+`"
    TK_LT_QUESTION => "` "`else`"
    TK_FN => "`fn`"
    TK_IF => "`if`"
    TK_LET => "`let`"
    TK_PROOF_ASSERT => "`proof_assert`"
    TK_PROOF_LET => "`proof_let`"
    TK_CONST => "`const`"
    TK_MATCH => "`match`"
    TK_USING => "`using`"
    TK_MUTABLE => "`mut`"
    TK_TYPE => "`type`"
    TK_FAT_ARROW => "`=>`"
    TK_THIN_ARROW => "`->`"
    TK_WHILE => "`while`"
    TK_RETURN => "`return`"
    TK_DOTDOT => "`..`"
    TK_RANGE_INCLUSIVE => "`..=`"
    TK_RANGE_EXCLUSIVE => "`..<`"
    TK_ELLIPSIS => "`...`"
    TK_TEST => "`test`"
    TK_LOOP => "`loop`"
    TK_GUARD => "`guard`"
    TK_GUARD_EXCLAMATION => "`guard!`"
    TK_DEFER => "`defer`"
    TK_FOR => "`for`"
    TK_IN => "`in`"
    TK_IS => "`is`"
    TK_SUBERROR => "`suberror`"
    TK_AND => "`and`"
    TK_FORALL => "`∀`"
    TK_EXISTS => "`∃`"
    TK_IMPLIES => "`→`"
    TK_LETREC => "`letrec`"
    TK_ENUMVIEW => "`enumview`"
    TK_NORAISE => "`noraise`"
    TK_TRY_QUESTION => "`try?`"
    TK_TRY_EXCLAMATION => "`try!`"
    TK_LEXMATCH => "lexmatch"
    TK_LEXMATCH_QUESTION => "lexmatch?"
    TK_LEXSCAN => "`lexscan`"
    TK_EXTEND => "`extend`"
    TK_REGEX_LITERAL => "regex"
    TK_REGEX_INTERP => "regex interp"
    TK_DECLARE => "declare"
    TK_RANGE_EXCLUSIVE_REV => ">.."
    TK_RANGE_INCLUSIVE_REV => ">=.."
    TK_RANGE_LT_INCLUSIVE => "..<="
    TK_WHERE => "where"
    TK_NOBREAK => "nobreak"
    TK_PACKAGE => "package"
    TK_EXTENUM => "extenum"
  }
}