Skip to content

Commit 473961e

Browse files
muirdmstamblerre
authored andcommitted
internal/lsp/source: improve completion for "range" and "<-"
Now that we understand object "kind" for builtin generic functions, we can apply it to a couple more places as well: // prefer rangeable object kinds for i := range <> { } // prefer channels <- <> Change-Id: If9cfba3a06b3abde073a9d397000bb3f3b0e9853 Reviewed-on: https://go-review.googlesource.com/c/tools/+/214678 Run-TryBot: Muir Manders <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Rebecca Stambler <[email protected]>
1 parent f80fb1d commit 473961e

File tree

3 files changed

+32
-23
lines changed

3 files changed

+32
-23
lines changed

internal/lsp/source/completion.go

+10-9
Original file line numberDiff line numberDiff line change
@@ -1290,15 +1290,14 @@ Nodes:
12901290
}
12911291
if tv, ok := c.pkg.GetTypesInfo().Types[node.Lhs[i]]; ok {
12921292
inf.objType = tv.Type
1293-
break Nodes
12941293
}
12951294
}
12961295
return inf
12971296
case *ast.ValueSpec:
12981297
if node.Type != nil && c.pos > node.Type.End() {
12991298
inf.objType = c.pkg.GetTypesInfo().TypeOf(node.Type)
13001299
}
1301-
break Nodes
1300+
return inf
13021301
case *ast.CallExpr:
13031302
// Only consider CallExpr args if position falls between parens.
13041303
if node.Lparen <= c.pos && c.pos <= node.Rparen {
@@ -1387,7 +1386,6 @@ Nodes:
13871386
if resultIdx := indexExprAtPos(c.pos, node.Results); resultIdx < len(node.Results) {
13881387
if resultIdx < sig.Results().Len() {
13891388
inf.objType = sig.Results().At(resultIdx).Type()
1390-
break Nodes
13911389
}
13921390
}
13931391
}
@@ -1396,15 +1394,13 @@ Nodes:
13961394
if swtch, ok := findSwitchStmt(c.path[i+1:], c.pos, node).(*ast.SwitchStmt); ok {
13971395
if tv, ok := c.pkg.GetTypesInfo().Types[swtch.Tag]; ok {
13981396
inf.objType = tv.Type
1399-
break Nodes
14001397
}
14011398
}
14021399
return inf
14031400
case *ast.SliceExpr:
14041401
// Make sure position falls within the brackets (e.g. "foo[a:<>]").
14051402
if node.Lbrack < c.pos && c.pos <= node.Rbrack {
14061403
inf.objType = types.Typ[types.Int]
1407-
break Nodes
14081404
}
14091405
return inf
14101406
case *ast.IndexExpr:
@@ -1416,10 +1412,7 @@ Nodes:
14161412
inf.objType = t.Key()
14171413
case *types.Slice, *types.Array:
14181414
inf.objType = types.Typ[types.Int]
1419-
default:
1420-
return inf
14211415
}
1422-
break Nodes
14231416
}
14241417
}
14251418
return inf
@@ -1429,11 +1422,18 @@ Nodes:
14291422
if tv, ok := c.pkg.GetTypesInfo().Types[node.Chan]; ok {
14301423
if ch, ok := tv.Type.Underlying().(*types.Chan); ok {
14311424
inf.objType = ch.Elem()
1432-
break Nodes
14331425
}
14341426
}
14351427
}
14361428
return inf
1429+
case *ast.RangeStmt:
1430+
if nodeContains(node.X, c.pos) {
1431+
inf.objKind |= kindSlice | kindArray | kindMap | kindString
1432+
if node.Value == nil {
1433+
inf.objKind |= kindChan
1434+
}
1435+
}
1436+
return inf
14371437
case *ast.StarExpr:
14381438
inf.modifiers = append(inf.modifiers, typeModifier{mod: star})
14391439
case *ast.UnaryExpr:
@@ -1442,6 +1442,7 @@ Nodes:
14421442
inf.modifiers = append(inf.modifiers, typeModifier{mod: address})
14431443
case token.ARROW:
14441444
inf.modifiers = append(inf.modifiers, typeModifier{mod: chanRead})
1445+
inf.objKind |= kindChan
14451446
}
14461447
default:
14471448
if breaksExpectedTypeInference(node) {

internal/lsp/testdata/builtins/builtin_args.go

+21-13
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,26 @@ package builtins
22

33
func _() {
44
var (
5-
slice_ []int //@item(builtinSlice, "slice_", "[]int", "var")
6-
map_ map[string]int //@item(builtinMap, "map_", "map[string]int", "var")
7-
string_ string //@item(builtinString, "string_", "string", "var")
8-
array_ [0]int //@item(builtinArray, "array_", "[0]int", "var")
9-
arrayPtr_ *[0]int //@item(builtinArrayPtr, "arrayPtr_", "*[0]int", "var")
10-
chan_ chan int //@item(builtinChan, "chan_", "chan int", "var")
11-
ptr_ *int //@item(builtinPtr, "ptr_", "*int", "var")
12-
int_ int //@item(builtinInt, "int_", "int", "var")
5+
aSlice []int //@item(builtinSlice, "aSlice", "[]int", "var")
6+
aMap map[string]int //@item(builtinMap, "aMap", "map[string]int", "var")
7+
aString string //@item(builtinString, "aString", "string", "var")
8+
aArray [0]int //@item(builtinArray, "aArray", "[0]int", "var")
9+
aArrayPtr *[0]int //@item(builtinArrayPtr, "aArrayPtr", "*[0]int", "var")
10+
aChan chan int //@item(builtinChan, "aChan", "chan int", "var")
11+
aPtr *int //@item(builtinPtr, "aPtr", "*int", "var")
12+
aInt int //@item(builtinInt, "aInt", "int", "var")
1313
)
1414

1515
close() //@rank(")", builtinChan, builtinSlice)
1616

1717
append() //@rank(")", builtinSlice, builtinChan)
1818

19-
copy() //@rank(")", builtinSlice, builtinChan)
20-
copy(slice_, s) //@rank(")", builtinSlice, builtinString)
21-
copy(s, slice_) //@rank(",", builtinSlice, builtinString)
19+
copy() //@rank(")", builtinSlice, builtinChan)
20+
copy(aSlice, aS) //@rank(")", builtinSlice, builtinString)
21+
copy(aS, aSlice) //@rank(",", builtinSlice, builtinString)
2222

23-
delete() //@rank(")", builtinMap, builtinChan)
24-
delete(map_, s) //@rank(")", builtinString, builtinSlice)
23+
delete() //@rank(")", builtinMap, builtinChan)
24+
delete(aMap, aS) //@rank(")", builtinString, builtinSlice)
2525

2626
len() //@rank(")", builtinSlice, builtinInt),rank(")", builtinMap, builtinInt),rank(")", builtinString, builtinInt),rank(")", builtinArray, builtinInt),rank(")", builtinArrayPtr, builtinPtr),rank(")", builtinChan, builtinInt)
2727

@@ -34,4 +34,12 @@ func _() {
3434
type myStruct struct{} //@item(builtinStructType, "myStruct", "struct{...}", "struct")
3535
new() //@rank(")", builtinStructType, builtinInt)
3636
var _ *myStruct = new() //@rank(")", builtinStructType, int)
37+
38+
for k := range a { //@rank(" {", builtinSlice, builtinInt),rank(" {", builtinString, builtinInt),rank(" {", builtinChan, builtinInt),rank(" {", builtinArray, builtinInt),rank(" {", builtinArrayPtr, builtinInt),rank(" {", builtinMap, builtinInt),
39+
}
40+
41+
for k, v := range a { //@rank(" {", builtinSlice, builtinChan)
42+
}
43+
44+
<-a //@rank(" //", builtinChan, builtinInt)
3745
}

internal/lsp/testdata/summary.txt.golden

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ CompletionSnippetCount = 63
44
UnimportedCompletionsCount = 9
55
DeepCompletionsCount = 5
66
FuzzyCompletionsCount = 8
7-
RankedCompletionsCount = 55
7+
RankedCompletionsCount = 63
88
CaseSensitiveCompletionsCount = 4
99
DiagnosticsCount = 35
1010
FoldingRangesCount = 2

0 commit comments

Comments
 (0)