7 "golang.org/x/tools/internal/lsp/protocol"
8 "golang.org/x/tools/internal/lsp/source"
9 "golang.org/x/tools/internal/lsp/tests"
10 "golang.org/x/tools/internal/span"
13 func (r *runner) Completion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
14 got := r.callCompletion(t, src, func(opts *source.Options) {
15 opts.DeepCompletion = false
16 opts.Matcher = source.CaseInsensitive
17 opts.CompleteUnimported = false
18 opts.InsertTextFormat = protocol.SnippetTextFormat
19 if !strings.Contains(string(src.URI()), "literal") {
20 opts.LiteralCompletions = false
23 got = tests.FilterBuiltins(src, got)
24 want := expected(t, test, items)
25 if diff := tests.DiffCompletionItems(want, got); diff != "" {
30 func (r *runner) CompletionSnippet(t *testing.T, src span.Span, expected tests.CompletionSnippet, placeholders bool, items tests.CompletionItems) {
31 list := r.callCompletion(t, src, func(opts *source.Options) {
32 opts.UsePlaceholders = placeholders
33 opts.DeepCompletion = true
34 opts.Matcher = source.Fuzzy
35 opts.CompleteUnimported = false
37 got := tests.FindItem(list, *items[expected.CompletionItem])
38 want := expected.PlainSnippet
40 want = expected.PlaceholderSnippet
42 if diff := tests.DiffSnippets(want, got); diff != "" {
47 func (r *runner) UnimportedCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
48 got := r.callCompletion(t, src, func(opts *source.Options) {})
49 got = tests.FilterBuiltins(src, got)
50 want := expected(t, test, items)
51 if diff := tests.CheckCompletionOrder(want, got, false); diff != "" {
56 func (r *runner) DeepCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
57 got := r.callCompletion(t, src, func(opts *source.Options) {
58 opts.DeepCompletion = true
59 opts.Matcher = source.CaseInsensitive
60 opts.CompleteUnimported = false
62 got = tests.FilterBuiltins(src, got)
63 want := expected(t, test, items)
64 if msg := tests.DiffCompletionItems(want, got); msg != "" {
69 func (r *runner) FuzzyCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
70 got := r.callCompletion(t, src, func(opts *source.Options) {
71 opts.DeepCompletion = true
72 opts.Matcher = source.Fuzzy
73 opts.CompleteUnimported = false
75 got = tests.FilterBuiltins(src, got)
76 want := expected(t, test, items)
77 if msg := tests.DiffCompletionItems(want, got); msg != "" {
82 func (r *runner) CaseSensitiveCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
83 got := r.callCompletion(t, src, func(opts *source.Options) {
84 opts.Matcher = source.CaseSensitive
85 opts.CompleteUnimported = false
87 got = tests.FilterBuiltins(src, got)
88 want := expected(t, test, items)
89 if msg := tests.DiffCompletionItems(want, got); msg != "" {
94 func (r *runner) RankCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
95 got := r.callCompletion(t, src, func(opts *source.Options) {
96 opts.DeepCompletion = true
97 opts.Matcher = source.Fuzzy
98 opts.CompleteUnimported = false
99 opts.LiteralCompletions = true
101 want := expected(t, test, items)
102 if msg := tests.CheckCompletionOrder(want, got, true); msg != "" {
107 func expected(t *testing.T, test tests.Completion, items tests.CompletionItems) []protocol.CompletionItem {
110 var want []protocol.CompletionItem
111 for _, pos := range test.CompletionItems {
113 want = append(want, tests.ToProtocolCompletionItem(*item))
118 func (r *runner) callCompletion(t *testing.T, src span.Span, options func(*source.Options)) []protocol.CompletionItem {
121 view, err := r.server.session.ViewOf(src.URI())
125 original := view.Options()
126 modified := view.Options().Clone()
128 view, err = view.SetOptions(r.ctx, modified)
133 defer view.SetOptions(r.ctx, original)
135 list, err := r.server.Completion(r.ctx, &protocol.CompletionParams{
136 TextDocumentPositionParams: protocol.TextDocumentPositionParams{
137 TextDocument: protocol.TextDocumentIdentifier{
138 URI: protocol.URIFromSpanURI(src.URI()),
140 Position: protocol.Position{
141 Line: float64(src.Start().Line() - 1),
142 Character: float64(src.Start().Column() - 1),