internal/lsp: always show signature as the top line in hover

The current behavior is inconsistent across different configurations.
The signature is the top line for FullDocumentation, but the last line
for synopsis documentation.

Change-Id: I2fe1e1c7bfa38ae46fda06b0ecd4c7712b0e74af
GitHub-Last-Rev: d3b768558f21f518d1296b6fc776cf3974f441d9
GitHub-Pull-Request: golang/tools#241
Reviewed-on: https://go-review.googlesource.com/c/tools/+/242104
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/source/hover.go b/internal/lsp/source/hover.go
index 66f1e20..2423010 100644
--- a/internal/lsp/source/hover.go
+++ b/internal/lsp/source/hover.go
@@ -381,7 +381,7 @@
 	switch options.HoverKind {
 	case SynopsisDocumentation:
 		doc := formatDoc(h.Synopsis, options)
-		return formatHover(options, doc, link, signature), nil
+		return formatHover(options, signature, link, doc), nil
 	case FullDocumentation:
 		doc := formatDoc(h.FullDocumentation, options)
 		return formatHover(options, signature, link, doc), nil
diff --git a/internal/lsp/testdata/lsp/primarymod/cgo/declarecgo.go.golden b/internal/lsp/testdata/lsp/primarymod/cgo/declarecgo.go.golden
index e7fc967..779ca2f 100644
--- a/internal/lsp/testdata/lsp/primarymod/cgo/declarecgo.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/cgo/declarecgo.go.golden
@@ -23,8 +23,8 @@
 }
 
 -- funccgoexample-hover --
-[`cgo.Example` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/cgo#Example)
-
 ```go
 func Example()
 ```
+
+[`cgo.Example` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/cgo#Example)
diff --git a/internal/lsp/testdata/lsp/primarymod/cgoimport/usecgo.go.golden b/internal/lsp/testdata/lsp/primarymod/cgoimport/usecgo.go.golden
index cf683f3..2687d30 100644
--- a/internal/lsp/testdata/lsp/primarymod/cgoimport/usecgo.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/cgoimport/usecgo.go.golden
@@ -23,8 +23,8 @@
 }
 
 -- funccgoexample-hover --
-[`cgo.Example` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/cgo#Example)
-
 ```go
 func cgo.Example()
 ```
+
+[`cgo.Example` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/cgo#Example)
diff --git a/internal/lsp/testdata/lsp/primarymod/godef/a/a.go.golden b/internal/lsp/testdata/lsp/primarymod/godef/a/a.go.golden
index e21d537..b5909a7 100644
--- a/internal/lsp/testdata/lsp/primarymod/godef/a/a.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/godef/a/a.go.golden
@@ -1,19 +1,19 @@
 -- Lock-hover --
-Lock locks m\.
-
-[`(sync.Mutex).Lock` on pkg.go.dev](https://pkg.go.dev/sync#Mutex.Lock)
-
 ```go
 func (*sync.Mutex).Lock()
 ```
+
+[`(sync.Mutex).Lock` on pkg.go.dev](https://pkg.go.dev/sync#Mutex.Lock)
+
+Lock locks m\.
 -- Name-hover --
-Name returns the object\'s \(package\-local, unqualified\) name\.
-
-[`(types.TypeName).Name` on pkg.go.dev](https://pkg.go.dev/go/types#TypeName.Name)
-
 ```go
 func (*types.object).Name() string
 ```
+
+[`(types.TypeName).Name` on pkg.go.dev](https://pkg.go.dev/go/types#TypeName.Name)
+
+Name returns the object\'s \(package\-local, unqualified\) name\.
 -- Random-definition --
 godef/a/random.go:3:6-12: defined here as ```go
 func Random() int
@@ -39,11 +39,11 @@
 }
 
 -- Random-hover --
-[`a.Random` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Random)
-
 ```go
 func Random() int
 ```
+
+[`a.Random` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Random)
 -- Random2-definition --
 godef/a/random.go:8:6-13: defined here as ```go
 func Random2(y int) int
@@ -69,11 +69,11 @@
 }
 
 -- Random2-hover --
-[`a.Random2` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Random2)
-
 ```go
 func Random2(y int) int
 ```
+
+[`a.Random2` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Random2)
 -- a-hover --
 ```go
 
@@ -105,50 +105,50 @@
 }
 
 -- err-hover --
-\@err
-
 ```go
 var err error
 ```
--- g-hover --
-When I hover on g, I should see this comment\.
 
+\@err
+-- g-hover --
 ```go
 const g untyped int = 1
 ```
--- h-hover --
-Constant block\.
 
+When I hover on g, I should see this comment\.
+-- h-hover --
 ```go
 const h untyped int = 2
 ```
+
+Constant block\.
 -- make-hover --
-The make built\-in function allocates and initializes an object of type slice, map, or chan \(only\)\.
-
-[`make` on pkg.go.dev](https://pkg.go.dev/builtin#make)
-
 ```go
 func(t Type, size ...IntegerType) Type
 ```
+
+[`make` on pkg.go.dev](https://pkg.go.dev/builtin#make)
+
+The make built\-in function allocates and initializes an object of type slice, map, or chan \(only\)\.
 -- string-hover --
 ```go
 string
 ```
 -- typesImport-hover --
-[`types` on pkg.go.dev](https://pkg.go.dev/go/types)
-
 ```go
 package types ("go/types")
 ```
--- x-hover --
-x is a variable\.
 
+[`types` on pkg.go.dev](https://pkg.go.dev/go/types)
+-- x-hover --
 ```go
 var x string
 ```
--- z-hover --
-z is a variable too\.
 
+x is a variable\.
+-- z-hover --
 ```go
 var z string
 ```
+
+z is a variable too\.
diff --git a/internal/lsp/testdata/lsp/primarymod/godef/a/d.go.golden b/internal/lsp/testdata/lsp/primarymod/godef/a/d.go.golden
index 4defe1a..9bcf614 100644
--- a/internal/lsp/testdata/lsp/primarymod/godef/a/d.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/godef/a/d.go.golden
@@ -25,13 +25,13 @@
 }
 
 -- Member-hover --
-\@Member
-
-[`(a.Thing).Member` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing.Member)
-
 ```go
 field Member string
 ```
+
+[`(a.Thing).Member` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing.Member)
+
+\@Member
 -- Method-definition --
 godef/a/d.go:15:16-22: defined here as ```go
 func (Thing).Method(i int) string
@@ -57,11 +57,11 @@
 }
 
 -- Method-hover --
-[`(a.Thing).Method` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing.Method)
-
 ```go
 func (Thing).Method(i int) string
 ```
+
+[`(a.Thing).Method` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing.Method)
 -- Other-definition --
 godef/a/d.go:9:5-10: defined here as ```go
 var Other Thing
@@ -89,13 +89,13 @@
 }
 
 -- Other-hover --
-\@Other
-
-[`a.Other` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Other)
-
 ```go
 var Other Thing
 ```
+
+[`a.Other` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Other)
+
+\@Other
 -- Thing-definition --
 godef/a/d.go:5:6-11: defined here as ```go
 Thing struct {
@@ -123,13 +123,13 @@
 }
 
 -- Thing-hover --
-[`a.Thing` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing)
-
 ```go
 Thing struct {
 	Member string //@Member
 }
 ```
+
+[`a.Thing` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing)
 -- Things-definition --
 godef/a/d.go:11:6-12: defined here as ```go
 func Things(val []string) []Thing
@@ -155,10 +155,10 @@
 }
 
 -- Things-hover --
-[`a.Things` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Things)
-
 ```go
 func Things(val []string) []Thing
 ```
+
+[`a.Things` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Things)
 -- a-hover --
 Package a is a package for testing go to definition\.
diff --git a/internal/lsp/testdata/lsp/primarymod/godef/a/random.go.golden b/internal/lsp/testdata/lsp/primarymod/godef/a/random.go.golden
index adba700..bba2e2b 100644
--- a/internal/lsp/testdata/lsp/primarymod/godef/a/random.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/godef/a/random.go.golden
@@ -23,11 +23,11 @@
 }
 
 -- PosSum-hover --
-[`(a.Pos).Sum` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Pos.Sum)
-
 ```go
 func (*Pos).Sum() int
 ```
+
+[`(a.Pos).Sum` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Pos.Sum)
 -- PosX-definition --
 godef/a/random.go:13:2-3: defined here as ```go
 field x int
@@ -53,11 +53,11 @@
 }
 
 -- PosX-hover --
-\@mark\(PosX, \"x\"\),mark\(PosY, \"y\"\)
-
 ```go
 field x int
 ```
+
+\@mark\(PosX, \"x\"\),mark\(PosY, \"y\"\)
 -- RandomParamY-definition --
 godef/a/random.go:8:14-15: defined here as ```go
 var y int
diff --git a/internal/lsp/testdata/lsp/primarymod/godef/b/b.go.golden b/internal/lsp/testdata/lsp/primarymod/godef/b/b.go.golden
index 7f14091..47208e9 100644
--- a/internal/lsp/testdata/lsp/primarymod/godef/b/b.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/godef/b/b.go.golden
@@ -23,11 +23,11 @@
 }
 
 -- AImport-hover --
-[`a` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a)
-
 ```go
 package a ("golang.org/x/tools/internal/lsp/godef/a")
 ```
+
+[`a` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a)
 -- AString-definition --
 godef/a/a.go:26:6-7: defined here as ```go
 A string //@mark(AString, "A")
@@ -54,12 +54,12 @@
 }
 
 -- AString-hover --
-[`a.A` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#A)
-
 ```go
 A string //@mark(AString, "A")
 
 ```
+
+[`a.A` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#A)
 -- AStuff-definition --
 godef/a/a.go:28:6-12: defined here as ```go
 func a.AStuff()
@@ -85,11 +85,11 @@
 }
 
 -- AStuff-hover --
-[`a.AStuff` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#AStuff)
-
 ```go
 func a.AStuff()
 ```
+
+[`a.AStuff` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#AStuff)
 -- S1-definition --
 godef/b/b.go:8:6-8: defined here as ```go
 S1 struct {
@@ -119,8 +119,6 @@
 }
 
 -- S1-hover --
-[`b.S1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1)
-
 ```go
 S1 struct {
 	F1  int //@mark(S1F1, "F1")
@@ -128,6 +126,8 @@
 	a.A     //@godef("A", AString)
 }
 ```
+
+[`b.S1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1)
 -- S1F1-definition --
 godef/b/b.go:9:2-4: defined here as ```go
 field F1 int
@@ -155,13 +155,13 @@
 }
 
 -- S1F1-hover --
-\@mark\(S1F1, \"F1\"\)
-
-[`(b.S1).F1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1.F1)
-
 ```go
 field F1 int
 ```
+
+[`(b.S1).F1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1.F1)
+
+\@mark\(S1F1, \"F1\"\)
 -- S1S2-definition --
 godef/b/b.go:10:2-4: defined here as ```go
 field S2 S2
@@ -189,13 +189,13 @@
 }
 
 -- S1S2-hover --
-\@godef\(\"S2\", S2\), mark\(S1S2, \"S2\"\)
-
-[`(b.S1).S2` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1.S2)
-
 ```go
 field S2 S2
 ```
+
+[`(b.S1).S2` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1.S2)
+
+\@godef\(\"S2\", S2\), mark\(S1S2, \"S2\"\)
 -- S2-definition --
 godef/b/b.go:14:6-8: defined here as ```go
 S2 struct {
@@ -225,8 +225,6 @@
 }
 
 -- S2-hover --
-[`b.S2` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S2)
-
 ```go
 S2 struct {
 	F1   string //@mark(S2F1, "F1")
@@ -234,6 +232,8 @@
 	*a.A        //@godef("A", AString),godef("a",AImport)
 }
 ```
+
+[`b.S2` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S2)
 -- S2F1-definition --
 godef/b/b.go:15:2-4: defined here as ```go
 field F1 string
@@ -261,13 +261,13 @@
 }
 
 -- S2F1-hover --
-\@mark\(S2F1, \"F1\"\)
-
-[`(b.S2).F1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S2.F1)
-
 ```go
 field F1 string
 ```
+
+[`(b.S2).F1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S2.F1)
+
+\@mark\(S2F1, \"F1\"\)
 -- S2F2-definition --
 godef/b/b.go:16:2-4: defined here as ```go
 field F2 int
@@ -295,13 +295,13 @@
 }
 
 -- S2F2-hover --
-\@mark\(S2F2, \"F2\"\)
-
-[`(b.S1).F2` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1.F2)
-
 ```go
 field F2 int
 ```
+
+[`(b.S1).F2` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1.F2)
+
+\@mark\(S2F2, \"F2\"\)
 -- bX-definition --
 godef/b/b.go:37:7-8: defined here as ```go
 const X untyped int = 0
@@ -329,13 +329,13 @@
 }
 
 -- bX-hover --
-\@mark\(bX, \"X\"\),godef\(\"X\", bX\)
-
-[`b.X` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#X)
-
 ```go
 const X untyped int = 0
 ```
+
+[`b.X` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#X)
+
+\@mark\(bX, \"X\"\),godef\(\"X\", bX\)
 -- myFoo-definition --
 godef/b/b.go:4:2-7: defined here as ```go
 package myFoo ("golang.org/x/tools/internal/lsp/foo")
@@ -361,8 +361,8 @@
 }
 
 -- myFoo-hover --
-[`myFoo` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/foo)
-
 ```go
 package myFoo ("golang.org/x/tools/internal/lsp/foo")
 ```
+
+[`myFoo` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/foo)
diff --git a/internal/lsp/testdata/lsp/primarymod/godef/b/c.go.golden b/internal/lsp/testdata/lsp/primarymod/godef/b/c.go.golden
index 7711d29..fdf2216 100644
--- a/internal/lsp/testdata/lsp/primarymod/godef/b/c.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/godef/b/c.go.golden
@@ -27,8 +27,6 @@
 }
 
 -- S1-hover --
-[`b.S1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1)
-
 ```go
 S1 struct {
 	F1  int //@mark(S1F1, "F1")
@@ -36,6 +34,8 @@
 	a.A     //@godef("A", AString)
 }
 ```
+
+[`b.S1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1)
 -- S1F1-definition --
 godef/b/b.go:9:2-4: defined here as ```go
 field F1 int
@@ -63,10 +63,10 @@
 }
 
 -- S1F1-hover --
-\@mark\(S1F1, \"F1\"\)
-
-[`(b.S1).F1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1.F1)
-
 ```go
 field F1 int
 ```
+
+[`(b.S1).F1` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/b#S1.F1)
+
+\@mark\(S1F1, \"F1\"\)
diff --git a/internal/lsp/testdata/lsp/primarymod/godef/b/e.go.golden b/internal/lsp/testdata/lsp/primarymod/godef/b/e.go.golden
index 7e87c6c..f0bfe97 100644
--- a/internal/lsp/testdata/lsp/primarymod/godef/b/e.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/godef/b/e.go.golden
@@ -25,13 +25,13 @@
 }
 
 -- Member-hover --
-\@Member
-
-[`(a.Thing).Member` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing.Member)
-
 ```go
 field Member string
 ```
+
+[`(a.Thing).Member` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing.Member)
+
+\@Member
 -- Other-definition --
 godef/a/d.go:9:5-10: defined here as ```go
 var a.Other a.Thing
@@ -59,13 +59,13 @@
 }
 
 -- Other-hover --
-\@Other
-
-[`a.Other` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Other)
-
 ```go
 var a.Other a.Thing
 ```
+
+[`a.Other` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Other)
+
+\@Other
 -- Thing-definition --
 godef/a/d.go:5:6-11: defined here as ```go
 Thing struct {
@@ -93,13 +93,13 @@
 }
 
 -- Thing-hover --
-[`a.Thing` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing)
-
 ```go
 Thing struct {
 	Member string //@Member
 }
 ```
+
+[`a.Thing` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Thing)
 -- Things-definition --
 godef/a/d.go:11:6-12: defined here as ```go
 func a.Things(val []string) []a.Thing
@@ -125,8 +125,8 @@
 }
 
 -- Things-hover --
-[`a.Things` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Things)
-
 ```go
 func a.Things(val []string) []a.Thing
 ```
+
+[`a.Things` on pkg.go.dev](https://pkg.go.dev/golang.org/x/tools/internal/lsp/godef/a#Things)
diff --git a/internal/lsp/testdata/lsp/primarymod/godef/broken/unclosedIf.go.golden b/internal/lsp/testdata/lsp/primarymod/godef/broken/unclosedIf.go.golden
index 5809cf7..eac0339 100644
--- a/internal/lsp/testdata/lsp/primarymod/godef/broken/unclosedIf.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/godef/broken/unclosedIf.go.golden
@@ -23,8 +23,8 @@
 }
 
 -- myUnclosedIf-hover --
-\@myUnclosedIf
-
 ```go
 var myUnclosedIf string
 ```
+
+\@myUnclosedIf