A module used for testing the symbols logic.

-- go.mod --
module example.com/symbols

-- README.md --
This is the README for a test module.

-- LICENSE --
$MITLicense

-- symbols.go --
package symbols

// const
const C = 1

// const iota
const (
	AA = iota + 1
	_
	BB
	CC
)

type Num int

const (
	DD Num = iota
	_
	EE
	FF
)

// var
var V = 2

// Multiple variables on the same line.
var A, B string

// func
func F() {}

// type
type T int

// typeConstant
const CT T = 3

// typeVariable
var VT T

// multi-line var
var (
	ErrA = errors.New("error A")
	ErrB = errors.New("error B")
)

// typeFunc
func TF() T { return T(0) }

// method
// BUG(uid): this verifies that notes are rendered
func (T) M() {}

type S1 struct {
	F int // field
}

type S2 struct {
	S1 // embedded struct; should have an id
	G  int
}

type I1 interface {
	M1()
}

type I2 interface {
	I1 // embedded interface; should not have an id
	M2()
}

type (
	Int int
	String bool
)

-- hello/hello.go --
// +build linux darwin
// +build amd64

package hello

// Hello returns a greeting.
func Hello() string {
	return "Hello"
}

-- hello/hello_js.go --
// +build js,wasm

package hello

// HelloJS returns a greeting when the build context is js/wasm.
func HelloJS() string {
	return "Hello"
}

-- multigoos/multigoos_windows.go --
// +build windows

package multigoos

func CloseOnExec(foo string) error {
    return nil
}

-- multigoos/multigoos_unix.go --
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris

package multigoos

func CloseOnExec(num int) (int, error) {
    return num, nil
}
