Skip to content

Commit be5259f

Browse files
Jan Steinkestamblerre
Jan Steinke
authored andcommitted
internal/lsp: use x/xerrors to create new errors
This relates to golang/go#31374 and should switch all instances within `gopls` to use `x/errors` instead of `fmt` to create new errors. Change-Id: I18339b75d12418d852e0dcc2ba0ed6c2970783b3 GitHub-Last-Rev: f4a55d9 GitHub-Pull-Request: #108 Reviewed-on: https://go-review.googlesource.com/c/tools/+/179880 Run-TryBot: Rebecca Stambler <[email protected]> Reviewed-by: Rebecca Stambler <[email protected]>
1 parent 249e2b9 commit be5259f

32 files changed

+140
-126
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ go 1.11
55
require (
66
golang.org/x/net v0.0.0-20190620200207-3b0461eec859
77
golang.org/x/sync v0.0.0-20190423024810-112230192c58
8+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7
89
)

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEha
55
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
66
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
77
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
8+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
9+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/lsp/cache/check.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package cache
66

77
import (
88
"context"
9-
"fmt"
109
"go/ast"
1110
"go/scanner"
1211
"go/token"
@@ -20,6 +19,7 @@ import (
2019
"golang.org/x/tools/internal/lsp/telemetry/log"
2120
"golang.org/x/tools/internal/lsp/telemetry/trace"
2221
"golang.org/x/tools/internal/span"
22+
errors "golang.org/x/xerrors"
2323
)
2424

2525
type importer struct {
@@ -40,7 +40,7 @@ func (imp *importer) Import(pkgPath string) (*types.Package, error) {
4040
ctx := imp.ctx
4141
id, ok := imp.view.mcache.ids[packagePath(pkgPath)]
4242
if !ok {
43-
return nil, fmt.Errorf("no known ID for %s", pkgPath)
43+
return nil, errors.Errorf("no known ID for %s", pkgPath)
4444
}
4545
pkg, err := imp.getPkg(ctx, id)
4646
if err != nil {
@@ -51,7 +51,7 @@ func (imp *importer) Import(pkgPath string) (*types.Package, error) {
5151

5252
func (imp *importer) getPkg(ctx context.Context, id packageID) (*pkg, error) {
5353
if _, ok := imp.seen[id]; ok {
54-
return nil, fmt.Errorf("circular import detected")
54+
return nil, errors.Errorf("circular import detected")
5555
}
5656
imp.view.pcache.mu.Lock()
5757
e, ok := imp.view.pcache.packages[id]
@@ -99,7 +99,7 @@ func (imp *importer) typeCheck(ctx context.Context, id packageID) (*pkg, error)
9999
defer done()
100100
meta, ok := imp.view.mcache.packages[id]
101101
if !ok {
102-
return nil, fmt.Errorf("no metadata for %v", id)
102+
return nil, errors.Errorf("no metadata for %v", id)
103103
}
104104
pkg := &pkg{
105105
id: meta.id,
@@ -123,9 +123,9 @@ func (imp *importer) typeCheck(ctx context.Context, id packageID) (*pkg, error)
123123
mode = source.ParseExported
124124
}
125125
var (
126-
files = make([]*ast.File, len(meta.files))
127-
errors = make([]error, len(meta.files))
128-
wg sync.WaitGroup
126+
files = make([]*ast.File, len(meta.files))
127+
parseErrors = make([]error, len(meta.files))
128+
wg sync.WaitGroup
129129
)
130130
for _, filename := range meta.files {
131131
uri := span.FileURI(filename)
@@ -141,7 +141,7 @@ func (imp *importer) typeCheck(ctx context.Context, id packageID) (*pkg, error)
141141
go func(i int, ph source.ParseGoHandle) {
142142
defer wg.Done()
143143

144-
files[i], errors[i] = ph.Parse(ctx)
144+
files[i], parseErrors[i] = ph.Parse(ctx)
145145
}(i, ph)
146146
}
147147
wg.Wait()
@@ -153,7 +153,7 @@ func (imp *importer) typeCheck(ctx context.Context, id packageID) (*pkg, error)
153153
i++
154154
}
155155
}
156-
for _, err := range errors {
156+
for _, err := range parseErrors {
157157
if err == context.Canceled {
158158
return nil, err
159159
}
@@ -166,7 +166,7 @@ func (imp *importer) typeCheck(ctx context.Context, id packageID) (*pkg, error)
166166
if meta.pkgPath == "unsafe" {
167167
pkg.types = types.Unsafe
168168
} else if len(files) == 0 { // not the unsafe package, no parsed files
169-
return nil, fmt.Errorf("no parsed files for package %s", pkg.pkgPath)
169+
return nil, errors.Errorf("no parsed files for package %s", pkg.pkgPath)
170170
} else {
171171
pkg.types = types.NewPackage(string(meta.pkgPath), meta.name)
172172
}
@@ -209,14 +209,14 @@ func (imp *importer) cachePackage(ctx context.Context, pkg *pkg, meta *metadata,
209209
uri := ph.File().Identity().URI
210210
f, err := imp.view.getFile(ctx, uri)
211211
if err != nil {
212-
return fmt.Errorf("no such file %s: %v", uri, err)
212+
return errors.Errorf("no such file %s: %v", uri, err)
213213
}
214214
gof, ok := f.(*goFile)
215215
if !ok {
216-
return fmt.Errorf("non Go file %s", uri)
216+
return errors.Errorf("non Go file %s", uri)
217217
}
218218
if err := imp.cachePerFile(gof, ph, pkg); err != nil {
219-
return fmt.Errorf("failed to cache file %s: %v", gof.URI(), err)
219+
return errors.Errorf("failed to cache file %s: %v", gof.URI(), err)
220220
}
221221
}
222222

@@ -246,7 +246,7 @@ func (imp *importer) cachePerFile(gof *goFile, ph source.ParseGoHandle, p *pkg)
246246

247247
file, err := ph.Parse(imp.ctx)
248248
if file == nil {
249-
return fmt.Errorf("no AST for %s: %v", ph.File().Identity().URI, err)
249+
return errors.Errorf("no AST for %s: %v", ph.File().Identity().URI, err)
250250
}
251251
gof.imports = file.Imports
252252
return nil

internal/lsp/cache/gofile.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package cache
66

77
import (
88
"context"
9-
"fmt"
109
"go/ast"
1110
"go/token"
1211
"sync"
@@ -15,6 +14,7 @@ import (
1514
"golang.org/x/tools/internal/lsp/telemetry"
1615
"golang.org/x/tools/internal/lsp/telemetry/log"
1716
"golang.org/x/tools/internal/span"
17+
errors "golang.org/x/xerrors"
1818
)
1919

2020
// goFile holds all of the information we know about a Go file.
@@ -55,7 +55,7 @@ func (f *goFile) GetToken(ctx context.Context) (*token.File, error) {
5555
}
5656
tok := f.view.session.cache.fset.File(file.Pos())
5757
if tok == nil {
58-
return nil, fmt.Errorf("no token.File for %s", f.URI())
58+
return nil, errors.Errorf("no token.File for %s", f.URI())
5959
}
6060
return tok, nil
6161
}
@@ -67,7 +67,7 @@ func (f *goFile) GetAST(ctx context.Context, mode source.ParseMode) (*ast.File,
6767

6868
if f.isDirty(ctx) || f.wrongParseMode(ctx, mode) {
6969
if _, err := f.view.loadParseTypecheck(ctx, f); err != nil {
70-
return nil, fmt.Errorf("GetAST: unable to check package for %s: %v", f.URI(), err)
70+
return nil, errors.Errorf("GetAST: unable to check package for %s: %v", f.URI(), err)
7171
}
7272
}
7373
fh := f.Handle(ctx)

internal/lsp/cache/load.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"golang.org/x/tools/internal/lsp/telemetry/tag"
1616
"golang.org/x/tools/internal/lsp/telemetry/trace"
1717
"golang.org/x/tools/internal/span"
18+
errors "golang.org/x/xerrors"
1819
)
1920

2021
func (v *view) loadParseTypecheck(ctx context.Context, f *goFile) ([]packages.Error, error) {
@@ -55,11 +56,11 @@ func (v *view) loadParseTypecheck(ctx context.Context, f *goFile) ([]packages.Er
5556
return nil, err
5657
}
5758
if pkg == nil || pkg.IsIllTyped() {
58-
return nil, fmt.Errorf("loadParseTypecheck: %s is ill typed", m.pkgPath)
59+
return nil, errors.Errorf("loadParseTypecheck: %s is ill typed", m.pkgPath)
5960
}
6061
}
6162
if len(f.pkgs) == 0 {
62-
return nil, fmt.Errorf("no packages found for %s", f.URI())
63+
return nil, errors.Errorf("no packages found for %s", f.URI())
6364
}
6465
return nil, nil
6566
}
@@ -93,7 +94,7 @@ func (v *view) checkMetadata(ctx context.Context, f *goFile) (map[packageID]*met
9394
pkgs, err := packages.Load(v.Config(ctx), fmt.Sprintf("file=%s", f.filename()))
9495
if len(pkgs) == 0 {
9596
if err == nil {
96-
err = fmt.Errorf("go/packages.Load: no packages found for %s", f.filename())
97+
err = errors.Errorf("go/packages.Load: no packages found for %s", f.filename())
9798
}
9899
// Return this error as a diagnostic to the user.
99100
return nil, []packages.Error{
@@ -112,7 +113,7 @@ func (v *view) checkMetadata(ctx context.Context, f *goFile) (map[packageID]*met
112113
// If the package comes back with errors from `go list`,
113114
// don't bother type-checking it.
114115
if len(pkg.Errors) > 0 {
115-
return nil, pkg.Errors, fmt.Errorf("package %s has errors, skipping type-checking", pkg.PkgPath)
116+
return nil, pkg.Errors, errors.Errorf("package %s has errors, skipping type-checking", pkg.PkgPath)
116117
}
117118
// Build the import graph for this package.
118119
if err := v.link(ctx, packagePath(pkg.PkgPath), pkg, nil, missingImports); err != nil {
@@ -132,7 +133,7 @@ func validateMetadata(ctx context.Context, missingImports map[packagePath]struct
132133

133134
// If `go list` failed to get data for the file in question (this should never happen).
134135
if len(f.meta) == 0 {
135-
return nil, fmt.Errorf("loadParseTypecheck: no metadata found for %v", f.filename())
136+
return nil, errors.Errorf("loadParseTypecheck: no metadata found for %v", f.filename())
136137
}
137138

138139
// If we have already seen these missing imports before, and we have type information,
@@ -254,7 +255,7 @@ func (v *view) link(ctx context.Context, pkgPath packagePath, pkg *packages.Pack
254255
for importPath, importPkg := range pkg.Imports {
255256
importPkgPath := packagePath(importPath)
256257
if importPkgPath == pkgPath {
257-
return fmt.Errorf("cycle detected in %s", importPath)
258+
return errors.Errorf("cycle detected in %s", importPath)
258259
}
259260
// Don't remember any imports with significant errors.
260261
if importPkgPath != "unsafe" && len(pkg.CompiledGoFiles) == 0 {

internal/lsp/cache/modfile.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ package cache
66

77
import (
88
"context"
9-
"fmt"
109
"go/token"
10+
11+
errors "golang.org/x/xerrors"
1112
)
1213

1314
// modFile holds all of the information we know about a mod file.
@@ -16,7 +17,7 @@ type modFile struct {
1617
}
1718

1819
func (*modFile) GetToken(context.Context) (*token.File, error) {
19-
return nil, fmt.Errorf("GetToken: not implemented")
20+
return nil, errors.Errorf("GetToken: not implemented")
2021
}
2122

2223
func (*modFile) setContent(content []byte) {}

internal/lsp/cache/parse.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package cache
66

77
import (
88
"context"
9-
"fmt"
109
"go/ast"
1110
"go/parser"
1211
"go/scanner"
@@ -16,6 +15,7 @@ import (
1615
"golang.org/x/tools/internal/lsp/telemetry"
1716
"golang.org/x/tools/internal/lsp/telemetry/trace"
1817
"golang.org/x/tools/internal/memoize"
18+
errors "golang.org/x/xerrors"
1919
)
2020

2121
// Limits the number of parallel parser calls per process.
@@ -154,7 +154,7 @@ func fix(ctx context.Context, file *ast.File, tok *token.File, src []byte) error
154154
case *ast.BadStmt:
155155
err = parseDeferOrGoStmt(n, parent, tok, src) // don't shadow err
156156
if err != nil {
157-
err = fmt.Errorf("unable to parse defer or go from *ast.BadStmt: %v", err)
157+
err = errors.Errorf("unable to parse defer or go from *ast.BadStmt: %v", err)
158158
}
159159
return false
160160
default:
@@ -182,7 +182,7 @@ func parseDeferOrGoStmt(bad *ast.BadStmt, parent ast.Node, tok *token.File, src
182182
var lit string
183183
for {
184184
if tkn == token.EOF {
185-
return fmt.Errorf("reached the end of the file")
185+
return errors.Errorf("reached the end of the file")
186186
}
187187
if pos >= bad.From {
188188
break
@@ -200,7 +200,7 @@ func parseDeferOrGoStmt(bad *ast.BadStmt, parent ast.Node, tok *token.File, src
200200
Go: pos,
201201
}
202202
default:
203-
return fmt.Errorf("no defer or go statement found")
203+
return errors.Errorf("no defer or go statement found")
204204
}
205205

206206
// The expression after the "defer" or "go" starts at this position.
@@ -225,15 +225,15 @@ FindTo:
225225
to = curr
226226
}
227227
if !from.IsValid() || tok.Offset(from) >= len(src) {
228-
return fmt.Errorf("invalid from position")
228+
return errors.Errorf("invalid from position")
229229
}
230230
if !to.IsValid() || tok.Offset(to)+1 >= len(src) {
231-
return fmt.Errorf("invalid to position")
231+
return errors.Errorf("invalid to position")
232232
}
233233
exprstr := string(src[tok.Offset(from) : tok.Offset(to)+1])
234234
expr, err := parser.ParseExpr(exprstr)
235235
if expr == nil {
236-
return fmt.Errorf("no expr in %s: %v", exprstr, err)
236+
return errors.Errorf("no expr in %s: %v", exprstr, err)
237237
}
238238
// parser.ParseExpr returns undefined positions.
239239
// Adjust them for the current file.

internal/lsp/cache/session.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package cache
66

77
import (
88
"context"
9-
"fmt"
109
"os"
1110
"sort"
1211
"strconv"
@@ -21,6 +20,7 @@ import (
2120
"golang.org/x/tools/internal/lsp/telemetry/trace"
2221
"golang.org/x/tools/internal/span"
2322
"golang.org/x/tools/internal/xcontext"
23+
errors "golang.org/x/xerrors"
2424
)
2525

2626
type session struct {
@@ -178,7 +178,7 @@ func (s *session) removeView(ctx context.Context, view *view) error {
178178
return nil
179179
}
180180
}
181-
return fmt.Errorf("view %s for %v not found", view.Name(), view.Folder())
181+
return errors.Errorf("view %s for %v not found", view.Name(), view.Folder())
182182
}
183183

184184
// TODO: Propagate the language ID through to the view.

internal/lsp/cache/sumfile.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ package cache
66

77
import (
88
"context"
9-
"fmt"
109
"go/token"
10+
11+
errors "golang.org/x/xerrors"
1112
)
1213

1314
// sumFile holds all of the information we know about a sum file.
@@ -16,7 +17,7 @@ type sumFile struct {
1617
}
1718

1819
func (*sumFile) GetToken(context.Context) (*token.File, error) {
19-
return nil, fmt.Errorf("GetToken: not implemented")
20+
return nil, errors.Errorf("GetToken: not implemented")
2021
}
2122

2223
func (*sumFile) setContent(content []byte) {}

internal/lsp/cache/token.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ package cache
66

77
import (
88
"context"
9-
"fmt"
109
"go/token"
1110

1211
"golang.org/x/tools/internal/lsp/source"
1312
"golang.org/x/tools/internal/memoize"
13+
errors "golang.org/x/xerrors"
1414
)
1515

1616
type tokenKey struct {
@@ -87,7 +87,7 @@ func tokenFile(ctx context.Context, c *cache, fh source.FileHandle) (*token.File
8787
}
8888
tok := c.FileSet().AddFile(fh.Identity().URI.Filename(), -1, len(buf))
8989
if tok == nil {
90-
return nil, fmt.Errorf("no token.File for %s", fh.Identity().URI)
90+
return nil, errors.Errorf("no token.File for %s", fh.Identity().URI)
9191
}
9292
tok.SetLinesForContent(buf)
9393
return tok, nil

internal/lsp/cmd/check.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"time"
1212

1313
"golang.org/x/tools/internal/span"
14+
errors "golang.org/x/xerrors"
1415
)
1516

1617
// check implements the check verb for gopls.
@@ -60,14 +61,14 @@ func (c *check) Run(ctx context.Context, args ...string) error {
6061
select {
6162
case <-file.hasDiagnostics:
6263
case <-time.After(30 * time.Second):
63-
return fmt.Errorf("timed out waiting for results from %v", file.uri)
64+
return errors.Errorf("timed out waiting for results from %v", file.uri)
6465
}
6566
file.diagnosticsMu.Lock()
6667
defer file.diagnosticsMu.Unlock()
6768
for _, d := range file.diagnostics {
6869
spn, err := file.mapper.RangeSpan(d.Range)
6970
if err != nil {
70-
return fmt.Errorf("Could not convert position %v for %q", d.Range, d.Message)
71+
return errors.Errorf("Could not convert position %v for %q", d.Range, d.Message)
7172
}
7273
fmt.Printf("%v: %v\n", spn, d.Message)
7374
}

0 commit comments

Comments
 (0)