Skip to content

Commit 12e7ca7

Browse files
committed
Added support for clang 11
1 parent f8fae02 commit 12e7ca7

File tree

2 files changed

+172
-3
lines changed

2 files changed

+172
-3
lines changed

Diff for: lsp/protocol_test.go

+46
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,49 @@ func TestDocumentSymbolParse(t *testing.T) {
6464
require.Equal(t, "10:5-10:9", symbols[2].SelectionRange.String())
6565
fmt.Printf("%+v\n", res)
6666
}
67+
68+
func TestVariousMessages(t *testing.T) {
69+
msg := `{
70+
"capabilities":{
71+
"codeActionProvider":{
72+
"codeActionKinds":["quickfix","refactor","info"]},
73+
"completionProvider":{
74+
"allCommitCharacters":[" ","\t","(",")","[","]","{","}","<",">",":",";",",","+","-","/","*","%","^","&","#","?",".","=","\"","'","|"],
75+
"resolveProvider":false,
76+
"triggerCharacters":[".","<",">",":","\"","/"]},
77+
"declarationProvider":true,
78+
"definitionProvider":true,
79+
"documentFormattingProvider":true,
80+
"documentHighlightProvider":true,
81+
"documentLinkProvider":{"resolveProvider":false},
82+
"documentOnTypeFormattingProvider":{
83+
"firstTriggerCharacter":"\n",
84+
"moreTriggerCharacter":[]},
85+
"documentRangeFormattingProvider":true,
86+
"documentSymbolProvider":true,
87+
"executeCommandProvider":{"commands":["clangd.applyFix","clangd.applyTweak"]},
88+
"hoverProvider":true,
89+
"referencesProvider":true,
90+
"renameProvider":{"prepareProvider":true},
91+
"selectionRangeProvider":true,
92+
"semanticTokensProvider":{
93+
"full":{"delta":true},
94+
"legend":{
95+
"tokenModifiers":[],
96+
"tokenTypes":["variable","variable","parameter","function","member","function","member","variable","class","enum","enumConstant","type","dependent","dependent","namespace","typeParameter","concept","type","macro","comment"]
97+
},
98+
"range":false},
99+
"signatureHelpProvider":{"triggerCharacters":["(",","]},
100+
"textDocumentSync":{
101+
"change":2,
102+
"openClose":true,
103+
"save":true
104+
},
105+
"typeHierarchyProvider":true,
106+
"workspaceSymbolProvider":true
107+
},
108+
"serverInfo":{"name":"clangd","version":"clangd version 11.0.0 (https://github.com/llvm/llvm-project 176249bd6732a8044d457092ed932768724a6f06)"}}`
109+
var init InitializeResult
110+
err := json.Unmarshal([]byte(msg), &init)
111+
require.NoError(t, err)
112+
}

Diff for: lsp/service.go

+126-3
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,45 @@ type TextDocumentSyncOptions struct {
244244
Change TextDocumentSyncKind `json:"change"`
245245
WillSave bool `json:"willSave,omitempty"`
246246
WillSaveWaitUntil bool `json:"willSaveWaitUntil,omitempty"`
247-
Save *SaveOptions `json:"save,omitempty"`
247+
Save *BoolOrSaveOptions `json:"save,omitempty"`
248+
}
249+
250+
type BoolOrSaveOptions struct {
251+
Save *bool
252+
SaveOptions *SaveOptions
253+
}
254+
255+
// MarshalJSON implements json.Marshaler.
256+
func (v *BoolOrSaveOptions) MarshalJSON() ([]byte, error) {
257+
if v.Save != nil {
258+
return json.Marshal(v.Save)
259+
}
260+
if v.SaveOptions != nil {
261+
return json.Marshal(v.SaveOptions)
262+
}
263+
return []byte("null"), nil
264+
}
265+
266+
// UnmarshalJSON implements json.Unmarshaler.
267+
func (v *BoolOrSaveOptions) UnmarshalJSON(data []byte) error {
268+
if bytes.Equal(data, []byte("null")) {
269+
v.Save = nil
270+
v.SaveOptions = nil
271+
return nil
272+
}
273+
var save bool
274+
if err := json.Unmarshal(data, &save); err == nil {
275+
v.Save = &save
276+
v.SaveOptions = nil
277+
return nil
278+
}
279+
var saveOpts SaveOptions
280+
if err := json.Unmarshal(data, &saveOpts); err != nil {
281+
return err
282+
}
283+
v.Save = nil
284+
v.SaveOptions = &saveOpts
285+
return nil
248286
}
249287

250288
// TextDocumentSyncOptions holds either a TextDocumentSyncKind or
@@ -309,12 +347,12 @@ type ServerCapabilities struct {
309347
DocumentSymbolProvider bool `json:"documentSymbolProvider,omitempty"`
310348
WorkspaceSymbolProvider bool `json:"workspaceSymbolProvider,omitempty"`
311349
ImplementationProvider bool `json:"implementationProvider,omitempty"`
312-
CodeActionProvider bool `json:"codeActionProvider,omitempty"`
350+
CodeActionProvider *BoolOrCodeActionOptions `json:"codeActionProvider,omitempty"`
313351
CodeLensProvider *CodeLensOptions `json:"codeLensProvider,omitempty"`
314352
DocumentFormattingProvider bool `json:"documentFormattingProvider,omitempty"`
315353
DocumentRangeFormattingProvider bool `json:"documentRangeFormattingProvider,omitempty"`
316354
DocumentOnTypeFormattingProvider *DocumentOnTypeFormattingOptions `json:"documentOnTypeFormattingProvider,omitempty"`
317-
RenameProvider bool `json:"renameProvider,omitempty"`
355+
RenameProvider *BoolOrRenameOptions `json:"renameProvider,omitempty"`
318356
ExecuteCommandProvider *ExecuteCommandOptions `json:"executeCommandProvider,omitempty"`
319357
SemanticHighlighting *SemanticHighlightingOptions `json:"semanticHighlighting,omitempty"`
320358

@@ -352,6 +390,49 @@ type SignatureHelpOptions struct {
352390
TriggerCharacters []string `json:"triggerCharacters,omitempty"`
353391
}
354392

393+
type CodeActionOptions struct {
394+
CodeActionKinds *[]CodeActionKind `json:"codeActionKinds,omitempty`
395+
ResolveProvider *bool `json:"resolveProvider,omitempty`
396+
}
397+
398+
type BoolOrCodeActionOptions struct {
399+
IsProvider *bool
400+
Options *CodeActionOptions
401+
}
402+
403+
// MarshalJSON implements json.Marshaler.
404+
func (v *BoolOrCodeActionOptions) MarshalJSON() ([]byte, error) {
405+
if v.IsProvider != nil {
406+
return json.Marshal(v.IsProvider)
407+
}
408+
if v.Options != nil {
409+
return json.Marshal(v.Options)
410+
}
411+
return []byte("null"), nil
412+
}
413+
414+
// UnmarshalJSON implements json.Unmarshaler.
415+
func (v *BoolOrCodeActionOptions) UnmarshalJSON(data []byte) error {
416+
if bytes.Equal(data, []byte("null")) {
417+
v.IsProvider = nil
418+
v.Options = nil
419+
return nil
420+
}
421+
var b bool
422+
if err := json.Unmarshal(data, &b); err == nil {
423+
v.IsProvider = &b
424+
v.Options = nil
425+
return nil
426+
}
427+
var opts CodeActionOptions
428+
if err := json.Unmarshal(data, &opts); err != nil {
429+
return err
430+
}
431+
v.IsProvider = nil
432+
v.Options = &opts
433+
return nil
434+
}
435+
355436
type ExecuteCommandOptions struct {
356437
Commands []string `json:"commands"`
357438
}
@@ -361,6 +442,48 @@ type ExecuteCommandParams struct {
361442
Arguments []interface{} `json:"arguments,omitempty"`
362443
}
363444

445+
type RenameOptions struct {
446+
PrepareProvider *bool `json:"prepareProvider,omitempty`
447+
}
448+
449+
type BoolOrRenameOptions struct {
450+
IsProvider *bool
451+
Options *RenameOptions
452+
}
453+
454+
// MarshalJSON implements json.Marshaler.
455+
func (v *BoolOrRenameOptions) MarshalJSON() ([]byte, error) {
456+
if v.IsProvider != nil {
457+
return json.Marshal(v.IsProvider)
458+
}
459+
if v.Options != nil {
460+
return json.Marshal(v.Options)
461+
}
462+
return []byte("null"), nil
463+
}
464+
465+
// UnmarshalJSON implements json.Unmarshaler.
466+
func (v *BoolOrRenameOptions) UnmarshalJSON(data []byte) error {
467+
if bytes.Equal(data, []byte("null")) {
468+
v.IsProvider = nil
469+
v.Options = nil
470+
return nil
471+
}
472+
var b bool
473+
if err := json.Unmarshal(data, &b); err == nil {
474+
v.IsProvider = &b
475+
v.Options = nil
476+
return nil
477+
}
478+
var opts RenameOptions
479+
if err := json.Unmarshal(data, &opts); err != nil {
480+
return err
481+
}
482+
v.IsProvider = nil
483+
v.Options = &opts
484+
return nil
485+
}
486+
364487
type SemanticHighlightingOptions struct {
365488
Scopes [][]string `json:"scopes,omitempty"`
366489
}

0 commit comments

Comments
 (0)