-
Notifications
You must be signed in to change notification settings - Fork 712
fourslash userpreferences (and fetch inlay hints userpreferences from vscode) #1729
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -38,6 +38,7 @@ type FourslashTest struct { | |
testData *TestData // !!! consolidate test files from test data and script info | ||
baselines map[string]*strings.Builder | ||
rangesByText *collections.MultiMap[string, *RangeMarker] | ||
config *ls.UserPreferences | ||
|
||
scriptInfos map[string]*scriptInfo | ||
converters *ls.Converters | ||
|
@@ -268,6 +269,29 @@ func sendRequest[Params, Resp any](t *testing.T, f *FourslashTest, info lsproto. | |
) | ||
f.writeMsg(t, req.Message()) | ||
resp := f.readMsg(t) | ||
if resp == nil { | ||
return nil, *new(Resp), false | ||
} | ||
|
||
// currently, the only request that may be sent by the server during a client request is one `config` request | ||
// !!! remove if `config` is handled in initialization and there are no other server-initiated requests | ||
if resp.Kind == lsproto.MessageKindRequest { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I do think we should move this handling to initialization. Or are going to need to handle other requests as well? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure what we will need in the future There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think you could imagine the fourslash client handling diagnostics refresh requests and potentially even watch requests. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we're going to port the fourslash/server tests, then those probably will have to be handled? |
||
req := resp.AsRequest() | ||
switch req.Method { | ||
case lsproto.MethodWorkspaceConfiguration: | ||
req := lsproto.ResponseMessage{ | ||
ID: req.ID, | ||
JSONRPC: req.JSONRPC, | ||
Result: []any{&f.config}, | ||
} | ||
f.writeMsg(t, req.Message()) | ||
resp = f.readMsg(t) | ||
default: | ||
// other types of responses not yet used in fourslash; implement them if needed | ||
t.Fatalf("Unexpected request received: %s", req) | ||
} | ||
} | ||
|
||
if resp == nil { | ||
return nil, *new(Resp), false | ||
} | ||
|
@@ -300,6 +324,13 @@ func (f *FourslashTest) readMsg(t *testing.T) *lsproto.Message { | |
return msg | ||
} | ||
|
||
func (f *FourslashTest) configure(t *testing.T, config *ls.UserPreferences) { | ||
f.config = config | ||
sendNotification(t, f, lsproto.WorkspaceDidChangeConfigurationInfo, &lsproto.DidChangeConfigurationParams{ | ||
Settings: config, | ||
}) | ||
} | ||
|
||
func (f *FourslashTest) GoToMarkerOrRange(t *testing.T, markerOrRange MarkerOrRange) { | ||
f.goToMarker(t, markerOrRange) | ||
} | ||
|
@@ -541,6 +572,11 @@ func (f *FourslashTest) verifyCompletionsWorker(t *testing.T, expected *Completi | |
Position: f.currentCaretPosition, | ||
Context: &lsproto.CompletionContext{}, | ||
} | ||
if expected == nil { | ||
iisaduan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
f.configure(t, nil) | ||
} else { | ||
f.configure(t, expected.UserPreferences) | ||
} | ||
resMsg, result, resultOk := sendRequest(t, f, lsproto.TextDocumentCompletionInfo, params) | ||
if resMsg == nil { | ||
t.Fatalf(prefix+"Nil response received for completion request", f.lastKnownMarkerName) | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -217,6 +217,101 @@ func (s *Server) RefreshDiagnostics(ctx context.Context) error { | |||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (s *Server) Configure(ctx context.Context) (*ls.UserPreferences, error) { | ||||||||||||||||||||||||||||||||||||||||||||
result, err := s.sendRequest(ctx, lsproto.MethodWorkspaceConfiguration, &lsproto.ConfigurationParams{ | ||||||||||||||||||||||||||||||||||||||||||||
Items: []*lsproto.ConfigurationItem{ | ||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||
Section: ptrTo("typescript"), | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+221
to
+227
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think I see what you mean, are you asking if instead of requesting the config for one entry,
Suggested change
and process like that? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. or even ask for every individual setting like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, though I think we have to also request Then best case, we register a config watch on them and then keep them up to date. |
||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("configure request failed: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
configs := result.([]any) | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences := &ls.UserPreferences{} | ||||||||||||||||||||||||||||||||||||||||||||
for _, config := range configs { | ||||||||||||||||||||||||||||||||||||||||||||
if config == nil { | ||||||||||||||||||||||||||||||||||||||||||||
continue | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if item, ok := config.(map[string]any); ok { | ||||||||||||||||||||||||||||||||||||||||||||
for name, values := range item { | ||||||||||||||||||||||||||||||||||||||||||||
switch name { | ||||||||||||||||||||||||||||||||||||||||||||
case "inlayHints": | ||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wonder if we could generate this code, maybe from the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, re: the conversation I had with jake above, I'm doing some thinking about other ways we could do this. This function as-is definitely isn't permanent |
||||||||||||||||||||||||||||||||||||||||||||
inlayHintsPreferences := values.(map[string]any) | ||||||||||||||||||||||||||||||||||||||||||||
iisaduan marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||
if v, ok := inlayHintsPreferences["parameterNames"].(map[string]any); ok && v != nil { | ||||||||||||||||||||||||||||||||||||||||||||
if enabled, ok := v["enabled"]; ok { | ||||||||||||||||||||||||||||||||||||||||||||
if enabledStr, ok := enabled.(string); ok { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayParameterNameHints = enabledStr | ||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayParameterNameHints = "" | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if supressWhenArgumentMatchesName, ok := v["suppressWhenArgumentMatchesName"]; ok { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayParameterNameHintsWhenArgumentMatchesName = ptrTo(!supressWhenArgumentMatchesName.(bool)) | ||||||||||||||||||||||||||||||||||||||||||||
iisaduan marked this conversation as resolved.
Show resolved
Hide resolved
iisaduan marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if v, ok := inlayHintsPreferences["parameterTypes"].(map[string]any); ok && v != nil { | ||||||||||||||||||||||||||||||||||||||||||||
if enabled, ok := v["enabled"]; ok { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayFunctionParameterTypeHints = ptrTo(enabled.(bool)) | ||||||||||||||||||||||||||||||||||||||||||||
iisaduan marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if v, ok := inlayHintsPreferences["variableTypes"].(map[string]any); ok && v != nil { | ||||||||||||||||||||||||||||||||||||||||||||
if enabled, ok := v["enabled"]; ok { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayVariableTypeHints = ptrTo(enabled.(bool)) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if supressWhenTypeMatchesName, ok := v["suppressWhenTypeMatchesName"]; ok { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayVariableTypeHintsWhenTypeMatchesName = ptrTo(!supressWhenTypeMatchesName.(bool)) | ||||||||||||||||||||||||||||||||||||||||||||
iisaduan marked this conversation as resolved.
Show resolved
Hide resolved
iisaduan marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if v, ok := inlayHintsPreferences["propertyDeclarationTypes"].(map[string]any); ok && v != nil { | ||||||||||||||||||||||||||||||||||||||||||||
if enabled, ok := v["enabled"]; ok { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayPropertyDeclarationTypeHints = ptrTo(enabled.(bool)) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if v, ok := inlayHintsPreferences["functionLikeReturnTypes"].(map[string]any); ok && v != nil { | ||||||||||||||||||||||||||||||||||||||||||||
if enabled, ok := v["enabled"]; ok { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayFunctionLikeReturnTypeHints = ptrTo(enabled.(bool)) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if v, ok := inlayHintsPreferences["enumMemberValues"].(map[string]any); ok && v != nil { | ||||||||||||||||||||||||||||||||||||||||||||
if enabled, ok := v["enabled"]; ok { | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeInlayEnumMemberValueHints = ptrTo(enabled.(bool)) | ||||||||||||||||||||||||||||||||||||||||||||
iisaduan marked this conversation as resolved.
Show resolved
Hide resolved
iisaduan marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.InteractiveInlayHints = ptrTo(true) | ||||||||||||||||||||||||||||||||||||||||||||
case "tsserver": | ||||||||||||||||||||||||||||||||||||||||||||
// !!! | ||||||||||||||||||||||||||||||||||||||||||||
case "unstable": | ||||||||||||||||||||||||||||||||||||||||||||
// !!! | ||||||||||||||||||||||||||||||||||||||||||||
case "tsc": | ||||||||||||||||||||||||||||||||||||||||||||
// !!! | ||||||||||||||||||||||||||||||||||||||||||||
case "updateImportsOnFileMove": | ||||||||||||||||||||||||||||||||||||||||||||
// !!! moveToFile | ||||||||||||||||||||||||||||||||||||||||||||
case "preferences": | ||||||||||||||||||||||||||||||||||||||||||||
// !!! | ||||||||||||||||||||||||||||||||||||||||||||
case "experimental": | ||||||||||||||||||||||||||||||||||||||||||||
// !!! | ||||||||||||||||||||||||||||||||||||||||||||
case "organizeImports": | ||||||||||||||||||||||||||||||||||||||||||||
// !!! | ||||||||||||||||||||||||||||||||||||||||||||
case "importModuleSpecifierEnding": | ||||||||||||||||||||||||||||||||||||||||||||
// !!! | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
continue | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
if item, ok := config.(ls.UserPreferences); ok { | ||||||||||||||||||||||||||||||||||||||||||||
// case for fourslash | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences = &item | ||||||||||||||||||||||||||||||||||||||||||||
break | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
// !!! set defaults for services, remove after extension is updated | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeCompletionsForModuleExports = ptrTo(true) | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences.IncludeCompletionsForImportStatements = ptrTo(true) | ||||||||||||||||||||||||||||||||||||||||||||
return userPreferences, nil | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (s *Server) Run() error { | ||||||||||||||||||||||||||||||||||||||||||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) | ||||||||||||||||||||||||||||||||||||||||||||
defer stop() | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -440,6 +535,7 @@ var handlers = sync.OnceValue(func() handlerMap { | |||||||||||||||||||||||||||||||||||||||||||
registerRequestHandler(handlers, lsproto.ShutdownInfo, (*Server).handleShutdown) | ||||||||||||||||||||||||||||||||||||||||||||
registerNotificationHandler(handlers, lsproto.ExitInfo, (*Server).handleExit) | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
registerNotificationHandler(handlers, lsproto.WorkspaceDidChangeConfigurationInfo, (*Server).handleDidChangeWorkspaceConfiguration) | ||||||||||||||||||||||||||||||||||||||||||||
registerNotificationHandler(handlers, lsproto.TextDocumentDidOpenInfo, (*Server).handleDidOpen) | ||||||||||||||||||||||||||||||||||||||||||||
registerNotificationHandler(handlers, lsproto.TextDocumentDidChangeInfo, (*Server).handleDidChange) | ||||||||||||||||||||||||||||||||||||||||||||
registerNotificationHandler(handlers, lsproto.TextDocumentDidSaveInfo, (*Server).handleDidSave) | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -638,7 +734,6 @@ func (s *Server) handleInitialized(ctx context.Context, params *lsproto.Initiali | |||||||||||||||||||||||||||||||||||||||||||
if shouldEnableWatch(s.initializeParams) { | ||||||||||||||||||||||||||||||||||||||||||||
s.watchEnabled = true | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
s.session = project.NewSession(&project.SessionInit{ | ||||||||||||||||||||||||||||||||||||||||||||
Options: &project.SessionOptions{ | ||||||||||||||||||||||||||||||||||||||||||||
CurrentDirectory: s.cwd, | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -655,6 +750,11 @@ func (s *Server) handleInitialized(ctx context.Context, params *lsproto.Initiali | |||||||||||||||||||||||||||||||||||||||||||
NpmExecutor: s, | ||||||||||||||||||||||||||||||||||||||||||||
ParseCache: s.parseCache, | ||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||
userPreferences, err := s.Configure(ctx) | ||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||
return err | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
s.session.Configure(userPreferences) | ||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't we also need to register with the client here to be able to actually get config change notifications? Just like we do in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Re: this + the comment above (link), I didn't fully implement this function because I wanted to figure out what we're going to process in the extension first and I wasn't sure the range of how much info that the client can pass to the server (will it always pass the entire new config upon changes? or only the differences?) |
||||||||||||||||||||||||||||||||||||||||||||
// !!! temporary; remove when we have `handleDidChangeConfiguration`/implicit project config support | ||||||||||||||||||||||||||||||||||||||||||||
if s.compilerOptionsForInferredProjects != nil { | ||||||||||||||||||||||||||||||||||||||||||||
s.session.DidChangeCompilerOptionsForInferredProjects(ctx, s.compilerOptionsForInferredProjects) | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -672,6 +772,16 @@ func (s *Server) handleExit(ctx context.Context, params any) error { | |||||||||||||||||||||||||||||||||||||||||||
return io.EOF | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (s *Server) handleDidChangeWorkspaceConfiguration(ctx context.Context, params *lsproto.DidChangeConfigurationParams) error { | ||||||||||||||||||||||||||||||||||||||||||||
// !!! update user preferences | ||||||||||||||||||||||||||||||||||||||||||||
// !!! only usable by fourslash | ||||||||||||||||||||||||||||||||||||||||||||
if item, ok := params.Settings.(*ls.UserPreferences); ok { | ||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can't we do the same kind of parsing here that we're doing in |
||||||||||||||||||||||||||||||||||||||||||||
// case for fourslash | ||||||||||||||||||||||||||||||||||||||||||||
s.session.Configure(item) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (s *Server) handleDidOpen(ctx context.Context, params *lsproto.DidOpenTextDocumentParams) error { | ||||||||||||||||||||||||||||||||||||||||||||
s.session.DidOpenFile(ctx, params.TextDocument.Uri, params.TextDocument.Version, params.TextDocument.Text, params.TextDocument.LanguageId) | ||||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -757,10 +867,8 @@ func (s *Server) handleCompletion(ctx context.Context, languageService *ls.Langu | |||||||||||||||||||||||||||||||||||||||||||
params.Position, | ||||||||||||||||||||||||||||||||||||||||||||
params.Context, | ||||||||||||||||||||||||||||||||||||||||||||
getCompletionClientCapabilities(s.initializeParams), | ||||||||||||||||||||||||||||||||||||||||||||
&ls.UserPreferences{ | ||||||||||||||||||||||||||||||||||||||||||||
IncludeCompletionsForModuleExports: ptrTo(true), | ||||||||||||||||||||||||||||||||||||||||||||
IncludeCompletionsForImportStatements: ptrTo(true), | ||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||
languageService.UserPreferences(), | ||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (s *Server) handleCompletionItemResolve(ctx context.Context, params *lsproto.CompletionItem, reqMsg *lsproto.RequestMessage) (lsproto.CompletionResolveResponse, error) { | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -778,10 +886,7 @@ func (s *Server) handleCompletionItemResolve(ctx context.Context, params *lsprot | |||||||||||||||||||||||||||||||||||||||||||
params, | ||||||||||||||||||||||||||||||||||||||||||||
data, | ||||||||||||||||||||||||||||||||||||||||||||
getCompletionClientCapabilities(s.initializeParams), | ||||||||||||||||||||||||||||||||||||||||||||
&ls.UserPreferences{ | ||||||||||||||||||||||||||||||||||||||||||||
IncludeCompletionsForModuleExports: ptrTo(true), | ||||||||||||||||||||||||||||||||||||||||||||
IncludeCompletionsForImportStatements: ptrTo(true), | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
languageService.UserPreferences(), | ||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
|
@@ -855,7 +960,9 @@ func isBlockingMethod(method lsproto.Method) bool { | |||||||||||||||||||||||||||||||||||||||||||
lsproto.MethodTextDocumentDidChange, | ||||||||||||||||||||||||||||||||||||||||||||
lsproto.MethodTextDocumentDidSave, | ||||||||||||||||||||||||||||||||||||||||||||
lsproto.MethodTextDocumentDidClose, | ||||||||||||||||||||||||||||||||||||||||||||
lsproto.MethodWorkspaceDidChangeWatchedFiles: | ||||||||||||||||||||||||||||||||||||||||||||
lsproto.MethodWorkspaceDidChangeWatchedFiles, | ||||||||||||||||||||||||||||||||||||||||||||
lsproto.MethodWorkspaceDidChangeConfiguration, | ||||||||||||||||||||||||||||||||||||||||||||
lsproto.MethodWorkspaceConfiguration: | ||||||||||||||||||||||||||||||||||||||||||||
return true | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
return false | ||||||||||||||||||||||||||||||||||||||||||||
|
Uh oh!
There was an error while loading. Please reload this page.