From fb7e94c81e663650e538145c05cc68cd852f9553 Mon Sep 17 00:00:00 2001 From: karitham Date: Sun, 23 Aug 2026 00:40:21 +0200 Subject: [PATCH] flake: bump to 1.27, go fix --- .github/workflows/ci.yml | 2 +- flake.lock | 6 +-- flake.nix | 4 +- go.mod | 9 ++--- lsp/cache/bench_test.go | 4 +- lsp/config_test.go | 4 +- lsp/impl_test.go | 80 +++++++++++++------------------------ lsp/include_paths_test.go | 4 +- lsp/initialize.go | 84 +++++++++++---------------------------- lsp/source/workspace.go | 6 +-- syntax/parser.go | 34 ++++++++-------- 11 files changed, 84 insertions(+), 153 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 73f8f28..744ee47 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: goarch: [amd64, arm64] steps: - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v7 with: go-version-file: go.mod - name: build diff --git a/flake.lock b/flake.lock index ee3273a..17ab962 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1786020313, - "narHash": "sha256-+SRq9fKS489zHzmsBxTKD99TMqST2LnWSM5EsXAzLpU=", + "lastModified": 1787437750, + "narHash": "sha256-8qnR53JToWl9xm6MWgbmmOzh4rsQiQCwH4KukHytNkk=", "owner": "nixos", "repo": "nixpkgs", - "rev": "addb9f5fb57327a6712a409ba4e17efb7e3ec1c5", + "rev": "e990d4ae42fb93cf7919c654225117ddc6bef1b4", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index bf530c9..97ca55d 100644 --- a/flake.nix +++ b/flake.nix @@ -14,7 +14,7 @@ let version = "0.1.6"; in - pkgs.buildGoModule { + pkgs.buildGo127Module { pname = "thrift-ls"; inherit version; src = nixpkgs.lib.cleanSource ./.; @@ -62,7 +62,7 @@ packages = with pkgs; [ - go + go_1_27 treefmt golangci-lint nodejs_22 diff --git a/go.mod b/go.mod index 49615b8..57a4121 100644 --- a/go.mod +++ b/go.mod @@ -1,21 +1,20 @@ module github.com/karitham/thrift-ls -go 1.26 +go 1.27 require ( github.com/stretchr/testify v1.11.1 + github.com/urfave/cli/v3 v3.10.1 go.lsp.dev/jsonrpc2 v1.0.1 go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 + go.lsp.dev/protocol v1.0.1 go.lsp.dev/uri v1.0.1 golang.org/x/text v0.40.0 ) -require github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect - require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-json-experiment/json v0.0.0-20260623181947-01eb4420fa68 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/urfave/cli/v3 v3.10.1 - go.lsp.dev/protocol v1.0.1 gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/lsp/cache/bench_test.go b/lsp/cache/bench_test.go index ab33aad..22f5b20 100644 --- a/lsp/cache/bench_test.go +++ b/lsp/cache/bench_test.go @@ -89,8 +89,8 @@ func BenchmarkStoreChangeThenReadAll(b *testing.B) { for i := 0; b.Loop(); i++ { mid.Version = i - mid.Content = []byte(fmt.Sprintf("include \"chain_%d.thrift\"\n\nstruct S%d {\n\t1: required string Name\n}\n", - len(files)/2+1, len(files)/2)) + mid.Content = fmt.Appendf(nil, "include \"chain_%d.thrift\"\n\nstruct S%d {\n\t1: required string Name\n}\n", + len(files)/2+1, len(files)/2) view.Update(ctx, mid) diff --git a/lsp/config_test.go b/lsp/config_test.go index 449320b..177f859 100644 --- a/lsp/config_test.go +++ b/lsp/config_test.go @@ -53,9 +53,7 @@ func initWorkspace(t *testing.T, srv *Server, folders []uri.URI, initializationO t.Helper() _, err := srv.Initialize(t.Context(), &protocol.InitializeParams{ - WorkspaceFoldersInitializeParams: protocol.WorkspaceFoldersInitializeParams{ - WorkspaceFolders: protocol.NewNullable(foldersFromURIs(folders)), - }, + WorkspaceFolders: protocol.NewNullable(foldersFromURIs(folders)), InitializationOptions: protocol.LSPAny(initializationOptions), }) require.NoError(t, err) diff --git a/lsp/impl_test.go b/lsp/impl_test.go index 4346fee..ffe8235 100644 --- a/lsp/impl_test.go +++ b/lsp/impl_test.go @@ -160,21 +160,15 @@ struct Test { assert.NoError(t, err) completionParams := &protocol.CompletionParams{ - TextDocumentPositionParams: protocol.TextDocumentPositionParams{ - TextDocument: protocol.TextDocumentIdentifier{ - URI: fileURI, - }, - Position: protocol.Position{ - Line: tt.line, - Character: tt.character, - }, + TextDocument: protocol.TextDocumentIdentifier{ + URI: fileURI, }, - WorkDoneProgressParams: protocol.WorkDoneProgressParams{ - WorkDoneToken: protocol.String(""), - }, - PartialResultParams: protocol.PartialResultParams{ - PartialResultToken: protocol.String(""), + Position: protocol.Position{ + Line: tt.line, + Character: tt.character, }, + WorkDoneToken: protocol.String(""), + PartialResultToken: protocol.String(""), Context: protocol.CompletionContext{ TriggerKind: protocol.CompletionTriggerKindInvoked, }, @@ -259,21 +253,15 @@ struct Test { assert.NoError(t, err) completionParams := &protocol.CompletionParams{ - TextDocumentPositionParams: protocol.TextDocumentPositionParams{ - TextDocument: protocol.TextDocumentIdentifier{ - URI: testURI, - }, - Position: protocol.Position{ - Line: 5, - Character: 28, - }, - }, - WorkDoneProgressParams: protocol.WorkDoneProgressParams{ - WorkDoneToken: protocol.String(""), + TextDocument: protocol.TextDocumentIdentifier{ + URI: testURI, }, - PartialResultParams: protocol.PartialResultParams{ - PartialResultToken: protocol.String(""), + Position: protocol.Position{ + Line: 5, + Character: 28, }, + WorkDoneToken: protocol.String(""), + PartialResultToken: protocol.String(""), Context: protocol.CompletionContext{ TriggerKind: protocol.CompletionTriggerKindInvoked, }, @@ -367,21 +355,15 @@ struct Other { assert.NoError(t, err) completionParams := &protocol.CompletionParams{ - TextDocumentPositionParams: protocol.TextDocumentPositionParams{ - TextDocument: protocol.TextDocumentIdentifier{ - URI: completionURI, - }, - Position: protocol.Position{ - Line: 5, - Character: 28, - }, - }, - WorkDoneProgressParams: protocol.WorkDoneProgressParams{ - WorkDoneToken: protocol.String(""), + TextDocument: protocol.TextDocumentIdentifier{ + URI: completionURI, }, - PartialResultParams: protocol.PartialResultParams{ - PartialResultToken: protocol.String(""), + Position: protocol.Position{ + Line: 5, + Character: 28, }, + WorkDoneToken: protocol.String(""), + PartialResultToken: protocol.String(""), Context: protocol.CompletionContext{ TriggerKind: protocol.CompletionTriggerKindInvoked, }, @@ -482,9 +464,7 @@ func Test_InitializeDefersTheWorkspaceWalk(t *testing.T) { srv := NewServer(cache.NewMemoizedFS(), nil, Options{}) _, err := srv.Initialize(t.Context(), &protocol.InitializeParams{ - WorkspaceFoldersInitializeParams: protocol.WorkspaceFoldersInitializeParams{ - WorkspaceFolders: protocol.NewNullable([]protocol.WorkspaceFolder{{URI: uri.File(dir)}}), - }, + WorkspaceFolders: protocol.NewNullable([]protocol.WorkspaceFolder{{URI: uri.File(dir)}}), }) require.NoError(t, err) @@ -558,11 +538,9 @@ struct StrikeRouge { completion := func(line, character uint32) []string { result, err := srv.Completion(ctx, &protocol.CompletionParams{ - TextDocumentPositionParams: protocol.TextDocumentPositionParams{ - TextDocument: protocol.TextDocumentIdentifier{URI: testURI}, - Position: protocol.Position{Line: line, Character: character}, - }, - Context: protocol.CompletionContext{TriggerKind: protocol.CompletionTriggerKindInvoked}, + TextDocument: protocol.TextDocumentIdentifier{URI: testURI}, + Position: protocol.Position{Line: line, Character: character}, + Context: protocol.CompletionContext{TriggerKind: protocol.CompletionTriggerKindInvoked}, }) require.NoError(t, err) @@ -618,11 +596,9 @@ struct StrikeRouge { })) result, err := srv.Completion(ctx, &protocol.CompletionParams{ - TextDocumentPositionParams: protocol.TextDocumentPositionParams{ - TextDocument: protocol.TextDocumentIdentifier{URI: testURI}, - Position: protocol.Position{Line: 3, Character: 15}, - }, - Context: protocol.CompletionContext{TriggerKind: protocol.CompletionTriggerKindInvoked}, + TextDocument: protocol.TextDocumentIdentifier{URI: testURI}, + Position: protocol.Position{Line: 3, Character: 15}, + Context: protocol.CompletionContext{TriggerKind: protocol.CompletionTriggerKindInvoked}, }) require.NoError(t, err) diff --git a/lsp/include_paths_test.go b/lsp/include_paths_test.go index b60e720..7c3dfc2 100644 --- a/lsp/include_paths_test.go +++ b/lsp/include_paths_test.go @@ -31,9 +31,7 @@ func TestConfigFileIncludePaths(t *testing.T) { srv := NewServer(cache.NewMemoizedFS(), nil, Options{}) _, err := srv.Initialize(ctx, &protocol.InitializeParams{ - WorkspaceFoldersInitializeParams: protocol.WorkspaceFoldersInitializeParams{ - WorkspaceFolders: protocol.NewNullable([]protocol.WorkspaceFolder{{URI: uri.File(dir)}}), - }, + WorkspaceFolders: protocol.NewNullable([]protocol.WorkspaceFolder{{URI: uri.File(dir)}}), }) require.NoError(t, err) require.NoError(t, srv.Initialized(ctx, &protocol.InitializedParams{})) diff --git a/lsp/initialize.go b/lsp/initialize.go index f6f1f53..15ad0d6 100644 --- a/lsp/initialize.go +++ b/lsp/initialize.go @@ -172,56 +172,32 @@ func initializeResult() *protocol.InitializeResult { TriggerCharacters: []string{".", "\"", "("}, }, HoverProvider: &protocol.HoverOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, + WorkDoneProgress: new(true), }, SignatureHelpProvider: &protocol.SignatureHelpOptions{ TriggerCharacters: []string{}, RetriggerCharacters: []string{}, }, DeclarationProvider: &protocol.DeclarationRegistrationOptions{ - DeclarationOptions: protocol.DeclarationOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, - }, - TextDocumentRegistrationOptions: protocol.TextDocumentRegistrationOptions{ - DocumentSelector: thriftSelector, - }, - StaticRegistrationOptions: protocol.StaticRegistrationOptions{ - ID: new("thrift-ls"), - }, + WorkDoneProgress: new(true), + DocumentSelector: thriftSelector, + ID: new("thrift-ls"), }, DefinitionProvider: &protocol.DefinitionOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, + WorkDoneProgress: new(true), }, TypeDefinitionProvider: &protocol.TypeDefinitionRegistrationOptions{ - TextDocumentRegistrationOptions: protocol.TextDocumentRegistrationOptions{ - DocumentSelector: thriftSelector, - }, - TypeDefinitionOptions: protocol.TypeDefinitionOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, - }, - StaticRegistrationOptions: protocol.StaticRegistrationOptions{ - ID: new("thrift-ls"), - }, + DocumentSelector: thriftSelector, + WorkDoneProgress: new(true), + ID: new("thrift-ls"), }, ReferencesProvider: &protocol.ReferenceOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, + WorkDoneProgress: new(true), }, DocumentHighlightProvider: protocol.Boolean(true), DocumentSymbolProvider: &protocol.DocumentSymbolOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, - Label: new("thrift-ls"), + WorkDoneProgress: new(true), + Label: new("thrift-ls"), }, CodeActionProvider: &protocol.CodeActionOptions{ // Keep in sync with the kinds codeAction returns: @@ -241,19 +217,13 @@ func initializeResult() *protocol.InitializeResult { }, ColorProvider: protocol.Boolean(false), FoldingRangeProvider: protocol.Boolean(true), WorkspaceSymbolProvider: &protocol.WorkspaceSymbolOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, + WorkDoneProgress: new(true), }, DocumentFormattingProvider: &protocol.DocumentFormattingOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, + WorkDoneProgress: new(true), }, DocumentRangeFormattingProvider: &protocol.DocumentRangeFormattingOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, + WorkDoneProgress: new(true), }, DocumentOnTypeFormattingProvider: protocol.DocumentOnTypeFormattingOptions{ FirstTriggerCharacter: "}", @@ -268,25 +238,17 @@ func initializeResult() *protocol.InitializeResult { CallHierarchyProvider: protocol.Boolean(false), LinkedEditingRangeProvider: protocol.Boolean(false), SemanticTokensProvider: &protocol.SemanticTokensRegistrationOptions{ - TextDocumentRegistrationOptions: protocol.TextDocumentRegistrationOptions{ - DocumentSelector: thriftSelector, - }, - SemanticTokensOptions: protocol.SemanticTokensOptions{ - WorkDoneProgressOptions: protocol.WorkDoneProgressOptions{ - WorkDoneProgress: new(true), - }, - Legend: protocol.SemanticTokensLegend{ - TokenTypes: source.Legend(), - TokenModifiers: []string{}, - }, - Full: &protocol.SemanticTokensFullDelta{ - Delta: new(true), - }, - Range: protocol.Boolean(false), + DocumentSelector: thriftSelector, + WorkDoneProgress: new(true), + Legend: protocol.SemanticTokensLegend{ + TokenTypes: source.Legend(), + TokenModifiers: []string{}, }, - StaticRegistrationOptions: protocol.StaticRegistrationOptions{ - ID: new("thrift-ls"), + Full: &protocol.SemanticTokensFullDelta{ + Delta: new(true), }, + Range: protocol.Boolean(false), + ID: new("thrift-ls"), }, Workspace: &protocol.WorkspaceOptions{ WorkspaceFolders: &protocol.WorkspaceFoldersServerCapabilities{ diff --git a/lsp/source/workspace.go b/lsp/source/workspace.go index 566180c..0bfa690 100644 --- a/lsp/source/workspace.go +++ b/lsp/source/workspace.go @@ -50,10 +50,8 @@ func documentSymbolsFlat(ctx context.Context, view *cache.View, file uri.URI) [] func flattenSymbol(sym *protocol.DocumentSymbol, file uri.URI, container string, out *[]protocol.SymbolInformation) { info := protocol.SymbolInformation{ - BaseSymbolInformation: protocol.BaseSymbolInformation{ - Name: sym.Name, - Kind: sym.Kind, - }, + Name: sym.Name, + Kind: sym.Kind, Location: protocol.Location{URI: file, Range: sym.SelectionRange}, } if container != "" { diff --git a/syntax/parser.go b/syntax/parser.go index 0342195..47626ce 100644 --- a/syntax/parser.go +++ b/syntax/parser.go @@ -165,7 +165,7 @@ func (d *Document) appendNode(n Node) { // --- headers --------------------------------------------------------------- func (p *parser) parseInclude() Node { - n := &Include{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + n := &Include{first: p.nextReal(p.pos)} p.advance() // include if !p.at(TokenStringLiteral) { @@ -185,7 +185,7 @@ func (p *parser) parseInclude() Node { } func (p *parser) parseCPPInclude() Node { - n := &CPPInclude{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + n := &CPPInclude{first: p.nextReal(p.pos)} p.advance() // cpp_include if !p.at(TokenStringLiteral) { @@ -205,7 +205,7 @@ func (p *parser) parseCPPInclude() Node { } func (p *parser) parseNamespace() Node { - n := &Namespace{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + n := &Namespace{first: p.nextReal(p.pos)} p.advance() // namespace if !p.at(TokenIdentifier) && !p.at(TokenStar) { @@ -233,7 +233,7 @@ func (p *parser) parseNamespace() Node { // --- definitions ----------------------------------------------------------- func (p *parser) parseConst() Node { - n := &Const{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + n := &Const{first: p.nextReal(p.pos)} p.advance() // const n.Type = p.parseFieldType() @@ -271,7 +271,7 @@ func (p *parser) parseConst() Node { } func (p *parser) parseTypedef() Node { - n := &Typedef{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + n := &Typedef{first: p.nextReal(p.pos)} p.advance() // typedef n.Type = p.parseFieldType() @@ -297,7 +297,7 @@ func (p *parser) parseTypedef() Node { } func (p *parser) parseEnum() Node { - n := &Enum{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + n := &Enum{first: p.nextReal(p.pos)} p.advance() // enum n.Name = p.expectIdentifier("enum name") @@ -337,7 +337,7 @@ func (p *parser) parseEnumValue() *EnumValue { return nil } - v := &EnumValue{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + v := &EnumValue{first: p.nextReal(p.pos)} v.Name = p.identifier() if p.at(TokenEqual) { @@ -359,7 +359,7 @@ func (p *parser) parseEnumValue() *EnumValue { } func (p *parser) parseStruct() Node { - n := &Struct{nodeBase: nodeBase{first: p.nextReal(p.pos)}, Kind: StructKind(p.cur().Kind)} + n := &Struct{first: p.nextReal(p.pos), Kind: StructKind(p.cur().Kind)} p.advance() // struct | union | exception n.Name = p.expectIdentifier("struct name") @@ -383,7 +383,7 @@ func (p *parser) parseStruct() Node { } func (p *parser) parseService() Node { - n := &Service{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + n := &Service{first: p.nextReal(p.pos)} p.advance() // service n.Name = p.expectIdentifier("service name") @@ -430,7 +430,7 @@ func (p *parser) parseService() Node { } func (p *parser) parseFunction() *Function { - f := &Function{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + f := &Function{first: p.nextReal(p.pos)} switch p.cur().Kind { case TokenOneway: @@ -476,7 +476,7 @@ func (p *parser) parseFunction() *Function { return nil } - f.Throws = &Throws{nodeBase: nodeBase{first: p.pos - 1}} + f.Throws = &Throws{first: p.pos - 1} f.Throws.Fields = p.parseFieldList(TokenRParen) p.expect(TokenRParen, "')' to close throws") @@ -514,7 +514,7 @@ func (p *parser) parseFieldList(term TokenKind) []*Field { } func (p *parser) parseField() (*Field, bool) { - f := &Field{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + f := &Field{first: p.nextReal(p.pos)} if p.at(TokenIntConstant) && p.peekAfter(p.nextReal(p.pos)) == TokenColon { f.FieldID = p.advance() @@ -576,7 +576,7 @@ func (p *parser) parseField() (*Field, bool) { // --- types ----------------------------------------------------------------- func (p *parser) parseFieldType() *FieldType { - t := &FieldType{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + t := &FieldType{first: p.nextReal(p.pos)} switch p.cur().Kind { case TokenMap, TokenList, TokenSet: @@ -687,7 +687,7 @@ func isBaseType(k TokenKind) bool { // --- constant values ------------------------------------------------------- func (p *parser) parseConstValue() *ConstValue { - v := &ConstValue{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + v := &ConstValue{first: p.nextReal(p.pos)} switch p.cur().Kind { case TokenIntConstant, TokenTrue, TokenFalse: @@ -785,7 +785,7 @@ func (p *parser) parseAnnotationsIfPresent() *Annotations { // literal (a bare name means an implicit value of "1"), and each may end // with an optional ',' or ';'. func (p *parser) parseAnnotations() *Annotations { - a := &Annotations{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + a := &Annotations{first: p.nextReal(p.pos)} p.advance() // ( for !p.at(TokenRParen) && !p.at(TokenEOF) { @@ -796,7 +796,7 @@ func (p *parser) parseAnnotations() *Annotations { continue } - item := &Annotation{nodeBase: nodeBase{first: p.nextReal(p.pos)}} + item := &Annotation{first: p.nextReal(p.pos)} item.Name = p.identifier() if p.at(TokenEqual) { @@ -841,7 +841,7 @@ func (p *parser) identifier() *Identifier { i := p.nextReal(p.pos) t := p.advance() - return &Identifier{nodeBase: nodeBase{first: i, last: i}, Text: t.Text} + return &Identifier{first: i, last: i, Text: t.Text} } // expectIdentifier parses a plain identifier name and reports an error when -- 2.51.2