Skip to content

Commit 8456940

Browse files
committed
internal/lsp: remove the pkg.view field, in preparation for CL 204079
This change encompasses the refactorings needed to correctly implement CL 204079. The goal of this CL is to make the actual relevant diffs more clear. Change-Id: I38acfd436e2380be790910e01b6e37d8280e9100 Reviewed-on: https://go-review.googlesource.com/c/tools/+/204139 Run-TryBot: Rebecca Stambler <[email protected]> Reviewed-by: Ian Cottrell <[email protected]>
1 parent b9c20ae commit 8456940

13 files changed

+69
-68
lines changed

internal/lsp/cache/analysis.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ func runAnalysis(ctx context.Context, fset *token.FileSet, act *actionHandle) ([
262262

263263
var errors []*source.Error
264264
for _, diag := range diagnostics {
265-
srcErr, err := sourceError(ctx, act.pkg, diag)
265+
srcErr, err := sourceError(ctx, fset, act.pkg, diag)
266266
if err != nil {
267267
return nil, nil, err
268268
}

internal/lsp/cache/check.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"context"
1010
"fmt"
1111
"go/ast"
12+
"go/token"
1213
"go/types"
1314
"sort"
1415
"sync"
@@ -69,6 +70,7 @@ func (s *snapshot) checkPackageHandle(ctx context.Context, id packageID, mode so
6970
if err != nil {
7071
return nil, err
7172
}
73+
fset := s.View().Session().Cache().FileSet()
7274
h := s.view.session.cache.store.Bind(string(cph.key), func(ctx context.Context) interface{} {
7375
// Begin loading the direct dependencies, in parallel.
7476
for _, impID := range cph.imports {
@@ -81,7 +83,7 @@ func (s *snapshot) checkPackageHandle(ctx context.Context, id packageID, mode so
8183
}(dep)
8284
}
8385
data := &checkPackageData{}
84-
data.pkg, data.err = s.typeCheck(ctx, cph)
86+
data.pkg, data.err = s.typeCheck(ctx, fset, cph)
8587
return data
8688
})
8789
cph.handle = h
@@ -211,7 +213,7 @@ func (s *snapshot) parseGoHandles(ctx context.Context, m *metadata, mode source.
211213
return phs, nil
212214
}
213215

214-
func (s *snapshot) typeCheck(ctx context.Context, cph *checkPackageHandle) (*pkg, error) {
216+
func (s *snapshot) typeCheck(ctx context.Context, fset *token.FileSet, cph *checkPackageHandle) (*pkg, error) {
215217
ctx, done := trace.StartSpan(ctx, "cache.importer.typeCheck", telemetry.Package.Of(cph.m.id))
216218
defer done()
217219

@@ -221,7 +223,6 @@ func (s *snapshot) typeCheck(ctx context.Context, cph *checkPackageHandle) (*pkg
221223
}
222224

223225
pkg := &pkg{
224-
view: s.view,
225226
id: cph.m.id,
226227
mode: cph.mode,
227228
pkgPath: cph.m.pkgPath,
@@ -305,7 +306,7 @@ func (s *snapshot) typeCheck(ctx context.Context, cph *checkPackageHandle) (*pkg
305306
// We don't care about a package's errors unless we have parsed it in full.
306307
if cph.mode == source.ParseFull {
307308
for _, e := range rawErrors {
308-
srcErr, err := sourceError(ctx, pkg, e)
309+
srcErr, err := sourceError(ctx, fset, pkg, e)
309310
if err != nil {
310311
return nil, err
311312
}

internal/lsp/cache/errors.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
errors "golang.org/x/xerrors"
1919
)
2020

21-
func sourceError(ctx context.Context, pkg *pkg, e interface{}) (*source.Error, error) {
21+
func sourceError(ctx context.Context, fset *token.FileSet, pkg *pkg, e interface{}) (*source.Error, error) {
2222
var (
2323
spn span.Span
2424
err error
@@ -27,7 +27,6 @@ func sourceError(ctx context.Context, pkg *pkg, e interface{}) (*source.Error, e
2727
fixes []source.SuggestedFix
2828
related []source.RelatedInformation
2929
)
30-
fset := pkg.view.session.cache.fset
3130
switch e := e.(type) {
3231
case packages.Error:
3332
if e.Pos == "" {
@@ -163,7 +162,7 @@ func typeErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, pos toke
163162
return span.Span{}, err
164163
}
165164
posn := fset.Position(pos)
166-
ph, _, err := pkg.FindFile(ctx, span.FileURI(posn.Filename))
165+
ph, _, err := findFileInPackage(ctx, span.FileURI(posn.Filename), pkg)
167166
if err != nil {
168167
return spn, nil // ignore errors
169168
}
@@ -196,7 +195,7 @@ func typeErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, pos toke
196195
}
197196

198197
func scannerErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, posn token.Position) (span.Span, error) {
199-
ph, _, err := pkg.FindFile(ctx, span.FileURI(posn.Filename))
198+
ph, _, err := findFileInPackage(ctx, span.FileURI(posn.Filename), pkg)
200199
if err != nil {
201200
return span.Span{}, err
202201
}
@@ -224,7 +223,7 @@ func scannerErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, posn
224223
// spanToRange converts a span.Span to a protocol.Range,
225224
// assuming that the span belongs to the package whose diagnostics are being computed.
226225
func spanToRange(ctx context.Context, pkg *pkg, spn span.Span) (protocol.Range, error) {
227-
ph, _, err := pkg.FindFile(ctx, spn.URI())
226+
ph, _, err := findFileInPackage(ctx, spn.URI(), pkg)
228227
if err != nil {
229228
return protocol.Range{}, err
230229
}

internal/lsp/cache/pkg.go

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ import (
1717

1818
// pkg contains the type information needed by the source package.
1919
type pkg struct {
20-
view *view
21-
2220
// ID and package path have their own types to avoid being used interchangeably.
2321
id packageID
2422
pkgPath packagePath
@@ -38,10 +36,6 @@ type pkg struct {
3836
type packageID string
3937
type packagePath string
4038

41-
func (p *pkg) View() source.View {
42-
return p.view
43-
}
44-
4539
func (p *pkg) ID() string {
4640
return string(p.id)
4741
}
@@ -94,14 +88,22 @@ func (p *pkg) IsIllTyped() bool {
9488
return p.types == nil || p.typesInfo == nil || p.typesSizes == nil
9589
}
9690

97-
func (p *pkg) GetImport(ctx context.Context, pkgPath string) (source.Package, error) {
91+
func (p *pkg) GetImport(pkgPath string) (source.Package, error) {
9892
if imp := p.imports[packagePath(pkgPath)]; imp != nil {
9993
return imp, nil
10094
}
10195
// Don't return a nil pointer because that still satisfies the interface.
10296
return nil, errors.Errorf("no imported package for %s", pkgPath)
10397
}
10498

99+
func (p *pkg) Imports() []source.Package {
100+
var result []source.Package
101+
for _, imp := range p.imports {
102+
result = append(result, imp)
103+
}
104+
return result
105+
}
106+
105107
func (s *snapshot) FindAnalysisError(ctx context.Context, id string, diag protocol.Diagnostic) (*source.Error, error) {
106108
acts := s.getActionHandles(packageID(id), source.ParseFull)
107109
for _, act := range acts {
@@ -125,26 +127,21 @@ func (s *snapshot) FindAnalysisError(ctx context.Context, id string, diag protoc
125127
return nil, errors.Errorf("no matching diagnostic for %v", diag)
126128
}
127129

128-
func (p *pkg) FindFile(ctx context.Context, uri span.URI) (source.ParseGoHandle, source.Package, error) {
129-
// Special case for ignored files.
130-
if p.view.Ignore(uri) {
131-
return p.view.findIgnoredFile(ctx, uri)
132-
}
133-
134-
queue := []*pkg{p}
130+
func findFileInPackage(ctx context.Context, uri span.URI, pkg source.Package) (source.ParseGoHandle, source.Package, error) {
131+
queue := []source.Package{pkg}
135132
seen := make(map[string]bool)
136133

137134
for len(queue) > 0 {
138135
pkg := queue[0]
139136
queue = queue[1:]
140137
seen[pkg.ID()] = true
141138

142-
for _, ph := range pkg.files {
139+
for _, ph := range pkg.Files() {
143140
if ph.File().Identity().URI == uri {
144141
return ph, pkg, nil
145142
}
146143
}
147-
for _, dep := range pkg.imports {
144+
for _, dep := range pkg.Imports() {
148145
if !seen[dep.ID()] {
149146
queue = append(queue, dep)
150147
}

internal/lsp/cache/view.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,14 @@ func (v *view) openFiles(ctx context.Context, uris []span.URI) (results []source
418418
return results
419419
}
420420

421+
func (v *view) FindFileInPackage(ctx context.Context, uri span.URI, pkg source.Package) (source.ParseGoHandle, source.Package, error) {
422+
// Special case for ignored files.
423+
if v.Ignore(uri) {
424+
return v.findIgnoredFile(ctx, uri)
425+
}
426+
return findFileInPackage(ctx, uri, pkg)
427+
}
428+
421429
type debugView struct{ *view }
422430

423431
func (v debugView) ID() string { return v.id }

internal/lsp/source/completion_format.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func (c *completer) item(cand candidate) (CompletionItem, error) {
125125
return item, nil
126126
}
127127
uri := span.FileURI(pos.Filename)
128-
ph, pkg, err := c.pkg.FindFile(c.ctx, uri)
128+
ph, pkg, err := c.view.FindFileInPackage(c.ctx, uri, c.pkg)
129129
if err != nil {
130130
return CompletionItem{}, err
131131
}

internal/lsp/source/identifier.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func identifier(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.F
108108
if path == nil {
109109
return nil, errors.Errorf("can't find node enclosing position")
110110
}
111-
view := pkg.View()
111+
view := snapshot.View()
112112
uri := span.FileURI(view.Session().Cache().FileSet().Position(pos).Filename)
113113
var ph ParseGoHandle
114114
for _, h := range pkg.Files() {
@@ -134,7 +134,7 @@ func identifier(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.F
134134
}
135135
}
136136
result.Name = result.ident.Name
137-
if result.mappedRange, err = posToMappedRange(ctx, pkg, result.ident.Pos(), result.ident.End()); err != nil {
137+
if result.mappedRange, err = posToMappedRange(ctx, view, pkg, result.ident.Pos(), result.ident.End()); err != nil {
138138
return nil, err
139139
}
140140
result.Declaration.obj = pkg.GetTypesInfo().ObjectOf(result.ident)
@@ -165,7 +165,7 @@ func identifier(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.F
165165
return nil, errors.Errorf("no declaration for %s", result.Name)
166166
}
167167
result.Declaration.node = decl
168-
if result.Declaration.mappedRange, err = nameToMappedRange(ctx, pkg, decl.Pos(), result.Name); err != nil {
168+
if result.Declaration.mappedRange, err = nameToMappedRange(ctx, view, pkg, decl.Pos(), result.Name); err != nil {
169169
return nil, err
170170
}
171171
return result, nil
@@ -190,10 +190,10 @@ func identifier(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.F
190190
}
191191
}
192192

193-
if result.Declaration.mappedRange, err = objToMappedRange(ctx, pkg, result.Declaration.obj); err != nil {
193+
if result.Declaration.mappedRange, err = objToMappedRange(ctx, view, pkg, result.Declaration.obj); err != nil {
194194
return nil, err
195195
}
196-
if result.Declaration.node, err = objToNode(ctx, pkg, result.Declaration.obj); err != nil {
196+
if result.Declaration.node, err = objToNode(ctx, snapshot.View(), pkg, result.Declaration.obj); err != nil {
197197
return nil, err
198198
}
199199
typ := pkg.GetTypesInfo().TypeOf(result.ident)
@@ -207,7 +207,7 @@ func identifier(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.F
207207
if hasErrorType(result.Type.Object) {
208208
return result, nil
209209
}
210-
if result.Type.mappedRange, err = objToMappedRange(ctx, pkg, result.Type.Object); err != nil {
210+
if result.Type.mappedRange, err = objToMappedRange(ctx, view, pkg, result.Type.Object); err != nil {
211211
return nil, err
212212
}
213213
}
@@ -241,10 +241,9 @@ func hasErrorType(obj types.Object) bool {
241241
return types.IsInterface(obj.Type()) && obj.Pkg() == nil && obj.Name() == "error"
242242
}
243243

244-
func objToNode(ctx context.Context, pkg Package, obj types.Object) (ast.Decl, error) {
245-
view := pkg.View()
246-
uri := span.FileURI(view.Session().Cache().FileSet().Position(obj.Pos()).Filename)
247-
ph, _, err := pkg.FindFile(ctx, uri)
244+
func objToNode(ctx context.Context, v View, pkg Package, obj types.Object) (ast.Decl, error) {
245+
uri := span.FileURI(v.Session().Cache().FileSet().Position(obj.Pos()).Filename)
246+
ph, _, err := v.FindFileInPackage(ctx, uri, pkg)
248247
if err != nil {
249248
return nil, err
250249
}
@@ -292,7 +291,7 @@ func importSpec(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.F
292291
if err != nil {
293292
return nil, errors.Errorf("import path not quoted: %s (%v)", imp.Path.Value, err)
294293
}
295-
uri := span.FileURI(pkg.View().Session().Cache().FileSet().Position(pos).Filename)
294+
uri := span.FileURI(snapshot.View().Session().Cache().FileSet().Position(pos).Filename)
296295
var ph ParseGoHandle
297296
for _, h := range pkg.Files() {
298297
if h.File().Identity().URI == uri {
@@ -305,11 +304,11 @@ func importSpec(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.F
305304
Name: importPath,
306305
pkg: pkg,
307306
}
308-
if result.mappedRange, err = posToMappedRange(ctx, pkg, imp.Path.Pos(), imp.Path.End()); err != nil {
307+
if result.mappedRange, err = posToMappedRange(ctx, snapshot.View(), pkg, imp.Path.Pos(), imp.Path.End()); err != nil {
309308
return nil, err
310309
}
311310
// Consider the "declaration" of an import spec to be the imported package.
312-
importedPkg, err := pkg.GetImport(ctx, importPath)
311+
importedPkg, err := pkg.GetImport(importPath)
313312
if err != nil {
314313
return nil, err
315314
}
@@ -326,7 +325,7 @@ func importSpec(ctx context.Context, snapshot Snapshot, pkg Package, file *ast.F
326325
if dest == nil {
327326
return nil, errors.Errorf("package %q has no files", importPath)
328327
}
329-
if result.Declaration.mappedRange, err = posToMappedRange(ctx, pkg, dest.Pos(), dest.End()); err != nil {
328+
if result.Declaration.mappedRange, err = posToMappedRange(ctx, snapshot.View(), pkg, dest.Pos(), dest.End()); err != nil {
330329
return nil, err
331330
}
332331
result.Declaration.node = imp

internal/lsp/source/references.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (i *IdentifierInfo) References(ctx context.Context) ([]*ReferenceInfo, erro
5555
if obj == nil || !sameObj(obj, i.Declaration.obj) {
5656
continue
5757
}
58-
rng, err := posToMappedRange(ctx, i.pkg, ident.Pos(), ident.End())
58+
rng, err := posToMappedRange(ctx, i.Snapshot.View(), i.pkg, ident.Pos(), ident.End())
5959
if err != nil {
6060
return nil, err
6161
}
@@ -73,7 +73,7 @@ func (i *IdentifierInfo) References(ctx context.Context) ([]*ReferenceInfo, erro
7373
if obj == nil || !sameObj(obj, i.Declaration.obj) {
7474
continue
7575
}
76-
rng, err := posToMappedRange(ctx, i.pkg, ident.Pos(), ident.End())
76+
rng, err := posToMappedRange(ctx, i.Snapshot.View(), i.pkg, ident.Pos(), ident.End())
7777
if err != nil {
7878
return nil, err
7979
}

internal/lsp/source/rename.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,10 @@ func getPkgNameIdentifier(ctx context.Context, ident *IdentifierInfo, pkgName *t
218218
wasImplicit: true,
219219
}
220220
var err error
221-
if decl.mappedRange, err = objToMappedRange(ctx, ident.pkg, decl.obj); err != nil {
221+
if decl.mappedRange, err = objToMappedRange(ctx, ident.Snapshot.View(), ident.pkg, decl.obj); err != nil {
222222
return nil, err
223223
}
224-
if decl.node, err = objToNode(ctx, ident.pkg, decl.obj); err != nil {
224+
if decl.node, err = objToNode(ctx, ident.Snapshot.View(), ident.pkg, decl.obj); err != nil {
225225
return nil, err
226226
}
227227
return &IdentifierInfo{

internal/lsp/source/rename_check.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ func pathEnclosingInterval(ctx context.Context, fset *token.FileSet, pkg Package
850850
if err != nil {
851851
continue
852852
}
853-
importPkg, err := pkg.GetImport(ctx, importPath)
853+
importPkg, err := pkg.GetImport(importPath)
854854
if err != nil {
855855
return nil, nil, false
856856
}

internal/lsp/source/signature_help.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,11 @@ FindCall:
121121
comment *ast.CommentGroup
122122
)
123123
if obj != nil {
124-
node, err := objToNode(ctx, pkg, obj)
124+
node, err := objToNode(ctx, view, pkg, obj)
125125
if err != nil {
126126
return nil, err
127127
}
128-
rng, err := objToMappedRange(ctx, pkg, obj)
128+
rng, err := objToMappedRange(ctx, view, pkg, obj)
129129
if err != nil {
130130
return nil, err
131131
}

0 commit comments

Comments
 (0)