| This test checks that hover reports the sizes of vars/types, |
| and the offsets of struct fields. |
| |
| Notes: |
| - this only works on the declaring identifier, not on refs. |
| - the size of a type is undefined if it depends on type parameters. |
| - the offset of a field is undefined if it or any preceding field |
| has undefined size/alignment. |
| - the test's size expectations assumes a 64-bit machine. |
| - requires go1.22 because size information was inaccurate before. |
| |
| -- flags -- |
| -skip_goarch=386,arm |
| -min_go=go1.22 |
| |
| -- go.mod -- |
| module example.com |
| |
| go 1.18 |
| -- a.go -- |
| package a |
| |
| type T struct { //@ hover("T", "T", T) |
| a int //@ hover("a", "a", a) |
| U U //@ hover("U", "U", U) |
| y, z int //@ hover("y", "y", y), hover("z", "z", z) |
| } |
| |
| type U struct { |
| slice []string |
| } |
| |
| type G[T any] struct { |
| p T //@ hover("p", "p", p) |
| q int //@ hover("q", "q", q) |
| } |
| |
| var _ struct { |
| Gint G[int] //@ hover("Gint", "Gint", Gint) |
| Gstring G[string] //@ hover("Gstring", "Gstring", Gstring) |
| } |
| |
| type wasteful struct { //@ hover("wasteful", "wasteful", wasteful) |
| a bool |
| b [2]string |
| c bool |
| } |
| |
| -- @T -- |
| ```go |
| type T struct { // size=48 (0x30) |
| a int //@ hover("a", "a", a) |
| U U //@ hover("U", "U", U) |
| y, z int //@ hover("y", "y", y), hover("z", "z", z) |
| } |
| ``` |
| |
| [`a.T` on pkg.go.dev](https://pkg.go.dev/example.com#T) |
| -- @wasteful -- |
| ```go |
| type wasteful struct { // size=48 (0x30) (29% wasted) |
| a bool |
| b [2]string |
| c bool |
| } |
| ``` |
| -- @a -- |
| ```go |
| field a int // size=8, offset=0 |
| ``` |
| |
| @ hover("a", "a", a) |
| -- @U -- |
| ```go |
| field U U // size=24 (0x18), offset=8 |
| ``` |
| |
| @ hover("U", "U", U) |
| |
| |
| [`(a.T).U` on pkg.go.dev](https://pkg.go.dev/example.com#T.U) |
| -- @y -- |
| ```go |
| field y int // size=8, offset=32 (0x20) |
| ``` |
| |
| @ hover("y", "y", y), hover("z", "z", z) |
| -- @z -- |
| ```go |
| field z int // size=8, offset=40 (0x28) |
| ``` |
| |
| @ hover("y", "y", y), hover("z", "z", z) |
| -- @p -- |
| ```go |
| field p T |
| ``` |
| |
| @ hover("p", "p", p) |
| -- @q -- |
| ```go |
| field q int // size=8 |
| ``` |
| |
| @ hover("q", "q", q) |
| -- @Gint -- |
| ```go |
| field Gint G[int] // size=16 (0x10), offset=0 |
| ``` |
| |
| @ hover("Gint", "Gint", Gint) |
| -- @Gstring -- |
| ```go |
| field Gstring G[string] // size=24 (0x18), offset=16 (0x10) |
| ``` |
| |
| @ hover("Gstring", "Gstring", Gstring) |