Skip to content

Commit

Permalink
Implement dynamic registration for InlayHint
Browse files Browse the repository at this point in the history
  • Loading branch information
mliszcz committed Sep 28, 2023
1 parent 3a927e4 commit 987b8b3
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 1 deletion.
19 changes: 19 additions & 0 deletions internal/lsp/configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
const DIAGNOSTICS_CONFIG_KEY = "ttcn3.experimental.diagnostics.enabled"
const FORMATTER_CONFIG_KEY = "ttcn3.experimental.format.enabled"
const SEMANTIC_TOKENS_CONFIG_KEY = "ttcn3.experimental.semanticTokens.enabled"
const INLAY_HINT_CONFIG_KEY = "ttcn3.experimental.inlayHint.enabled"

func (s *Server) Config(section string) interface{} {
v, err := s.client.Configuration(context.TODO(), &protocol.ParamConfiguration{
Expand Down Expand Up @@ -79,6 +80,24 @@ func (s *Server) didChangeConfiguration(ctx context.Context, _ *protocol.DidChan
// NOTE: dynamic registration of diagnostics is only available from lsp 3.17 on
}

confRes, ok = s.Config(INLAY_HINT_CONFIG_KEY).(bool)
if !ok {
confRes = false
}
if s.clientCapability.HasDynRegForInlayHint && s.serverConfig.InlayHintEnabled != confRes {
s.serverConfig.InlayHintEnabled = confRes
if confRes {
regList = append(regList, protocol.Registration{
ID: "TEXTDOCUMENT_INLAYHINT",
Method: "textDocument/inlayHint",
RegisterOptions: newInlayHintRegistrationOptions()})
} else {
unregList = append(unregList, protocol.Unregistration{
ID: "TEXTDOCUMENT_INLAYHINT",
Method: "textDocument/inlayHint"})
}
}

if len(regList) > 0 {
s.client.RegisterCapability(ctx, &protocol.RegistrationParams{Registrations: regList})
}
Expand Down
29 changes: 28 additions & 1 deletion internal/lsp/general.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,32 @@ func (s *Server) registerFormatterIfNoDynReg() bool {
return !s.clientCapability.HasDynRegForFormatter
}

func (s *Server) registerInlayHintIfNoDynReg() *protocol.InlayHintRegistrationOptions {
if s.clientCapability.HasDynRegForInlayHint {
return nil
}
return newInlayHintRegistrationOptions()
}

func newInlayHintRegistrationOptions() *protocol.InlayHintRegistrationOptions {
return &protocol.InlayHintRegistrationOptions{
InlayHintOptions: protocol.InlayHintOptions{
ResolveProvider: false,
WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{
WorkDoneProgress: false,
},
},
TextDocumentRegistrationOptions: protocol.TextDocumentRegistrationOptions{
DocumentSelector: protocol.DocumentSelector{
protocol.DocumentFilter{Language: "ttcn3", Scheme: "file", Pattern: "**/*.ttcn3"},
},
},
StaticRegistrationOptions: protocol.StaticRegistrationOptions{
ID: "TEXTDOCUMENT_INLAYHINT",
},
}
}

func newSemanticTokens() *protocol.SemanticTokensRegistrationOptions {
return &protocol.SemanticTokensRegistrationOptions{

Expand Down Expand Up @@ -70,7 +96,7 @@ func (s *Server) initialize(ctx context.Context, params *protocol.ParamInitializ

return &protocol.InitializeResult{
Capabilities: protocol.ServerCapabilities{
InlayHintProvider: true,
InlayHintProvider: s.registerInlayHintIfNoDynReg(),
CodeActionProvider: false,
CompletionProvider: protocol.CompletionOptions{TriggerCharacters: []string{"."}},
DefinitionProvider: true,
Expand Down Expand Up @@ -120,6 +146,7 @@ func (s *Server) evaluateClientCapabilities(params *protocol.ParamInitialize) {
s.clientCapability.HasDynRegForDiagnostics = false // NOTE: available only from LSP 3.17 on
s.clientCapability.HasDynRegForFormatter = params.Capabilities.TextDocument.Formatting.DynamicRegistration
s.clientCapability.HasDynRegForSemTok = params.Capabilities.TextDocument.SemanticTokens.DynamicRegistration
s.clientCapability.HasDynRegForInlayHint = params.Capabilities.TextDocument.InlayHint.DynamicRegistration
}

func (s *Server) initialized(ctx context.Context, params *protocol.InitializedParams) error {
Expand Down
4 changes: 4 additions & 0 deletions internal/lsp/inlay_hint.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import (
)

func (s *Server) inlayHint(ctx context.Context, params *protocol.InlayHintParams) ([]protocol.InlayHint, error) {
if !s.serverConfig.InlayHintEnabled {
return nil, nil
}

file := string(params.TextDocument.URI)
tree := ttcn3.ParseFile(file)
begin := tree.PosFor(int(params.Range.Start.Line)+1, int(params.Range.Start.Character+1))
Expand Down
2 changes: 2 additions & 0 deletions internal/lsp/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,13 @@ type ClientCapability struct {
HasDynRegForDiagnostics bool
HasDynRegForFormatter bool
HasDynRegForSemTok bool
HasDynRegForInlayHint bool
}
type Config struct {
DiagnosticsEnabled bool
FormatEnabled bool
SemantikTokensEnabled bool
InlayHintEnabled bool
}

// Server implements the protocol.Server interface.
Expand Down

0 comments on commit 987b8b3

Please sign in to comment.