diff --git a/internal/lsp/protocol/enums.go b/internal/lsp/protocol/enums.go
new file mode 100644
index 0000000..3106471
--- /dev/null
+++ b/internal/lsp/protocol/enums.go
@@ -0,0 +1,244 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package protocol
+
+import (
+	"fmt"
+)
+
+var (
+	namesTextDocumentSyncKind   [int(Incremental) + 1]string
+	namesInitializeError        [int(UnknownProtocolVersion) + 1]string
+	namesMessageType            [int(Log) + 1]string
+	namesFileChangeType         [int(Deleted) + 1]string
+	namesWatchKind              [int(Change) + 1]string
+	namesCompletionTriggerKind  [int(TriggerForIncompleteCompletions) + 1]string
+	namesDiagnosticSeverity     [int(SeverityHint) + 1]string
+	namesDiagnosticTag          [int(Unnecessary) + 1]string
+	namesCompletionItemKind     [int(TypeParameterCompletion) + 1]string
+	namesInsertTextFormat       [int(SnippetTextFormat) + 1]string
+	namesDocumentHighlightKind  [int(Write) + 1]string
+	namesSymbolKind             [int(TypeParameter) + 1]string
+	namesTextDocumentSaveReason [int(FocusOut) + 1]string
+)
+
+func init() {
+	namesTextDocumentSyncKind[int(None)] = "None"
+	namesTextDocumentSyncKind[int(Full)] = "Full"
+	namesTextDocumentSyncKind[int(Incremental)] = "Incremental"
+
+	namesInitializeError[int(UnknownProtocolVersion)] = "UnknownProtocolVersion"
+
+	namesMessageType[int(Error)] = "Error"
+	namesMessageType[int(Warning)] = "Warning"
+	namesMessageType[int(Info)] = "Info"
+	namesMessageType[int(Log)] = "Log"
+
+	namesFileChangeType[int(Created)] = "Created"
+	namesFileChangeType[int(Changed)] = "Changed"
+	namesFileChangeType[int(Deleted)] = "Deleted"
+
+	namesWatchKind[int(Change)] = "Change"
+
+	namesCompletionTriggerKind[int(Invoked)] = "Invoked"
+	namesCompletionTriggerKind[int(TriggerCharacter)] = "TriggerCharacter"
+	namesCompletionTriggerKind[int(TriggerForIncompleteCompletions)] = "TriggerForIncompleteCompletions"
+
+	namesDiagnosticSeverity[int(SeverityError)] = "Error"
+	namesDiagnosticSeverity[int(SeverityWarning)] = "Warning"
+	namesDiagnosticSeverity[int(SeverityInformation)] = "Information"
+	namesDiagnosticSeverity[int(SeverityHint)] = "Hint"
+
+	namesDiagnosticTag[int(Unnecessary)] = "Unnecessary"
+
+	namesCompletionItemKind[int(TextCompletion)] = "TextCompletion"
+	namesCompletionItemKind[int(MethodCompletion)] = "MethodCompletion"
+	namesCompletionItemKind[int(FunctionCompletion)] = "FunctionCompletion"
+	namesCompletionItemKind[int(ConstructorCompletion)] = "ConstructorCompletion"
+	namesCompletionItemKind[int(FieldCompletion)] = "FieldCompletion"
+	namesCompletionItemKind[int(VariableCompletion)] = "VariableCompletion"
+	namesCompletionItemKind[int(ClassCompletion)] = "ClassCompletion"
+	namesCompletionItemKind[int(InterfaceCompletion)] = "InterfaceCompletion"
+	namesCompletionItemKind[int(ModuleCompletion)] = "ModuleCompletion"
+	namesCompletionItemKind[int(PropertyCompletion)] = "PropertyCompletion"
+	namesCompletionItemKind[int(UnitCompletion)] = "UnitCompletion"
+	namesCompletionItemKind[int(ValueCompletion)] = "ValueCompletion"
+	namesCompletionItemKind[int(EnumCompletion)] = "EnumCompletion"
+	namesCompletionItemKind[int(KeywordCompletion)] = "KeywordCompletion"
+	namesCompletionItemKind[int(SnippetCompletion)] = "SnippetCompletion"
+	namesCompletionItemKind[int(ColorCompletion)] = "ColorCompletion"
+	namesCompletionItemKind[int(FileCompletion)] = "FileCompletion"
+	namesCompletionItemKind[int(ReferenceCompletion)] = "ReferenceCompletion"
+	namesCompletionItemKind[int(FolderCompletion)] = "FolderCompletion"
+	namesCompletionItemKind[int(EnumMemberCompletion)] = "EnumMemberCompletion"
+	namesCompletionItemKind[int(ConstantCompletion)] = "ConstantCompletion"
+	namesCompletionItemKind[int(StructCompletion)] = "StructCompletion"
+	namesCompletionItemKind[int(EventCompletion)] = "EventCompletion"
+	namesCompletionItemKind[int(OperatorCompletion)] = "OperatorCompletion"
+	namesCompletionItemKind[int(TypeParameterCompletion)] = "TypeParameterCompletion"
+
+	namesInsertTextFormat[int(PlainTextTextFormat)] = "PlainText"
+	namesInsertTextFormat[int(SnippetTextFormat)] = "Snippet"
+
+	namesDocumentHighlightKind[int(Text)] = "Text"
+	namesDocumentHighlightKind[int(Read)] = "Read"
+	namesDocumentHighlightKind[int(Write)] = "Write"
+
+	namesSymbolKind[int(File)] = "File"
+	namesSymbolKind[int(Module)] = "Module"
+	namesSymbolKind[int(Namespace)] = "Namespace"
+	namesSymbolKind[int(Package)] = "Package"
+	namesSymbolKind[int(Class)] = "Class"
+	namesSymbolKind[int(Method)] = "Method"
+	namesSymbolKind[int(Property)] = "Property"
+	namesSymbolKind[int(Field)] = "Field"
+	namesSymbolKind[int(Constructor)] = "Constructor"
+	namesSymbolKind[int(Enum)] = "Enum"
+	namesSymbolKind[int(Interface)] = "Interface"
+	namesSymbolKind[int(Function)] = "Function"
+	namesSymbolKind[int(Variable)] = "Variable"
+	namesSymbolKind[int(Constant)] = "Constant"
+	namesSymbolKind[int(String)] = "String"
+	namesSymbolKind[int(Number)] = "Number"
+	namesSymbolKind[int(Boolean)] = "Boolean"
+	namesSymbolKind[int(Array)] = "Array"
+	namesSymbolKind[int(Object)] = "Object"
+	namesSymbolKind[int(Key)] = "Key"
+	namesSymbolKind[int(Null)] = "Null"
+	namesSymbolKind[int(EnumMember)] = "EnumMember"
+	namesSymbolKind[int(Struct)] = "Struct"
+	namesSymbolKind[int(Event)] = "Event"
+	namesSymbolKind[int(Operator)] = "Operator"
+	namesSymbolKind[int(TypeParameter)] = "TypeParameter"
+
+	namesTextDocumentSaveReason[int(Manual)] = "Manual"
+	namesTextDocumentSaveReason[int(AfterDelay)] = "AfterDelay"
+	namesTextDocumentSaveReason[int(FocusOut)] = "FocusOut"
+}
+
+func formatEnum(f fmt.State, c rune, i int, names []string, unknown string) {
+	s := ""
+	if i >= 0 && i < len(names) {
+		s = names[i]
+	}
+	if s != "" {
+		fmt.Fprint(f, s)
+	} else {
+		fmt.Fprintf(f, "%s(%d)", unknown, i)
+	}
+}
+
+func parseEnum(s string, names []string) int {
+	for i, name := range names {
+		if s == name {
+			return i
+		}
+	}
+	return 0
+}
+
+func (e TextDocumentSyncKind) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesTextDocumentSyncKind[:], "TextDocumentSyncKind")
+}
+
+func ParseTextDocumentSyncKind(s string) TextDocumentSyncKind {
+	return TextDocumentSyncKind(parseEnum(s, namesTextDocumentSyncKind[:]))
+}
+
+func (e InitializeError) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesInitializeError[:], "InitializeError")
+}
+
+func ParseInitializeError(s string) InitializeError {
+	return InitializeError(parseEnum(s, namesInitializeError[:]))
+}
+
+func (e MessageType) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesMessageType[:], "MessageType")
+}
+
+func ParseMessageType(s string) MessageType {
+	return MessageType(parseEnum(s, namesMessageType[:]))
+}
+
+func (e FileChangeType) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesFileChangeType[:], "FileChangeType")
+}
+
+func ParseFileChangeType(s string) FileChangeType {
+	return FileChangeType(parseEnum(s, namesFileChangeType[:]))
+}
+
+func (e WatchKind) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesWatchKind[:], "WatchKind")
+}
+
+func ParseWatchKind(s string) WatchKind {
+	return WatchKind(parseEnum(s, namesWatchKind[:]))
+}
+
+func (e CompletionTriggerKind) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesCompletionTriggerKind[:], "CompletionTriggerKind")
+}
+
+func ParseCompletionTriggerKind(s string) CompletionTriggerKind {
+	return CompletionTriggerKind(parseEnum(s, namesCompletionTriggerKind[:]))
+}
+
+func (e DiagnosticSeverity) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesDiagnosticSeverity[:], "DiagnosticSeverity")
+}
+
+func ParseDiagnosticSeverity(s string) DiagnosticSeverity {
+	return DiagnosticSeverity(parseEnum(s, namesDiagnosticSeverity[:]))
+}
+
+func (e DiagnosticTag) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesDiagnosticTag[:], "DiagnosticTag")
+}
+
+func ParseDiagnosticTag(s string) DiagnosticTag {
+	return DiagnosticTag(parseEnum(s, namesDiagnosticTag[:]))
+}
+
+func (e CompletionItemKind) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesCompletionItemKind[:], "CompletionItemKind")
+}
+
+func ParseCompletionItemKind(s string) CompletionItemKind {
+	return CompletionItemKind(parseEnum(s, namesCompletionItemKind[:]))
+}
+
+func (e InsertTextFormat) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesInsertTextFormat[:], "InsertTextFormat")
+}
+
+func ParseInsertTextFormat(s string) InsertTextFormat {
+	return InsertTextFormat(parseEnum(s, namesInsertTextFormat[:]))
+}
+
+func (e DocumentHighlightKind) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesDocumentHighlightKind[:], "DocumentHighlightKind")
+}
+
+func ParseDocumentHighlightKind(s string) DocumentHighlightKind {
+	return DocumentHighlightKind(parseEnum(s, namesDocumentHighlightKind[:]))
+}
+
+func (e SymbolKind) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesSymbolKind[:], "SymbolKind")
+}
+
+func ParseSymbolKind(s string) SymbolKind {
+	return SymbolKind(parseEnum(s, namesSymbolKind[:]))
+}
+
+func (e TextDocumentSaveReason) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesTextDocumentSaveReason[:], "TextDocumentSaveReason")
+}
+
+func ParseTextDocumentSaveReason(s string) TextDocumentSaveReason {
+	return TextDocumentSaveReason(parseEnum(s, namesTextDocumentSaveReason[:]))
+}
diff --git a/internal/lsp/protocol/printers.go b/internal/lsp/protocol/printers.go
deleted file mode 100644
index 33423e3..0000000
--- a/internal/lsp/protocol/printers.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file contains formatting functions for types that
-// are commonly printed in debugging information.
-// They are separated from their types and gathered here as
-// they are hand written and not generated from the spec.
-// They should not be relied on for programmatic use (their
-// results should never be parsed for instance) but are meant
-// for temporary debugging and error messages.
-
-package protocol
-
-import (
-	"fmt"
-)
-
-func (s DiagnosticSeverity) Format(f fmt.State, c rune) {
-	switch s {
-	case SeverityError:
-		fmt.Fprint(f, "Error")
-	case SeverityWarning:
-		fmt.Fprint(f, "Warning")
-	case SeverityInformation:
-		fmt.Fprint(f, "Information")
-	case SeverityHint:
-		fmt.Fprint(f, "Hint")
-	}
-}
-
-func (k CompletionItemKind) Format(f fmt.State, c rune) {
-	switch k {
-	case StructCompletion:
-		fmt.Fprintf(f, "struct")
-	case FunctionCompletion:
-		fmt.Fprintf(f, "func")
-	case VariableCompletion:
-		fmt.Fprintf(f, "var")
-	case TypeParameterCompletion:
-		fmt.Fprintf(f, "type")
-	case FieldCompletion:
-		fmt.Fprintf(f, "field")
-	case InterfaceCompletion:
-		fmt.Fprintf(f, "interface")
-	case ConstantCompletion:
-		fmt.Fprintf(f, "const")
-	case MethodCompletion:
-		fmt.Fprintf(f, "method")
-	case ModuleCompletion:
-		fmt.Fprintf(f, "package")
-	}
-}
diff --git a/internal/lsp/source/enums.go b/internal/lsp/source/enums.go
new file mode 100644
index 0000000..5ceea99
--- /dev/null
+++ b/internal/lsp/source/enums.go
@@ -0,0 +1,87 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package source
+
+import "fmt"
+
+var (
+	namesSymbolKind         [int(FieldSymbol) + 1]string
+	namesDiagnosticSeverity [int(SeverityError) + 1]string
+	namesCompletionItemKind [int(PackageCompletionItem) + 1]string
+)
+
+func init() {
+	namesSymbolKind[PackageSymbol] = "Package"
+	namesSymbolKind[StructSymbol] = "Struct"
+	namesSymbolKind[VariableSymbol] = "Variable"
+	namesSymbolKind[ConstantSymbol] = "Constant"
+	namesSymbolKind[FunctionSymbol] = "Function"
+	namesSymbolKind[MethodSymbol] = "Method"
+	namesSymbolKind[InterfaceSymbol] = "Interface"
+	namesSymbolKind[NumberSymbol] = "Number"
+	namesSymbolKind[StringSymbol] = "String"
+	namesSymbolKind[BooleanSymbol] = "Boolean"
+	namesSymbolKind[FieldSymbol] = "Field"
+
+	namesDiagnosticSeverity[SeverityWarning] = "Warning"
+	namesDiagnosticSeverity[SeverityError] = "Error"
+
+	namesCompletionItemKind[Unknown] = "Unknown"
+	namesCompletionItemKind[InterfaceCompletionItem] = "InterfaceCompletion"
+	namesCompletionItemKind[StructCompletionItem] = "StructCompletion"
+	namesCompletionItemKind[TypeCompletionItem] = "TypeCompletion"
+	namesCompletionItemKind[ConstantCompletionItem] = "ConstantCompletion"
+	namesCompletionItemKind[FieldCompletionItem] = "FieldCompletion"
+	namesCompletionItemKind[ParameterCompletionItem] = "ParameterCompletion"
+	namesCompletionItemKind[VariableCompletionItem] = "VariableCompletion"
+	namesCompletionItemKind[FunctionCompletionItem] = "FunctionCompletion"
+	namesCompletionItemKind[MethodCompletionItem] = "MethodCompletion"
+	namesCompletionItemKind[PackageCompletionItem] = "PackageCompletion"
+}
+
+func formatEnum(f fmt.State, c rune, i int, names []string, unknown string) {
+	s := ""
+	if i >= 0 && i < len(names) {
+		s = names[i]
+	}
+	if s != "" {
+		fmt.Fprint(f, s)
+	} else {
+		fmt.Fprintf(f, "%s(%d)", unknown, i)
+	}
+}
+
+func parseEnum(s string, names []string) int {
+	for i, name := range names {
+		if s == name {
+			return i
+		}
+	}
+	return 0
+}
+
+func (e SymbolKind) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesSymbolKind[:], "SymbolKind")
+}
+
+func ParseSymbolKind(s string) SymbolKind {
+	return SymbolKind(parseEnum(s, namesSymbolKind[:]))
+}
+
+func (e DiagnosticSeverity) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesDiagnosticSeverity[:], "DiagnosticSeverity")
+}
+
+func ParseDiagnosticSeverity(s string) DiagnosticSeverity {
+	return DiagnosticSeverity(parseEnum(s, namesDiagnosticSeverity[:]))
+}
+
+func (e CompletionItemKind) Format(f fmt.State, c rune) {
+	formatEnum(f, c, int(e), namesCompletionItemKind[:], "CompletionItemKind")
+}
+
+func ParseCompletionItemKind(s string) CompletionItemKind {
+	return CompletionItemKind(parseEnum(s, namesCompletionItemKind[:]))
+}
