Skip to content

Commit 115bd6d

Browse files
committed
fix: better suggestion for map.{Keys, Values}
1 parent 4b7c7af commit 115bd6d

File tree

3 files changed

+31
-9
lines changed

3 files changed

+31
-9
lines changed

exptostd.go

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ func NewAnalyzer() *analysis.Analyzer {
6565
l := &analyzer{
6666
skipGoVersionDetection: skip,
6767
mapsPkgReplacements: map[string]stdReplacement[*ast.CallExpr]{
68-
"Keys": {MinGo: go123, Text: "slices.Collect(maps.Keys())", Suggested: suggestedFixForKeysOrValues},
69-
"Values": {MinGo: go123, Text: "slices.Collect(maps.Values())", Suggested: suggestedFixForKeysOrValues},
68+
"Keys": {MinGo: go123, Text: "slices.AppendSeq(make([]T, 0, len(data)), maps.Keys(data))", Suggested: suggestedFixForKeysOrValues},
69+
"Values": {MinGo: go123, Text: "slices.AppendSeq(make([]T, 0, len(data)), maps.Values(data))", Suggested: suggestedFixForKeysOrValues},
7070
"Equal": {MinGo: go121, Text: "maps.Equal()"},
7171
"EqualFunc": {MinGo: go121, Text: "maps.EqualFunc()"},
7272
"Clone": {MinGo: go121, Text: "maps.Clone()"},
@@ -356,12 +356,34 @@ func suggestedFixForClear(callExpr *ast.CallExpr) (analysis.SuggestedFix, error)
356356
}
357357

358358
func suggestedFixForKeysOrValues(callExpr *ast.CallExpr) (analysis.SuggestedFix, error) {
359+
var name string
360+
if ident, ok := callExpr.Args[0].(*ast.Ident); ok {
361+
name = ident.Name
362+
}
363+
359364
s := &ast.CallExpr{
360365
Fun: &ast.SelectorExpr{
361-
X: &ast.Ident{Name: pkgSlices},
362-
Sel: &ast.Ident{Name: "Collect"},
366+
X: &ast.Ident{Name: "slices"},
367+
Sel: &ast.Ident{Name: "AppendSeq"},
368+
},
369+
Args: []ast.Expr{
370+
&ast.CallExpr{
371+
Fun: &ast.Ident{Name: "make"},
372+
Args: []ast.Expr{
373+
&ast.ArrayType{
374+
Elt: &ast.Ident{Name: "T"}, // TODO(ldez) improve the type detection.
375+
},
376+
&ast.BasicLit{Kind: token.INT, Value: "0"},
377+
&ast.CallExpr{
378+
Fun: &ast.Ident{Name: "len"},
379+
Args: []ast.Expr{
380+
&ast.Ident{Name: name},
381+
},
382+
},
383+
},
384+
},
385+
callExpr,
363386
},
364-
Args: []ast.Expr{callExpr},
365387
}
366388

367389
buf := bytes.NewBuffer(nil)

testdata/src/expmaps/maps.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import (
77
func _(m, a map[string]string) {
88
maps.Clone(m) // want `golang.org/x/exp/maps.Clone\(\) can be replaced by maps.Clone\(\)`
99

10-
maps.Keys(m) // want `golang.org/x/exp/maps.Keys\(\) can be replaced by slices.Collect\(maps.Keys\(\)\)`
10+
maps.Keys(m) // want `golang.org/x/exp/maps\.Keys\(\) can be replaced by slices\.AppendSeq\(make\(\[\]T, 0, len\(data\)\), maps\.Keys\(data\)\)`
1111

12-
maps.Values(m) // want `golang.org/x/exp/maps.Values\(\) can be replaced by slices.Collect\(maps.Values\(\)\)`
12+
maps.Values(m) // want `golang.org/x/exp/maps\.Values\(\) can be replaced by slices\.AppendSeq\(make\(\[\]T, 0, len\(data\)\), maps\.Values\(data\)\)`
1313

1414
maps.Equal(m, a) // want `golang.org/x/exp/maps.Equal\(\) can be replaced by maps.Equal\(\)`
1515

testdata/src/expmaps/maps.go.golden

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import (
77
func _(m, a map[string]string) {
88
maps.Clone(m) // want `golang.org/x/exp/maps.Clone\(\) can be replaced by maps.Clone\(\)`
99

10-
slices.Collect(maps.Keys(m)) // want `golang.org/x/exp/maps.Keys\(\) can be replaced by slices.Collect\(maps.Keys\(\)\)`
10+
slices.AppendSeq(make([]T, 0, len(m)), maps.Keys(m)) // want `golang.org/x/exp/maps\.Keys\(\) can be replaced by slices\.AppendSeq\(make\(\[\]T, 0, len\(data\)\), maps\.Keys\(data\)\)`
1111

12-
slices.Collect(maps.Values(m)) // want `golang.org/x/exp/maps.Values\(\) can be replaced by slices.Collect\(maps.Values\(\)\)`
12+
slices.AppendSeq(make([]T, 0, len(m)), maps.Values(m)) // want `golang.org/x/exp/maps\.Values\(\) can be replaced by slices\.AppendSeq\(make\(\[\]T, 0, len\(data\)\), maps\.Values\(data\)\)`
1313

1414
maps.Equal(m, a) // want `golang.org/x/exp/maps.Equal\(\) can be replaced by maps.Equal\(\)`
1515

0 commit comments

Comments
 (0)