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  }