internal/lsp: fix a bug stopped package names from being printed
Also, trigger signature help on completion of a function (the "(" as a
trigger character doesn't work if it's part of a completion).
Change-Id: I952cb875fa72a741d7952178f85e20f9efa3ebff
Reviewed-on: https://go-review.googlesource.com/c/150638
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
			
			
This commit is contained in:
		
							parent
							
								
									d5eafb537d
								
							
						
					
					
						commit
						b5f2cae84d
					
				| 
						 | 
					@ -23,13 +23,21 @@ func toProtocolCompletionItems(items []source.CompletionItem, snippetsSupported,
 | 
				
			||||||
		insertTextFormat = protocol.SnippetTextFormat
 | 
							insertTextFormat = protocol.SnippetTextFormat
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, item := range items {
 | 
						for _, item := range items {
 | 
				
			||||||
		results = append(results, protocol.CompletionItem{
 | 
							insertText, triggerSignatureHelp := labelToProtocolSnippets(item.Label, item.Kind, insertTextFormat, signatureHelpEnabled)
 | 
				
			||||||
 | 
							i := protocol.CompletionItem{
 | 
				
			||||||
			Label:            item.Label,
 | 
								Label:            item.Label,
 | 
				
			||||||
			InsertText:       labelToProtocolSnippets(item.Label, item.Kind, insertTextFormat, signatureHelpEnabled),
 | 
								InsertText:       insertText,
 | 
				
			||||||
			Detail:           item.Detail,
 | 
								Detail:           item.Detail,
 | 
				
			||||||
			Kind:             float64(toProtocolCompletionItemKind(item.Kind)),
 | 
								Kind:             float64(toProtocolCompletionItemKind(item.Kind)),
 | 
				
			||||||
			InsertTextFormat: insertTextFormat,
 | 
								InsertTextFormat: insertTextFormat,
 | 
				
			||||||
		})
 | 
							}
 | 
				
			||||||
 | 
							// If we are completing a function, we should trigger signature help if possible.
 | 
				
			||||||
 | 
							if triggerSignatureHelp && signatureHelpEnabled {
 | 
				
			||||||
 | 
								i.Command = &protocol.Command{
 | 
				
			||||||
 | 
									Command: "editor.action.triggerParameterHints",
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							results = append(results, i)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return results
 | 
						return results
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -59,26 +67,26 @@ func toProtocolCompletionItemKind(kind source.CompletionItemKind) protocol.Compl
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func labelToProtocolSnippets(label string, kind source.CompletionItemKind, insertTextFormat protocol.InsertTextFormat, signatureHelpEnabled bool) string {
 | 
					func labelToProtocolSnippets(label string, kind source.CompletionItemKind, insertTextFormat protocol.InsertTextFormat, signatureHelpEnabled bool) (string, bool) {
 | 
				
			||||||
	switch kind {
 | 
						switch kind {
 | 
				
			||||||
	case source.ConstantCompletionItem:
 | 
						case source.ConstantCompletionItem:
 | 
				
			||||||
		// The label for constants is of the format "<identifier> = <value>".
 | 
							// The label for constants is of the format "<identifier> = <value>".
 | 
				
			||||||
		// We should now insert the " = <value>" part of the label.
 | 
							// We should now insert the " = <value>" part of the label.
 | 
				
			||||||
		return label[:strings.Index(label, " =")]
 | 
							return label[:strings.Index(label, " =")], false
 | 
				
			||||||
	case source.FunctionCompletionItem, source.MethodCompletionItem:
 | 
						case source.FunctionCompletionItem, source.MethodCompletionItem:
 | 
				
			||||||
		trimmed := label[:strings.Index(label, "(")]
 | 
							trimmed := label[:strings.Index(label, "(")]
 | 
				
			||||||
		params := strings.Trim(label[strings.Index(label, "("):], "()")
 | 
							params := strings.Trim(label[strings.Index(label, "("):], "()")
 | 
				
			||||||
		if params == "" {
 | 
							if params == "" {
 | 
				
			||||||
			return label
 | 
								return label, true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// Don't add parameters or parens for the plaintext insert format.
 | 
							// Don't add parameters or parens for the plaintext insert format.
 | 
				
			||||||
		if insertTextFormat == protocol.PlainTextFormat {
 | 
							if insertTextFormat == protocol.PlainTextFormat {
 | 
				
			||||||
			return trimmed
 | 
								return trimmed, true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// If we do have signature help enabled, the user can see parameters as
 | 
							// If we do have signature help enabled, the user can see parameters as
 | 
				
			||||||
		// they type in the function, so we just return empty parentheses.
 | 
							// they type in the function, so we just return empty parentheses.
 | 
				
			||||||
		if signatureHelpEnabled {
 | 
							if signatureHelpEnabled {
 | 
				
			||||||
			return trimmed + "($1)"
 | 
								return trimmed + "($1)", true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// If signature help is not enabled, we should give the user parameters
 | 
							// If signature help is not enabled, we should give the user parameters
 | 
				
			||||||
		// that they can tab through. The insert text format follows the
 | 
							// that they can tab through. The insert text format follows the
 | 
				
			||||||
| 
						 | 
					@ -96,8 +104,8 @@ func labelToProtocolSnippets(label string, kind source.CompletionItemKind, inser
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			trimmed += fmt.Sprintf("${%v:%v}", i+1, r.Replace(strings.Trim(p, " ")))
 | 
								trimmed += fmt.Sprintf("${%v:%v}", i+1, r.Replace(strings.Trim(p, " ")))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return trimmed + ")"
 | 
							return trimmed + ")", false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return label
 | 
						return label, false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@ func testLSP(t *testing.T, exporter packagestest.Exporter) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// We hardcode the expected number of test cases to ensure that all tests
 | 
						// We hardcode the expected number of test cases to ensure that all tests
 | 
				
			||||||
	// are being executed. If a test is added, this number must be changed.
 | 
						// are being executed. If a test is added, this number must be changed.
 | 
				
			||||||
	const expectedCompletionsCount = 43
 | 
						const expectedCompletionsCount = 44
 | 
				
			||||||
	const expectedDiagnosticsCount = 14
 | 
						const expectedDiagnosticsCount = 14
 | 
				
			||||||
	const expectedFormatCount = 3
 | 
						const expectedFormatCount = 3
 | 
				
			||||||
	const expectedDefinitionsCount = 16
 | 
						const expectedDefinitionsCount = 16
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,7 +58,7 @@ func (s *server) Initialize(ctx context.Context, params *protocol.InitializePara
 | 
				
			||||||
			DocumentFormattingProvider:      true,
 | 
								DocumentFormattingProvider:      true,
 | 
				
			||||||
			DocumentRangeFormattingProvider: true,
 | 
								DocumentRangeFormattingProvider: true,
 | 
				
			||||||
			SignatureHelpProvider: protocol.SignatureHelpOptions{
 | 
								SignatureHelpProvider: protocol.SignatureHelpOptions{
 | 
				
			||||||
				TriggerCharacters: []string{"("},
 | 
									TriggerCharacters: []string{"(", ","},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			TextDocumentSync: protocol.TextDocumentSyncOptions{
 | 
								TextDocumentSync: protocol.TextDocumentSyncOptions{
 | 
				
			||||||
				Change:    float64(protocol.Full), // full contents of file sent on each update
 | 
									Change:    float64(protocol.Full), // full contents of file sent on each update
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -492,14 +492,14 @@ func qualifier(f *ast.File, pkg *types.Package, info *types.Info) types.Qualifie
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Define qualifier to replace full package paths with names of the imports.
 | 
						// Define qualifier to replace full package paths with names of the imports.
 | 
				
			||||||
	return func(pkg *types.Package) string {
 | 
						return func(p *types.Package) string {
 | 
				
			||||||
		if pkg == pkg {
 | 
							if p == pkg {
 | 
				
			||||||
			return ""
 | 
								return ""
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if name, ok := imports[pkg]; ok {
 | 
							if name, ok := imports[p]; ok {
 | 
				
			||||||
			return name
 | 
								return name
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return pkg.Name()
 | 
							return p.Name()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,10 @@ import (
 | 
				
			||||||
	"golang.org/x/tools/internal/lsp/foo" //@item(foo, "foo", "\"golang.org/x/tools/internal/lsp/foo\"", "package")
 | 
						"golang.org/x/tools/internal/lsp/foo" //@item(foo, "foo", "\"golang.org/x/tools/internal/lsp/foo\"", "package")
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func helper(i foo.IntFoo) {} //@item(helper, "helper(i foo.IntFoo)", "", "func")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func _() {
 | 
					func _() {
 | 
				
			||||||
 | 
						help //@complete("l", helper)
 | 
				
			||||||
	_ = foo.StructFoo{} //@complete("S", Foo, IntFoo, StructFoo)
 | 
						_ = foo.StructFoo{} //@complete("S", Foo, IntFoo, StructFoo)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,9 +38,9 @@ func _() {
 | 
				
			||||||
		Value: Valen //@complete("le", Valentine)
 | 
							Value: Valen //@complete("le", Valentine)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	_ = foo.StructFoo{
 | 
						_ = foo.StructFoo{
 | 
				
			||||||
		Value:       //@complete(re"$", Valentine, foo, Bar)
 | 
							Value:       //@complete(re"$", Valentine, foo, Bar, helper)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	_ = foo.StructFoo{
 | 
						_ = foo.StructFoo{
 | 
				
			||||||
		Value:       //@complete(" ", Valentine, foo, Bar)
 | 
							Value:       //@complete(" ", Valentine, foo, Bar, helper)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue