php-kilo/src/Enum/Highlight.php

218 lines
3.7 KiB
PHP

<?php declare(strict_types=1);
namespace Aviat\Kilo\Enum;
use Aviat\Kilo\Traits;
use JsonSerializable;
/**
* @enum
*/
enum Highlight implements JsonSerializable {
use Traits\EnumTrait;
case Normal;
case Comment;
case MultiLineComment;
case Keyword1;
case Keyword2;
case String;
case Number;
case Operator;
case Variable;
case Delimiter;
case Invalid;
case SearchMatch;
case Identifier;
case Character;
case Embed;
/**
* Map a PHP syntax token to its associated highlighting type
*
* @param int $token
* @return Highlight
*/
public static function fromPHPToken(int $token): self
{
return match($token) {
// Delimiters
T_ARRAY,
T_ATTRIBUTE,
T_CURLY_OPEN,
T_DOLLAR_OPEN_CURLY_BRACES,
T_OPEN_TAG,
T_OPEN_TAG_WITH_ECHO,
T_CLOSE_TAG,
T_START_HEREDOC,
T_END_HEREDOC => Highlight::Delimiter,
// Number literals and magic constants
T_CLASS_C,
T_DIR,
T_DNUMBER,
T_LNUMBER,
T_FILE,
T_FUNC_C,
T_LINE,
T_METHOD_C,
T_NS_C,
T_NUM_STRING,
T_TRAIT_C => Highlight::Number,
// String literals
T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE => Highlight::String,
// Simple variables
T_VARIABLE, T_STRING_VARNAME => Highlight::Variable,
// Operators
T_AS,
T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG,
T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG,
T_AND_EQUAL,
T_BOOLEAN_AND,
T_BOOLEAN_OR,
T_COALESCE,
T_COALESCE_EQUAL,
T_CONCAT_EQUAL,
T_DEC,
T_DIV_EQUAL,
T_DOUBLE_ARROW,
T_DOUBLE_COLON,
T_ELLIPSIS,
T_INC,
T_INSTANCEOF,
T_INSTEADOF,
T_IS_EQUAL,
T_IS_GREATER_OR_EQUAL,
T_IS_IDENTICAL,
T_IS_NOT_EQUAL,
T_IS_NOT_IDENTICAL,
T_IS_SMALLER_OR_EQUAL,
T_SPACESHIP,
T_LOGICAL_AND,
T_LOGICAL_OR,
T_LOGICAL_XOR,
T_MINUS_EQUAL,
T_MOD_EQUAL,
T_MUL_EQUAL,
T_NS_SEPARATOR,
T_NULLSAFE_OBJECT_OPERATOR,
T_OBJECT_OPERATOR,
T_OR_EQUAL,
T_PLUS_EQUAL,
T_POW,
T_POW_EQUAL,
T_SL,
T_SL_EQUAL,
T_SR,
T_SR_EQUAL,
T_XOR_EQUAL => Highlight::Operator,
// Keywords1
T_ABSTRACT,
T_BREAK,
T_CASE,
T_CATCH,
T_CLASS,
T_CLONE,
T_CONST,
T_CONTINUE,
T_DECLARE,
T_DEFAULT,
T_DO,
T_ECHO,
T_ELSE,
T_ELSEIF,
T_EMPTY,
T_ENDDECLARE,
T_ENDFOR,
T_ENDFOREACH,
T_ENDIF,
T_ENDSWITCH,
T_ENDWHILE,
T_EVAL,
T_EXIT,
T_EXTENDS,
T_FINAL,
T_FINALLY,
T_FN,
T_FOR,
T_FOREACH,
T_FUNCTION,
T_GLOBAL,
T_GOTO,
T_HALT_COMPILER,
T_IF,
T_IMPLEMENTS,
T_INCLUDE,
T_INCLUDE_ONCE,
T_INTERFACE,
T_ISSET,
T_LIST,
T_MATCH,
T_NAMESPACE,
T_NEW,
T_PRINT,
T_PRIVATE,
T_PUBLIC,
T_PROTECTED,
T_REQUIRE,
T_REQUIRE_ONCE,
T_RETURN,
T_STATIC,
T_SWITCH,
T_THROW,
T_TRAIT,
T_TRY,
T_UNSET,
T_USE,
T_VAR,
T_WHILE,
T_YIELD,
T_YIELD_FROM => Highlight::Keyword1,
// Not string literals, but identifiers, keywords, etc.
T_STRING => Highlight::Identifier,
// Types and casts
T_ARRAY_CAST,
T_BOOL_CAST,
T_CALLABLE,
T_DOUBLE_CAST,
T_INT_CAST,
T_OBJECT_CAST,
T_STRING_CAST,
T_UNSET_CAST => Highlight::Keyword2,
// Comments
T_DOC_COMMENT => Highlight::MultiLineComment,
T_INLINE_HTML => Highlight::Embed,
default => Highlight::Normal,
};
}
/**
* Map a single character PHP delimiter or operator to its associated
* highlighting type
*
* @param string $char
* @return Highlight
*/
public static function fromPHPChar(string $char): self
{
return match ($char) {
// Delimiter characters
'[', ']', '{', '}', '(', ')', '"', "'" => Highlight::Delimiter,
// Single character operators
'?', ',', ';', ':', '^', '%', '+', '-',
'*', '/', '.', '|', '~', '>', '<', '=', '!' => Highlight::Operator,
default => Highlight::Normal,
};
}
}