blob: 1950e958218462a2b1d00993c0a1642ebd8cb9a6 [file] [log] [blame]
Test of fixing redundant calls to maps.Keys and maps.Values
(both stdlib "maps" and "golang.org/x/exp/maps") for Go 1.24.
-- go.mod --
module maprange
require golang.org/x/exp v0.0.0
replace golang.org/x/exp => ./exp
go 1.24
-- basic.go --
package basic
import "maps"
func _() {
m := make(map[int]int)
for range maps.Keys(m) { // want `unnecessary and inefficient call of maps.Keys`
}
for range maps.Values(m) { // want `unnecessary and inefficient call of maps.Values`
}
var x struct {
Map map[int]int
}
x.Map = make(map[int]int)
for x.Map[1] = range maps.Keys(m) { // want `unnecessary and inefficient call of maps.Keys`
}
for x.Map[2] = range maps.Values(m) { // want `unnecessary and inefficient call of maps.Values`
}
for k := range maps.Keys(m) { // want `unnecessary and inefficient call of maps.Keys`
_ = k
}
for v := range maps.Values(m) { // want `unnecessary and inefficient call of maps.Values`
_ = v
}
for range maps.Keys(x.Map) { // want `unnecessary and inefficient call of maps.Keys`
}
for /* comment */ k := range /* comment */ maps.Keys(/* comment */ m) { // want `unnecessary and inefficient call of maps.Keys`
_ = k
}
}
-- basic.go.golden --
package basic
import "maps"
func _() {
m := make(map[int]int)
for range m { // want `unnecessary and inefficient call of maps.Keys`
}
for range m { // want `unnecessary and inefficient call of maps.Values`
}
var x struct {
Map map[int]int
}
x.Map = make(map[int]int)
for x.Map[1] = range m { // want `unnecessary and inefficient call of maps.Keys`
}
for _, x.Map[2] = range m { // want `unnecessary and inefficient call of maps.Values`
}
for k := range m { // want `unnecessary and inefficient call of maps.Keys`
_ = k
}
for _, v := range m { // want `unnecessary and inefficient call of maps.Values`
_ = v
}
for range x.Map { // want `unnecessary and inefficient call of maps.Keys`
}
for /* comment */ k := range /* comment */ /* comment */ m { // want `unnecessary and inefficient call of maps.Keys`
_ = k
}
}
-- xmaps.go --
package basic
import "golang.org/x/exp/maps"
func _() {
m := make(map[int]int)
for range maps.Keys(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Keys`
}
for range maps.Values(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
}
for i := range maps.Values(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
_ = i
}
var x struct {
Map map[int]int
}
x.Map = make(map[int]int)
for _, x.Map[1] = range maps.Keys(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Keys`
}
for _, x.Map[2] = range maps.Values(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
}
for _, k := range maps.Keys(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Keys`
_ = k
}
for _, v := range maps.Values(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
_ = v
}
for range maps.Keys(x.Map) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Keys`
}
for i, k := range maps.Keys(m) { // ok: this can't be straightforwardly rewritten
_, _ = i, k
}
for _, _ = range maps.Values(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
}
}
-- xmaps.go.golden --
package basic
import "golang.org/x/exp/maps"
func _() {
m := make(map[int]int)
for range m { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Keys`
}
for range m { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
}
for i := range len(m) { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
_ = i
}
var x struct {
Map map[int]int
}
x.Map = make(map[int]int)
for x.Map[1] = range m { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Keys`
}
for _, x.Map[2] = range m { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
}
for k := range m { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Keys`
_ = k
}
for _, v := range m { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
_ = v
}
for range x.Map { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Keys`
}
for i, k := range maps.Keys(m) { // ok: this can't be straightforwardly rewritten
_, _ = i, k
}
for _, _ = range m { // want `unnecessary and inefficient call of golang.org/x/exp/maps.Values`
}
}
-- exp/go.mod --
module golang.org/x/exp
go 1.24
-- exp/maps/maps.go --
package maps
func Keys[M ~map[K]V, K comparable, V any](m M) []K {
r := make([]K, 0, len(m))
for k := range m {
r = append(r, k)
}
return r
}
func Values[M ~map[K]V, K comparable, V any](m M) []V {
r := make([]V, 0, len(m))
for _, v := range m {
r = append(r, v)
}
return r
}