This test exercises the textDocument/typeDefinition action.

-- typedef.go --
package typedef

type Struct struct { //@loc(Struct, "Struct"),
	Field string
}

type Int int //@loc(Int, "Int")

func _() {
	var (
		value Struct
		point *Struct
	)
	_ = value //@typedef("value", Struct)
	_ = point //@typedef("point", Struct)

	var (
		array   [3]Struct
		slice   []Struct
		ch      chan Struct
		complex [3]chan *[5][]Int
	)
	_ = array   //@typedef("array", Struct)
	_ = slice   //@typedef("slice", Struct)
	_ = ch      //@typedef("ch", Struct)
	_ = complex //@typedef("complex", Int)

	var s struct {
		x struct {
			xx struct {
				field1 []Struct
				field2 []Int
			}
		}
	}
	_ = s.x.xx.field1 //@typedef("field1", Struct)
	_ = s.x.xx.field2 //@typedef("field2", Int)
}

func F1() Int                              { return 0 }
func F2() (Int, float64)                   { return 0, 0 }
func F3() (Struct, int, bool, error)       { return Struct{}, 0, false, nil }
func F4() (**int, Int, bool, *error)       { return nil, 0, false, nil }
func F5() (int, float64, error, Struct)    { return 0, 0, nil, Struct{} }
func F6() (int, float64, ***Struct, error) { return 0, 0, nil, nil }

func _() {
	F1() //@typedef("F1", Int)
	F2() //@typedef("F2", Int)
	F3() //@typedef("F3", Struct)
	F4() //@typedef("F4", Int)
	F5() //@typedef("F5", Struct)
	F6() //@typedef("F6", Struct)

	f := func() Int { return 0 }
	f() //@typedef("f", Int)
}

// https://github.com/golang/go/issues/38589#issuecomment-620350922
func _() {
	type myFunc func(int) Int //@loc(myFunc, "myFunc")

	var foo myFunc
	_ = foo() //@typedef("foo", myFunc), diag(")", re"not enough arguments")
}
