diff options
author | Rebecca Stambler <rstambler@golang.org> | 2020-02-19 16:01:45 -0500 |
---|---|---|
committer | Rebecca Stambler <rstambler@golang.org> | 2020-02-25 18:38:19 +0000 |
commit | df82bb964ac28158fdbff3161288f36847979ae8 (patch) | |
tree | 4c01eddd9047447eeff8817e56e354fb11bef2c9 /internal | |
parent | a0ec867d517c00ba65f6b4d0fc1de72414152fc7 (diff) | |
download | golang-x-tools-df82bb964ac28158fdbff3161288f36847979ae8.tar.gz |
internal/lsp: add a test for internal imports handling
I'm still not sure if we need to handle any other non-standard package
path apart from "command-line-arguments".
Also, a couple of staticcheck fixes.
Change-Id: I0bb3e60f6ffe104ff9027dbebb628020caaa1af4
Reviewed-on: https://go-review.googlesource.com/c/tools/+/220138
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Diffstat (limited to 'internal')
-rw-r--r-- | internal/lsp/cache/check.go | 26 | ||||
-rw-r--r-- | internal/lsp/fake/editor.go | 6 | ||||
-rw-r--r-- | internal/lsp/testdata/lsp/primarymod/assign/assign.go.in | 3 | ||||
-rw-r--r-- | internal/lsp/testdata/lsp/primarymod/assign/internal/secret/secret.go | 3 | ||||
-rw-r--r-- | internal/lsp/testdata/lsp/primarymod/bad/bad0.go | 2 | ||||
-rw-r--r-- | internal/lsp/testdata/lsp/summary.txt.golden | 2 |
6 files changed, 24 insertions, 18 deletions
diff --git a/internal/lsp/cache/check.go b/internal/lsp/cache/check.go index e6f573dc8..be472fdcb 100644 --- a/internal/lsp/cache/check.go +++ b/internal/lsp/cache/check.go @@ -54,19 +54,6 @@ func (ph *packageHandle) packageKey() packageKey { } } -func (ph *packageHandle) isValidImportFor(parentPkgPath string) bool { - importPath := string(ph.m.pkgPath) - - pkgRootIndex := strings.Index(importPath, "/internal/") - if pkgRootIndex != -1 && parentPkgPath != "command-line-arguments" { - if !strings.HasPrefix(parentPkgPath, importPath[0:pkgRootIndex]) { - return false - } - } - - return true -} - // packageData contains the data produced by type-checking a package. type packageData struct { memoize.NoCopy @@ -381,7 +368,7 @@ func typeCheck(ctx context.Context, fset *token.FileSet, m *metadata, mode sourc if dep == nil { return nil, errors.Errorf("no package for import %s", pkgPath) } - if !dep.isValidImportFor(pkg.PkgPath()) { + if !isValidImport(m.pkgPath, dep.m.pkgPath) { return nil, errors.Errorf("invalid use of internal package %s", pkgPath) } depPkg, err := dep.check(ctx) @@ -416,6 +403,17 @@ func typeCheck(ctx context.Context, fset *token.FileSet, m *metadata, mode sourc return pkg, nil } +func isValidImport(pkgPath, importPkgPath packagePath) bool { + i := strings.LastIndex(string(importPkgPath), "/internal/") + if i == -1 { + return true + } + if pkgPath == "command-line-arguments" { + return true + } + return strings.HasPrefix(string(pkgPath), string(importPkgPath[:i])) +} + // An importFunc is an implementation of the single-method // types.Importer interface based on a function value. type importerFunc func(path string) (*types.Package, error) diff --git a/internal/lsp/fake/editor.go b/internal/lsp/fake/editor.go index e248609e9..4ef7c8f23 100644 --- a/internal/lsp/fake/editor.go +++ b/internal/lsp/fake/editor.go @@ -119,14 +119,14 @@ func (e *Editor) initialize(ctx context.Context) error { if e.server != nil { resp, err := e.server.Initialize(ctx, params) if err != nil { - return fmt.Errorf("Initialize: %v", err) + return fmt.Errorf("initialize: %v", err) } e.mu.Lock() e.serverCapabilities = resp.Capabilities e.mu.Unlock() if err := e.server.Initialized(ctx, &protocol.InitializedParams{}); err != nil { - return fmt.Errorf("Initialized: %v", err) + return fmt.Errorf("initialized: %v", err) } } return nil @@ -341,7 +341,7 @@ func (e *Editor) GoToDefinition(ctx context.Context, path string, pos Pos) (stri resp, err := e.server.Definition(ctx, params) if err != nil { - return "", Pos{}, fmt.Errorf("Definition: %v", err) + return "", Pos{}, fmt.Errorf("definition: %v", err) } if len(resp) == 0 { return "", Pos{}, nil diff --git a/internal/lsp/testdata/lsp/primarymod/assign/assign.go.in b/internal/lsp/testdata/lsp/primarymod/assign/assign.go.in index f07c461c7..3fe256e66 100644 --- a/internal/lsp/testdata/lsp/primarymod/assign/assign.go.in +++ b/internal/lsp/testdata/lsp/primarymod/assign/assign.go.in @@ -1,6 +1,9 @@ package assign +import "golang.org/x/tools/internal/lsp/assign/internal/secret" + func _() { + secret.Hello() var ( myInt int //@item(assignInt, "myInt", "int", "var") myStr string //@item(assignStr, "myStr", "string", "var") diff --git a/internal/lsp/testdata/lsp/primarymod/assign/internal/secret/secret.go b/internal/lsp/testdata/lsp/primarymod/assign/internal/secret/secret.go new file mode 100644 index 000000000..5ee1554df --- /dev/null +++ b/internal/lsp/testdata/lsp/primarymod/assign/internal/secret/secret.go @@ -0,0 +1,3 @@ +package secret + +func Hello() {}
\ No newline at end of file diff --git a/internal/lsp/testdata/lsp/primarymod/bad/bad0.go b/internal/lsp/testdata/lsp/primarymod/bad/bad0.go index 3c3c24981..cfde87c87 100644 --- a/internal/lsp/testdata/lsp/primarymod/bad/bad0.go +++ b/internal/lsp/testdata/lsp/primarymod/bad/bad0.go @@ -2,6 +2,8 @@ package bad +import _ "golang.org/x/tools/internal/lsp/assign/internal/secret" //@diag("\"golang.org/x/tools/internal/lsp/assign/internal/secret\"", "compiler", "could not import golang.org/x/tools/internal/lsp/assign/internal/secret (invalid use of internal package golang.org/x/tools/internal/lsp/assign/internal/secret)", "error") + func stuff() { //@item(stuff, "stuff", "func()", "func") x := "heeeeyyyy" random2(x) //@diag("x", "compiler", "cannot use x (variable of type string) as int value in argument to random2", "error") diff --git a/internal/lsp/testdata/lsp/summary.txt.golden b/internal/lsp/testdata/lsp/summary.txt.golden index 57faa0c84..7b1a2eb1b 100644 --- a/internal/lsp/testdata/lsp/summary.txt.golden +++ b/internal/lsp/testdata/lsp/summary.txt.golden @@ -7,7 +7,7 @@ DeepCompletionsCount = 5 FuzzyCompletionsCount = 8 RankedCompletionsCount = 111 CaseSensitiveCompletionsCount = 4 -DiagnosticsCount = 38 +DiagnosticsCount = 39 FoldingRangesCount = 2 FormatCount = 6 ImportCount = 7 |