# The CLI replaces one typed constant in a private function body, updates every direct caller, and refuses mutable reads and unknown nested fields without changing files. cp service.go .scratch/service-before.txt ! exec semedit refactor-introduce-parameter --file service.go --symbol transform --parameters '[{"source_index":0,"parameter":{"name":"id","type":"int"}},{"parameter":{"name":"mode","type":"int"},"argument":"3"}]' --discriminator defaultMode --expected-revision stale stderr 'expected_revision' cmp service.go .scratch/service-before.txt ! exec semedit refactor-introduce-parameter --file service.go --symbol transform --parameters '[{"source_index":0,"parameter":{"name":"id","type":"int"}},{"parameter":{"name":"mode","type":"int"},"argument":"4"}]' --discriminator defaultMode stderr 'selected expression' cmp service.go .scratch/service-before.txt ! exec semedit refactor-introduce-parameter --file service.go --symbol shadowed --parameters '[{"source_index":0,"parameter":{"name":"id","type":"int"}},{"parameter":{"name":"mode","type":"int"},"argument":"3"}]' --discriminator defaultMode stderr 'compile-time typed constant' cmp service.go .scratch/service-before.txt ! exec semedit refactor-introduce-parameter --file service.go --symbol repeated --parameters '[{"source_index":0,"parameter":{"name":"flag","type":"bool"}},{"parameter":{"name":"enabled","type":"bool"},"argument":"true"}]' --discriminator true stderr 'resolve uniquely' cmp service.go .scratch/service-before.txt ! exec semedit refactor-introduce-parameter --file service.go --symbol constantDecl --parameters '[{"parameter":{"name":"enabled","type":"bool"},"argument":"true"}]' --discriminator true stderr 'is not constant' cmp service.go .scratch/service-before.txt ! exec semedit refactor-introduce-parameter --file service.go --symbol overflow --parameters '[{"parameter":{"name":"small","type":"int8"},"argument":"257"}]' --discriminator large stderr 'assignable to the appended parameter type' cmp service.go .scratch/service-before.txt exec semedit refactor-introduce-parameter --file service.go --symbol transform --parameters '[{"source_index":0,"parameter":{"name":"id","type":"int"}},{"parameter":{"name":"mode","type":"mode"},"argument":"3"}]' --discriminator defaultMode stdout 'Replaced the selected constant expression' cmp service.go .scratch/want/service.txt cmp calls.go .scratch/want/calls.txt cmp other.go .scratch/want/other.txt cmp service_test.go .scratch/want/service_test.txt exec go test ./... cp service.go .scratch/service.txt ! exec semedit refactor-introduce-parameter --file service.go --symbol unsafe --parameters '[{"source_index":0,"parameter":{"name":"id","type":"int"}},{"parameter":{"name":"mode","type":"int"},"argument":"2"}]' --discriminator mutableMode stderr 'compile-time typed constant' cmp service.go .scratch/service.txt ! exec semedit refactor-introduce-parameter --file service.go --symbol transform --parameters '[{"source_index":0,"parameter":{"name":"id","type":"int"}},{"parameter":{"name":"mode","type":"int"},"argument":"3","unknown":true}]' --discriminator defaultMode stderr 'unknown property' cmp service.go .scratch/service.txt -- go.mod -- module example.com/introduceparameter go 1.24 -- service.go -- package sample type mode int const defaultMode mode = 3 var mutableMode = 2 func transform(id int) int { return id + int(defaultMode) } func unsafe(id int) int { return id + mutableMode } func shadowed(id int) int { defaultMode := 4; return id + defaultMode } func repeated(flag bool) bool { if flag { return true }; return true } func constantDecl() bool { const value = true; return value } const large = 257 func overflow() int { return int(large) } -- service_test.go -- package sample import "testing" func TestTransform(t *testing.T) { if got := transform(5); got != 8 { t.Fatalf("transform(5) = %d, want 8", got) } } -- calls.go -- package sample func first() int { return transform(1) } func overflowCaller() int { return overflow() } -- other.go -- package sample func second() int { return transform(2) } -- .scratch/want/service.txt -- package sample type mode int const defaultMode mode = 3 var mutableMode = 2 func transform(id int, mode mode) int { return id + int(mode) } func unsafe(id int) int { return id + mutableMode } func shadowed(id int) int { defaultMode := 4; return id + defaultMode } func repeated(flag bool) bool { if flag { return true }; return true } func constantDecl() bool { const value = true; return value } const large = 257 func overflow() int { return int(large) } -- .scratch/want/calls.txt -- package sample func first() int { return transform(1, 3) } func overflowCaller() int { return overflow() } -- .scratch/want/other.txt -- package sample func second() int { return transform(2, 3) } -- .scratch/want/service_test.txt -- package sample import "testing" func TestTransform(t *testing.T) { if got := transform(5, 3); got != 8 { t.Fatalf("transform(5) = %d, want 8", got) } }