This test checks the formatting of the list of accessible methods.

Observe that:
- interface methods that appear in the syntax are not repeated
  in the method set of the type;
- promoted methods of structs are shown;
- receiver variables are correctly named;
- receiver variables have a pointer type if appropriate;
- only accessible methods are shown.

-- go.mod --
module example.com

-- lib/lib.go --
package lib

type I interface {
	A()
	b()
	J
}

type J interface { C() }

type S struct { I }
func (s S) A() {}
func (s S) b() {}
func (s *S) PA() {}
func (s *S) pb() {}

-- a/a.go --
package a

import "example.com/lib"

var _ lib.I //@hover("I", "I", I)
var _ lib.J //@hover("J", "J", J)
var _ lib.S //@hover("S", "S", S)

-- @I --
```go
type I interface {
	A()
	b()
	J
}
```

```go
func (lib.J) C()
```

[`lib.I` on pkg.go.dev](https://pkg.go.dev/example.com/lib#I)
-- @J --
```go
type J interface{ C() }
```

[`lib.J` on pkg.go.dev](https://pkg.go.dev/example.com/lib#J)
-- @S --
```go
type S struct{ I }
```

```go
func (s lib.S) A()
func (lib.J) C()
func (s *lib.S) PA()
```

[`lib.S` on pkg.go.dev](https://pkg.go.dev/example.com/lib#S)
