internal/lsp: fix active param in signature help

This change adjusts where the start and end of the arguments list are when determining which parameter is the active paramter. Rather than use the first and last argument's position, we will use the start and ending parentheses.

Fixes golang/go#37271

Change-Id: I70bc5c8b4bdb5242fc35a20e63b9a8860cb1d6bd
Reviewed-on: https://go-review.googlesource.com/c/tools/+/221817
Run-TryBot: Rohan Challa <rohan@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/source/signature_help.go b/internal/lsp/source/signature_help.go
index 05cad6a..8db5539 100644
--- a/internal/lsp/source/signature_help.go
+++ b/internal/lsp/source/signature_help.go
@@ -93,7 +93,7 @@
 	qf := qualifier(file, pkg.GetTypes(), pkg.GetTypesInfo())
 	params := formatParams(ctx, snapshot, pkg, sig, qf)
 	results, writeResultParens := formatResults(sig.Results(), qf)
-	activeParam := activeParameter(callExpr.Args, sig.Params().Len(), sig.Variadic(), rng.Start)
+	activeParam := activeParameter(callExpr, sig.Params().Len(), sig.Variadic(), rng.Start)
 
 	var (
 		name    string
@@ -148,7 +148,7 @@
 			variadic = true
 		}
 	}
-	activeParam := activeParameter(callExpr.Args, numParams, variadic, pos)
+	activeParam := activeParameter(callExpr, numParams, variadic, pos)
 	return signatureInformation(name, nil, params, results, writeResultParens), activeParam, nil
 }
 
@@ -169,16 +169,16 @@
 	}
 }
 
-func activeParameter(args []ast.Expr, numParams int, variadic bool, pos token.Pos) (activeParam int) {
-	if len(args) == 0 {
+func activeParameter(callExpr *ast.CallExpr, numParams int, variadic bool, pos token.Pos) (activeParam int) {
+	if len(callExpr.Args) == 0 {
 		return 0
 	}
 	// First, check if the position is even in the range of the arguments.
-	start, end := args[0].Pos(), args[len(args)-1].End()
+	start, end := callExpr.Lparen, callExpr.Rparen
 	if !(start <= pos && pos <= end) {
 		return 0
 	}
-	for _, expr := range args {
+	for _, expr := range callExpr.Args {
 		if start == token.NoPos {
 			start = expr.Pos()
 		}
diff --git a/internal/lsp/testdata/lsp/primarymod/signature/signature3.go.golden b/internal/lsp/testdata/lsp/primarymod/signature/signature3.go.golden
new file mode 100644
index 0000000..e810258
--- /dev/null
+++ b/internal/lsp/testdata/lsp/primarymod/signature/signature3.go.golden
@@ -0,0 +1,3 @@
+-- Foo(a string, b int) (c bool)-signature --
+Foo(a string, b int) (c bool)
+
diff --git a/internal/lsp/testdata/lsp/primarymod/signature/signature3.go.in b/internal/lsp/testdata/lsp/primarymod/signature/signature3.go.in
new file mode 100644
index 0000000..032be13
--- /dev/null
+++ b/internal/lsp/testdata/lsp/primarymod/signature/signature3.go.in
@@ -0,0 +1,5 @@
+package signature
+
+func _() {
+	Foo("hello",//@signature("//", "Foo(a string, b int) (c bool)", 1)
+}
\ No newline at end of file
diff --git a/internal/lsp/testdata/lsp/summary.txt.golden b/internal/lsp/testdata/lsp/summary.txt.golden
index d442e74..93a605e 100644
--- a/internal/lsp/testdata/lsp/summary.txt.golden
+++ b/internal/lsp/testdata/lsp/summary.txt.golden
@@ -22,7 +22,7 @@
 WorkspaceSymbolsCount = 0
 FuzzyWorkspaceSymbolsCount = 3
 CaseSensitiveWorkspaceSymbolsCount = 2
-SignaturesCount = 23
+SignaturesCount = 24
 LinksCount = 8
 ImplementationsCount = 14