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 --
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
}

-- multigoos/multigoos_js.go --
// +build js,wasm

package multigoos

func CloseOnExec(n int) {
}
