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, &params); 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  }