diff --git a/internal/lsp/cache/errors.go b/internal/lsp/cache/errors.go index f910fc1e02..46edd90539 100644 --- a/internal/lsp/cache/errors.go +++ b/internal/lsp/cache/errors.go @@ -177,7 +177,7 @@ func toSourceErrorKind(kind packages.ErrorKind) source.ErrorKind { func typeErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, pos token.Pos) (span.Span, error) { posn := fset.Position(pos) - ph, _, err := findFileInPackage(pkg, span.FileURI(posn.Filename)) + ph, _, err := source.FindFileInPackage(pkg, span.FileURI(posn.Filename)) if err != nil { return span.Span{}, err } @@ -213,7 +213,7 @@ func typeErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, pos toke } func scannerErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, posn token.Position) (span.Span, error) { - ph, _, err := findFileInPackage(pkg, span.FileURI(posn.Filename)) + ph, _, err := source.FindFileInPackage(pkg, span.FileURI(posn.Filename)) if err != nil { return span.Span{}, err } @@ -232,7 +232,7 @@ func scannerErrorRange(ctx context.Context, fset *token.FileSet, pkg *pkg, posn // spanToRange converts a span.Span to a protocol.Range, // assuming that the span belongs to the package whose diagnostics are being computed. func spanToRange(ctx context.Context, pkg *pkg, spn span.Span) (protocol.Range, error) { - ph, _, err := findFileInPackage(pkg, spn.URI()) + ph, _, err := source.FindFileInPackage(pkg, spn.URI()) if err != nil { return protocol.Range{}, err } @@ -243,27 +243,6 @@ func spanToRange(ctx context.Context, pkg *pkg, spn span.Span) (protocol.Range, return m.Range(spn) } -func findFileInPackage(pkg source.Package, uri span.URI) (source.ParseGoHandle, source.Package, error) { - queue := []source.Package{pkg} - seen := make(map[string]bool) - - for len(queue) > 0 { - pkg := queue[0] - queue = queue[1:] - seen[pkg.ID()] = true - - if f, err := pkg.File(uri); err == nil { - return f, pkg, nil - } - for _, dep := range pkg.Imports() { - if !seen[dep.ID()] { - queue = append(queue, dep) - } - } - } - return nil, nil, errors.Errorf("no file for %s in package %s", uri, pkg.ID()) -} - // parseGoListError attempts to parse a standard `go list` error message // by stripping off the trailing error message. // diff --git a/internal/lsp/source/hover.go b/internal/lsp/source/hover.go index 586e817ecf..57b10a4385 100644 --- a/internal/lsp/source/hover.go +++ b/internal/lsp/source/hover.go @@ -89,7 +89,7 @@ func (i *IdentifierInfo) linkAndSymbolName() (string, string) { // package's API). This is true if the request originated in a test package, // and if the declaration is also found in the same test package. if i.pkg != nil && obj.Pkg() != nil && i.pkg.ForTest() != "" { - if _, pkg, _ := findFileInPackage(i.pkg, i.Declaration.URI()); i.pkg == pkg { + if _, pkg, _ := FindFileInPackage(i.pkg, i.Declaration.URI()); i.pkg == pkg { return "", "" } } diff --git a/internal/lsp/source/util.go b/internal/lsp/source/util.go index 34e63176f2..ff0d2be112 100644 --- a/internal/lsp/source/util.go +++ b/internal/lsp/source/util.go @@ -637,7 +637,7 @@ func findPosInPackage(v View, searchpkg Package, pos token.Pos) (*ast.File, Pack if v.Ignore(uri) { ph, err = findIgnoredFile(v, uri) } else { - ph, pkg, err = findFileInPackage(searchpkg, uri) + ph, pkg, err = FindFileInPackage(searchpkg, uri) } if err != nil { return nil, nil, err @@ -661,7 +661,7 @@ func findMapperInPackage(v View, searchpkg Package, uri span.URI) (*protocol.Col if v.Ignore(uri) { ph, err = findIgnoredFile(v, uri) } else { - ph, _, err = findFileInPackage(searchpkg, uri) + ph, _, err = FindFileInPackage(searchpkg, uri) } if err != nil { return nil, err @@ -681,7 +681,8 @@ func findIgnoredFile(v View, uri span.URI) (ParseGoHandle, error) { return v.Session().Cache().ParseGoHandle(fh, ParseFull), nil } -func findFileInPackage(pkg Package, uri span.URI) (ParseGoHandle, Package, error) { +// FindFileInPackage finds uri in pkg or its dependencies. +func FindFileInPackage(pkg Package, uri span.URI) (ParseGoHandle, Package, error) { queue := []Package{pkg} seen := make(map[string]bool)