aboutsummaryrefslogtreecommitdiff
path: root/internal/lsp/source/identifier_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lsp/source/identifier_test.go')
-rw-r--r--internal/lsp/source/identifier_test.go128
1 files changed, 0 insertions, 128 deletions
diff --git a/internal/lsp/source/identifier_test.go b/internal/lsp/source/identifier_test.go
deleted file mode 100644
index 9bbdf58de..000000000
--- a/internal/lsp/source/identifier_test.go
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package source
-
-import (
- "bytes"
- "go/ast"
- "go/parser"
- "go/token"
- "go/types"
- "testing"
-)
-
-func TestSearchForEnclosing(t *testing.T) {
- tests := []struct {
- desc string
- // For convenience, consider the first occurrence of the identifier "X" in
- // src.
- src string
- // By convention, "" means no type found.
- wantTypeName string
- }{
- {
- desc: "self enclosing",
- src: `package a; type X struct {}`,
- wantTypeName: "X",
- },
- {
- // TODO(rFindley): is this correct, or do we want to resolve I2 here?
- desc: "embedded interface in interface",
- src: `package a; var y = i1.X; type i1 interface {I2}; type I2 interface{X()}`,
- wantTypeName: "",
- },
- {
- desc: "embedded interface in struct",
- src: `package a; var y = t.X; type t struct {I}; type I interface{X()}`,
- wantTypeName: "I",
- },
- {
- desc: "double embedding",
- src: `package a; var y = t1.X; type t1 struct {t2}; type t2 struct {I}; type I interface{X()}`,
- wantTypeName: "I",
- },
- {
- desc: "struct field",
- src: `package a; type T struct { X int }`,
- wantTypeName: "T",
- },
- {
- desc: "nested struct field",
- src: `package a; type T struct { E struct { X int } }`,
- wantTypeName: "T",
- },
- {
- desc: "slice entry",
- src: `package a; type T []int; var S = T{X}; var X int = 2`,
- wantTypeName: "T",
- },
- {
- desc: "struct pointer literal",
- src: `package a; type T struct {i int}; var L = &T{X}; const X = 2`,
- wantTypeName: "T",
- },
- }
-
- for _, test := range tests {
- test := test
- t.Run(test.desc, func(t *testing.T) {
- fset := token.NewFileSet()
- file, err := parser.ParseFile(fset, "a.go", test.src, parser.AllErrors)
- if err != nil {
- t.Fatal(err)
- }
- column := 1 + bytes.IndexRune([]byte(test.src), 'X')
- pos := posAt(1, column, fset, "a.go")
- path := pathEnclosingObjNode(file, pos)
- if path == nil {
- t.Fatalf("no ident found at (1, %d)", column)
- }
- info := newInfo()
- if _, err = (*types.Config)(nil).Check("p", fset, []*ast.File{file}, info); err != nil {
- t.Fatal(err)
- }
- obj := searchForEnclosing(info, path)
- if obj == nil {
- if test.wantTypeName != "" {
- t.Errorf("searchForEnclosing(...) = <nil>, want %q", test.wantTypeName)
- }
- return
- }
- if got := obj.Name(); got != test.wantTypeName {
- t.Errorf("searchForEnclosing(...) = %q, want %q", got, test.wantTypeName)
- }
- })
- }
-}
-
-// posAt returns the token.Pos corresponding to the 1-based (line, column)
-// coordinates in the file fname of fset.
-func posAt(line, column int, fset *token.FileSet, fname string) token.Pos {
- var tok *token.File
- fset.Iterate(func(f *token.File) bool {
- if f.Name() == fname {
- tok = f
- return false
- }
- return true
- })
- if tok == nil {
- return token.NoPos
- }
- start := tok.LineStart(line)
- return start + token.Pos(column-1)
-}
-
-// newInfo returns a types.Info with all maps populated.
-func newInfo() *types.Info {
- return &types.Info{
- Types: make(map[ast.Expr]types.TypeAndValue),
- Defs: make(map[*ast.Ident]types.Object),
- Uses: make(map[*ast.Ident]types.Object),
- Implicits: make(map[ast.Node]types.Object),
- Selections: make(map[*ast.SelectorExpr]*types.Selection),
- Scopes: make(map[ast.Node]*types.Scope),
- }
-}