internal/lsp/token_types.go (126 lines of code) (raw):
package lsp
import (
"math"
)
type (
TokenType string
TokenTypes []TokenType
)
func (tt TokenTypes) AsStrings() []string {
types := make([]string, len(tt))
for i, tokenType := range tt {
types[i] = string(tokenType)
}
return types
}
func (tt TokenTypes) Index(tokenType TokenType) int {
for i, t := range tt {
if t == tokenType {
return i
}
}
return -1
}
type (
TokenModifier string
TokenModifiers []TokenModifier
)
func (tm TokenModifiers) AsStrings() []string {
modifiers := make([]string, len(tm))
for i, tokenModifier := range tm {
modifiers[i] = string(tokenModifier)
}
return modifiers
}
func (tm TokenModifiers) BitMask(declaredModifiers TokenModifiers) int {
bitMask := 0b0
for i, modifier := range tm {
if isDeclared(modifier, declaredModifiers) {
bitMask |= int(math.Pow(2, float64(i)))
}
}
return bitMask
}
func isDeclared(mod TokenModifier, declaredModifiers TokenModifiers) bool {
for _, dm := range declaredModifiers {
if mod == dm {
return true
}
}
return false
}
const (
// Types predefined in LSP spec
TokenTypeClass TokenType = "class"
TokenTypeComment TokenType = "comment"
TokenTypeEnum TokenType = "enum"
TokenTypeEnumMember TokenType = "enumMember"
TokenTypeEvent TokenType = "event"
TokenTypeFunction TokenType = "function"
TokenTypeInterface TokenType = "interface"
TokenTypeKeyword TokenType = "keyword"
TokenTypeMacro TokenType = "macro"
TokenTypeMethod TokenType = "method"
TokenTypeModifier TokenType = "modifier"
TokenTypeNamespace TokenType = "namespace"
TokenTypeNumber TokenType = "number"
TokenTypeOperator TokenType = "operator"
TokenTypeParameter TokenType = "parameter"
TokenTypeProperty TokenType = "property"
TokenTypeRegexp TokenType = "regexp"
TokenTypeString TokenType = "string"
TokenTypeStruct TokenType = "struct"
TokenTypeType TokenType = "type"
TokenTypeTypeParameter TokenType = "typeParameter"
TokenTypeVariable TokenType = "variable"
// Modifiers predefined in LSP spec
TokenModifierDeclaration TokenModifier = "declaration"
TokenModifierDefinition TokenModifier = "definition"
TokenModifierReadonly TokenModifier = "readonly"
TokenModifierStatic TokenModifier = "static"
TokenModifierDeprecated TokenModifier = "deprecated"
TokenModifierAbstract TokenModifier = "abstract"
TokenModifierAsync TokenModifier = "async"
TokenModifierModification TokenModifier = "modification"
TokenModifierDocumentation TokenModifier = "documentation"
TokenModifierDefaultLibrary TokenModifier = "defaultLibrary"
)
// Registering types which are actually in use and known
// to be registered by VS Code by default, see https://git.io/JIeuV
var (
serverTokenTypes = TokenTypes{
TokenTypeType,
TokenTypeString,
TokenTypeProperty,
TokenTypeKeyword,
TokenTypeNumber,
TokenTypeParameter,
TokenTypeVariable,
}
serverTokenModifiers = TokenModifiers{
TokenModifierDeprecated,
TokenModifierModification,
}
)
func TokenTypesLegend(clientSupported []string) TokenTypes {
legend := make(TokenTypes, 0)
// Filter only supported token types
for _, tokenType := range serverTokenTypes {
if sliceContains(clientSupported, string(tokenType)) {
legend = append(legend, TokenType(tokenType))
}
}
return legend
}
func TokenModifiersLegend(clientSupported []string) TokenModifiers {
legend := make(TokenModifiers, 0)
// Filter only supported token modifiers
for _, modifier := range serverTokenModifiers {
if sliceContains(clientSupported, string(modifier)) {
legend = append(legend, TokenModifier(modifier))
}
}
return legend
}
func sliceContains(slice []string, value string) bool {
for _, val := range slice {
if val == value {
return true
}
}
return false
}