Skip to content

Commit e7a4bf3

Browse files
committed
fix(lsp): avoid null identifier in diagnostics
1 parent 7d63f20 commit e7a4bf3

4 files changed

Lines changed: 31 additions & 1 deletion

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module bennypowers.dev/asimonim
33
go 1.25.5
44

55
require (
6-
github.com/bennypowers/glsp v0.0.0-20260501152441-74e714d631a0
6+
github.com/bennypowers/glsp v0.0.0-20260511074857-83c7f674baea
77
github.com/bmatcuk/doublestar/v4 v4.9.2
88
github.com/lucasb-eyer/go-colorful v1.4.0
99
github.com/mazznoer/csscolorparser v0.1.8

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ github.com/bennypowers/glsp v0.0.0-20260501124255-83ab200c0f90 h1:IaAv5U5B8XKW5Z
1212
github.com/bennypowers/glsp v0.0.0-20260501124255-83ab200c0f90/go.mod h1:xY+tzLsKqII5jJc7lUADTw5a+ONpyuC1h2HG1WqQckw=
1313
github.com/bennypowers/glsp v0.0.0-20260501152441-74e714d631a0 h1:0lIJk99h9Q1ZvZQOf/euxXq2bVpppOzGSMNerKh3mWw=
1414
github.com/bennypowers/glsp v0.0.0-20260501152441-74e714d631a0/go.mod h1:xY+tzLsKqII5jJc7lUADTw5a+ONpyuC1h2HG1WqQckw=
15+
github.com/bennypowers/glsp v0.0.0-20260511074857-83c7f674baea h1:8JBUvL96De3eagEHxVID5cRCQdHseohaFof+l6GOo+Q=
16+
github.com/bennypowers/glsp v0.0.0-20260511074857-83c7f674baea/go.mod h1:xY+tzLsKqII5jJc7lUADTw5a+ONpyuC1h2HG1WqQckw=
1517
github.com/bmatcuk/doublestar/v4 v4.9.2 h1:b0mc6WyRSYLjzofB2v/0cuDUZ+MqoGyH3r0dVij35GI=
1618
github.com/bmatcuk/doublestar/v4 v4.9.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
1719
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=

lsp/methods/lifecycle/initialize.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ func Initialize(req *types.RequestContext, params *protocol.InitializeParams) (a
7979

8080
if supportsPullDiagnostics {
8181
capabilities.DiagnosticProvider = protocol.DiagnosticOptions{
82+
Identifier: strPtr("asimonim"),
8283
InterFileDependencies: false,
8384
WorkspaceDiagnostics: true,
8485
}

lsp/methods/lifecycle/initialize_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package lifecycle
22

33
import (
4+
"encoding/json"
45
"testing"
56

67
"bennypowers.dev/asimonim/lsp/internal/uriutil"
@@ -110,6 +111,8 @@ func TestInitialize(t *testing.T) {
110111
diagOpts, ok := caps.DiagnosticProvider.(protocol.DiagnosticOptions)
111112
require.True(t, ok)
112113
assert.True(t, diagOpts.WorkspaceDiagnostics)
114+
require.NotNil(t, diagOpts.Identifier, "Identifier must be set to avoid Neovim null userdata crash")
115+
assert.Equal(t, "asimonim", *diagOpts.Identifier)
113116

114117
// Verify completion provider options
115118
assert.NotNil(t, caps.CompletionProvider.ResolveProvider)
@@ -122,6 +125,30 @@ func TestInitialize(t *testing.T) {
122125
assert.True(t, *codeActionProvider.ResolveProvider)
123126
})
124127

128+
t.Run("diagnostic identifier serializes as string not null", func(t *testing.T) {
129+
ctx := testutil.NewMockServerContext()
130+
glspCtx := &glsp.Context{}
131+
req := types.NewRequestContext(ctx, glspCtx)
132+
ctx.SetClientDiagnosticCapability(true)
133+
134+
params := &protocol.InitializeParams{
135+
Capabilities: protocol.ClientCapabilities{
136+
TextDocument: &protocol.TextDocumentClientCapabilities{},
137+
},
138+
}
139+
140+
result, err := Initialize(req, params)
141+
require.NoError(t, err)
142+
143+
initResult := result.(protocol.InitializeResult)
144+
data, err := json.Marshal(initResult.Capabilities)
145+
require.NoError(t, err)
146+
147+
// Neovim crashes when identifier is null (Lua userdata vs string)
148+
assert.NotContains(t, string(data), `"identifier":null`)
149+
assert.Contains(t, string(data), `"identifier":"asimonim"`)
150+
})
151+
125152
t.Run("handles client info", func(t *testing.T) {
126153
ctx := testutil.NewMockServerContext()
127154
glspCtx := &glsp.Context{}

0 commit comments

Comments
 (0)