blob: ebe4efa5dc8bcf2c68d0769874a639ffced62daf [file]
We test the interaction of refactor.inline.variable with method receivers
and mutation:
1. Calling a value-receiver method on an unassigned variable (v0) can be inlined.
2. Calling a pointer-receiver method on a value variable (v) implicitly takes
the variable's address (&v), so inlining is rejected.
3. Variables that are reassigned or address-taken (v) cannot be inlined.
4. An unmutated pointer variable (vptr) can be inlined into pointer-receiver calls.
Regression test for issue #75200.
-- go.mod --
module example.com/a
go 1.18
-- c/c.go --
package c
import "fmt"
type V int
func (V) Method() { }
func (*V) PointerMethod() { }
func _() {
// Value receiver method on unassigned variable can be inlined.
var v0 V = V(123)
v0.Method() //@codeaction("v0", "refactor.inline.variable", result=inlineV0)
// v is reassigned and has its address taken implicitly by PointerMethod
// and explicitly by &v; inlining v must be rejected.
var v V = V(123)
v = V(13)
v.PointerMethod() //@codeaction("v", "refactor.inline.variable", err="0 CodeActions of kind refactor.inline.variable")
(v).PointerMethod() //@codeaction("v", "refactor.inline.variable", err="0 CodeActions of kind refactor.inline.variable")
// vptr is initialized to &v and never mutated, so inlining vptr is allowed.
var vptr *V = &v
vptr.PointerMethod() //@codeaction("vptr", "refactor.inline.variable", result=inlintVptr)
(vptr).PointerMethod() //@codeaction("vptr", "refactor.inline.variable", result=inlintVptrpar)
fmt.Println(v, vptr)
}
-- @inlineV0/c/c.go --
package c
import "fmt"
type V int
func (V) Method() { }
func (*V) PointerMethod() { }
func _() {
// Value receiver method on unassigned variable can be inlined.
var v0 V = V(123)
V(123).Method() //@codeaction("v0", "refactor.inline.variable", result=inlineV0)
// v is reassigned and has its address taken implicitly by PointerMethod
// and explicitly by &v; inlining v must be rejected.
var v V = V(123)
v = V(13)
v.PointerMethod() //@codeaction("v", "refactor.inline.variable", err="0 CodeActions of kind refactor.inline.variable")
(v).PointerMethod() //@codeaction("v", "refactor.inline.variable", err="0 CodeActions of kind refactor.inline.variable")
// vptr is initialized to &v and never mutated, so inlining vptr is allowed.
var vptr *V = &v
vptr.PointerMethod() //@codeaction("vptr", "refactor.inline.variable", result=inlintVptr)
(vptr).PointerMethod() //@codeaction("vptr", "refactor.inline.variable", result=inlintVptrpar)
fmt.Println(v, vptr)
}
-- @inlintVptr/c/c.go --
package c
import "fmt"
type V int
func (V) Method() { }
func (*V) PointerMethod() { }
func _() {
// Value receiver method on unassigned variable can be inlined.
var v0 V = V(123)
v0.Method() //@codeaction("v0", "refactor.inline.variable", result=inlineV0)
// v is reassigned and has its address taken implicitly by PointerMethod
// and explicitly by &v; inlining v must be rejected.
var v V = V(123)
v = V(13)
v.PointerMethod() //@codeaction("v", "refactor.inline.variable", err="0 CodeActions of kind refactor.inline.variable")
(v).PointerMethod() //@codeaction("v", "refactor.inline.variable", err="0 CodeActions of kind refactor.inline.variable")
// vptr is initialized to &v and never mutated, so inlining vptr is allowed.
var vptr *V = &v
(&v).PointerMethod() //@codeaction("vptr", "refactor.inline.variable", result=inlintVptr)
(vptr).PointerMethod() //@codeaction("vptr", "refactor.inline.variable", result=inlintVptrpar)
fmt.Println(v, vptr)
}
-- @inlintVptrpar/c/c.go --
package c
import "fmt"
type V int
func (V) Method() { }
func (*V) PointerMethod() { }
func _() {
// Value receiver method on unassigned variable can be inlined.
var v0 V = V(123)
v0.Method() //@codeaction("v0", "refactor.inline.variable", result=inlineV0)
// v is reassigned and has its address taken implicitly by PointerMethod
// and explicitly by &v; inlining v must be rejected.
var v V = V(123)
v = V(13)
v.PointerMethod() //@codeaction("v", "refactor.inline.variable", err="0 CodeActions of kind refactor.inline.variable")
(v).PointerMethod() //@codeaction("v", "refactor.inline.variable", err="0 CodeActions of kind refactor.inline.variable")
// vptr is initialized to &v and never mutated, so inlining vptr is allowed.
var vptr *V = &v
vptr.PointerMethod() //@codeaction("vptr", "refactor.inline.variable", result=inlintVptr)
(&v).PointerMethod() //@codeaction("vptr", "refactor.inline.variable", result=inlintVptrpar)
fmt.Println(v, vptr)
}