github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/internal/lsp/testdata/address/address.go (about) 1 package address 2 3 func wantsPtr(*int) {} 4 func wantsVariadicPtr(...*int) {} 5 6 func wantsVariadic(...int) {} 7 8 type foo struct{ c int } //@item(addrFieldC, "c", "int", "field") 9 10 func _() { 11 var ( 12 a string //@item(addrA, "a", "string", "var") 13 b int //@item(addrB, "b", "int", "var") 14 ) 15 16 wantsPtr() //@rank(")", addrB, addrA),snippet(")", addrB, "&b", "&b") 17 wantsPtr(&b) //@snippet(")", addrB, "b", "b") 18 19 wantsVariadicPtr() //@rank(")", addrB, addrA),snippet(")", addrB, "&b", "&b") 20 21 var s foo 22 s.c //@item(addrDeepC, "s.c", "int", "field") 23 wantsPtr() //@snippet(")", addrDeepC, "&s.c", "&s.c") 24 wantsPtr(s) //@snippet(")", addrDeepC, "&s.c", "&s.c") 25 wantsPtr(&s) //@snippet(")", addrDeepC, "s.c", "s.c") 26 27 // don't add "&" in item (it gets added as an additional edit) 28 wantsPtr(&s.c) //@snippet(")", addrFieldC, "c", "c") 29 30 // check dereferencing as well 31 var c *int //@item(addrCPtr, "c", "*int", "var") 32 var _ int = _ //@rank("_ //", addrCPtr, addrA),snippet("_ //", addrCPtr, "*c", "*c") 33 34 wantsVariadic() //@rank(")", addrCPtr, addrA),snippet(")", addrCPtr, "*c", "*c") 35 36 var d **int //@item(addrDPtr, "d", "**int", "var") 37 var _ int = _ //@rank("_ //", addrDPtr, addrA),snippet("_ //", addrDPtr, "**d", "**d") 38 39 type namedPtr *int 40 var np namedPtr //@item(addrNamedPtr, "np", "namedPtr", "var") 41 42 var _ int = _ //@rank("_ //", addrNamedPtr, addrA) 43 44 // don't get tripped up by recursive pointer type 45 type dontMessUp *dontMessUp 46 var dmu *dontMessUp //@item(addrDMU, "dmu", "*dontMessUp", "var") 47 48 var _ int = dmu //@complete(" //", addrDMU) 49 } 50 51 func (f foo) ptr() *foo { return &f } 52 53 func _() { 54 getFoo := func() foo { return foo{} } 55 56 // not addressable 57 getFoo().c //@item(addrGetFooC, "getFoo().c", "int", "field") 58 59 // addressable 60 getFoo().ptr().c //@item(addrGetFooPtrC, "getFoo().ptr().c", "int", "field") 61 62 wantsPtr() //@rank(addrGetFooPtrC, addrGetFooC),snippet(")", addrGetFooPtrC, "&getFoo().ptr().c", "&getFoo().ptr().c") 63 wantsPtr(&g) //@rank(addrGetFooPtrC, addrGetFooC),snippet(")", addrGetFooPtrC, "getFoo().ptr().c", "getFoo().ptr().c") 64 } 65 66 type nested struct { 67 f foo 68 } 69 70 func _() { 71 getNested := func() nested { return nested{} } 72 73 getNested().f.c //@item(addrNestedC, "getNested().f.c", "int", "field") 74 getNested().f.ptr().c //@item(addrNestedPtrC, "getNested().f.ptr().c", "int", "field") 75 76 // addrNestedC is not addressable, so rank lower 77 wantsPtr(getNestedfc) //@fuzzy(")", addrNestedPtrC, addrNestedC) 78 }