github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/cmd/lsp/server/handler.go (about) 1 package server 2 3 import ( 4 "encoding/json" 5 "errors" 6 "sync" 7 8 "github.com/nevalang/neva/cmd/lsp/indexer" 9 "github.com/nevalang/neva/pkg" 10 "github.com/tliron/commonlog" 11 "github.com/tliron/glsp" 12 protocol "github.com/tliron/glsp/protocol_3_16" 13 ) 14 15 type Handler struct { 16 *protocol.Handler 17 18 GetFileView func(glspCtx *glsp.Context, params GetFileViewRequest) (GetFileViewResponce, error) 19 } 20 21 func (h Handler) Handle(glspCtx *glsp.Context) (response any, validMethod bool, validParams bool, err error) { 22 if !h.IsInitialized() && (glspCtx.Method != protocol.MethodInitialize) { 23 return nil, true, true, errors.New("server not initialized") 24 } 25 26 if glspCtx.Method == "resolve_file" { 27 var params GetFileViewRequest 28 if err := json.Unmarshal(glspCtx.Params, ¶ms); err != nil { 29 return nil, true, false, err 30 } 31 32 resp, err := h.GetFileView(glspCtx, params) 33 if err != nil { 34 return nil, true, true, err 35 } 36 37 return resp, true, true, nil 38 } 39 40 return h.Handler.Handle(glspCtx) 41 } 42 43 //nolint:lll,funlen 44 func BuildHandler(logger commonlog.Logger, serverName string, indexer indexer.Indexer) *Handler { 45 h := &Handler{ 46 Handler: &protocol.Handler{}, 47 } 48 49 s := Server{ 50 handler: h, 51 logger: logger, 52 name: serverName, 53 version: pkg.Version, 54 indexer: indexer, 55 mu: &sync.Mutex{}, 56 index: nil, 57 } 58 59 // Basic 60 h.CancelRequest = func(_ *glsp.Context, params *protocol.CancelParams) error { 61 return nil 62 } 63 h.Progress = func(_ *glsp.Context, params *protocol.ProgressParams) error { 64 return nil 65 } 66 67 // Lifetime 68 h.Initialize = s.Initialize 69 h.Initialized = s.Initialized 70 h.Shutdown = s.Shutdown 71 h.Exit = s.Exit 72 h.LogTrace = func(context *glsp.Context, params *protocol.LogTraceParams) error { 73 return nil 74 } 75 h.SetTrace = s.SetTrace 76 77 // Custom handlers 78 h.GetFileView = s.GetFileView 79 80 // Rest... 81 h.WindowWorkDoneProgressCancel = func(context *glsp.Context, params *protocol.WorkDoneProgressCancelParams) error { 82 return nil 83 } 84 85 h.WorkspaceDidChangeWorkspaceFolders = func(context *glsp.Context, params *protocol.DidChangeWorkspaceFoldersParams) error { 86 return nil 87 } 88 h.WorkspaceDidChangeConfiguration = func(context *glsp.Context, params *protocol.DidChangeConfigurationParams) error { 89 return nil 90 } 91 h.WorkspaceDidChangeWatchedFiles = func(context *glsp.Context, params *protocol.DidChangeWatchedFilesParams) error { 92 return nil 93 } 94 h.WorkspaceSymbol = func(context *glsp.Context, params *protocol.WorkspaceSymbolParams) ([]protocol.SymbolInformation, error) { 95 return nil, nil 96 } 97 h.WorkspaceExecuteCommand = func(context *glsp.Context, params *protocol.ExecuteCommandParams) (any, error) { 98 return nil, nil 99 } 100 h.WorkspaceWillCreateFiles = func(context *glsp.Context, params *protocol.CreateFilesParams) (*protocol.WorkspaceEdit, error) { 101 return nil, nil 102 } 103 h.WorkspaceDidCreateFiles = func(context *glsp.Context, params *protocol.CreateFilesParams) error { 104 return nil 105 } 106 h.WorkspaceWillRenameFiles = func(context *glsp.Context, params *protocol.RenameFilesParams) (*protocol.WorkspaceEdit, error) { 107 return nil, nil 108 } 109 h.WorkspaceDidRenameFiles = func(context *glsp.Context, params *protocol.RenameFilesParams) error { 110 return nil 111 } 112 h.WorkspaceWillDeleteFiles = func(context *glsp.Context, params *protocol.DeleteFilesParams) (*protocol.WorkspaceEdit, error) { 113 return nil, nil 114 } 115 h.WorkspaceDidDeleteFiles = func(context *glsp.Context, params *protocol.DeleteFilesParams) error { 116 return nil 117 } 118 h.WorkspaceSemanticTokensRefresh = func(context *glsp.Context) error { 119 return nil 120 } 121 122 h.TextDocumentDidOpen = func(glpsCtx *glsp.Context, params *protocol.DidOpenTextDocumentParams) error { 123 return nil 124 } 125 h.TextDocumentDidChange = s.TextDocumentDidChange 126 h.TextDocumentWillSave = func(context *glsp.Context, params *protocol.WillSaveTextDocumentParams) error { 127 return nil 128 } 129 h.TextDocumentWillSaveWaitUntil = func(context *glsp.Context, params *protocol.WillSaveTextDocumentParams) ([]protocol.TextEdit, error) { 130 return nil, nil 131 } 132 h.TextDocumentDidSave = func(context *glsp.Context, params *protocol.DidSaveTextDocumentParams) error { 133 return nil 134 } 135 h.TextDocumentDidClose = func(context *glsp.Context, params *protocol.DidCloseTextDocumentParams) error { 136 return nil 137 } 138 139 h.TextDocumentCompletion = nil 140 h.CompletionItemResolve = nil 141 h.TextDocumentHover = nil 142 h.TextDocumentSignatureHelp = nil 143 h.TextDocumentDeclaration = nil 144 h.TextDocumentDefinition = nil 145 h.TextDocumentTypeDefinition = nil 146 h.TextDocumentImplementation = nil 147 h.TextDocumentReferences = nil 148 h.TextDocumentDocumentHighlight = nil 149 h.TextDocumentDocumentSymbol = nil 150 h.TextDocumentCodeAction = nil 151 h.CodeActionResolve = nil 152 h.TextDocumentCodeLens = nil 153 h.CodeLensResolve = nil 154 h.TextDocumentDocumentLink = nil 155 h.DocumentLinkResolve = nil 156 h.TextDocumentColor = nil 157 h.TextDocumentColorPresentation = nil 158 h.TextDocumentFormatting = nil 159 h.TextDocumentRangeFormatting = nil 160 h.TextDocumentOnTypeFormatting = nil 161 h.TextDocumentRename = nil 162 h.TextDocumentPrepareRename = nil 163 h.TextDocumentFoldingRange = nil 164 h.TextDocumentSelectionRange = nil 165 h.TextDocumentPrepareCallHierarchy = nil 166 h.CallHierarchyIncomingCalls = nil 167 h.CallHierarchyOutgoingCalls = nil 168 h.TextDocumentSemanticTokensFull = nil 169 h.TextDocumentSemanticTokensFullDelta = nil 170 h.TextDocumentSemanticTokensRange = nil 171 h.TextDocumentLinkedEditingRange = nil 172 h.TextDocumentMoniker = nil 173 174 return h 175 }