This test checks various ranking of completion results.
-- flags --
-ignore_extra_diags
-- settings.json --
{
"completeUnimported": false,
"deepCompletion": false
}
-- go.mod --
module golang.org/lsptests/rank
go 1.18
-- struct/struct_rank.go --
package struct_rank
type foo struct {
c int //@item(c_rank, "c", "int", "field")
b int //@item(b_rank, "b", "int", "field")
a int //@item(a_rank, "a", "int", "field")
}
func f() {
foo := foo{} //@rank("}", c_rank, b_rank, a_rank)
}
-- assign_rank.go --
package rank
// Literal completion results.
/* int() */ //@item(int, "int()", "int", "var")
/* string() */ //@item(string, "string()", "string", "var")
var (
apple int = 3 //@item(apple, "apple", "int", "var")
pear string = "hello" //@item(pear, "pear", "string", "var")
)
func _() {
orange := 1 //@item(orange, "orange", "int", "var")
grape := "hello" //@item(grape, "grape", "string", "var")
orange, grape = 2, "hello" //@complete(" \"", grape, pear, string, orange, apple)
}
func _() {
var pineapple int //@item(pineapple, "pineapple", "int", "var")
pineapple = 1 //@complete(" 1", pineapple, apple, int, pear)
y := //@complete(" /", pineapple, apple, pear)
}
-- binexpr_rank.go --
package rank
func _() {
_ = 5 + ; //@complete(" ;", apple, pear)
y := + 5; //@complete(" +", apple, pear)
if 6 == {} //@complete(" {", apple, pear)
}
-- boolexpr_rank.go --
package rank
func _() {
someRandomBoolFunc := func() bool { //@item(boolExprFunc, "someRandomBoolFunc", "func() bool", "var")
return true
}
var foo, bar int //@item(boolExprBar, "bar", "int", "var")
if foo == 123 && b { //@rank(" {", boolExprBar, boolExprFunc)
}
}
-- convert_rank.go --
package rank
import "time"
// Copied from the old builtins.go, which has been ported to the new marker tests.
/* complex(r float64, i float64) */ //@item(complex, "complex", "func(r float64, i float64) complex128", "func")
func _() {
type strList []string
wantsStrList := func(strList) {}
var (
convA string //@item(convertA, "convA", "string", "var")
convB []string //@item(convertB, "convB", "[]string", "var")
)
wantsStrList(strList(conv)) //@complete("))", convertB, convertA)
}
func _() {
type myInt int
const (
convC = "hi" //@item(convertC, "convC", "string", "const")
convD = 123 //@item(convertD, "convD", "int", "const")
convE int = 123 //@item(convertE, "convE", "int", "const")
convF string = "there" //@item(convertF, "convF", "string", "const")
convG myInt = 123 //@item(convertG, "convG", "myInt", "const")
)
var foo int
foo = conv //@rank(" //", convertE, convertD)
var mi myInt
mi = conv //@rank(" //", convertG, convertD, convertE)
mi + conv //@rank(" //", convertG, convertD, convertE)
1 + conv //@rank(" //", convertD, convertC),rank(" //", convertE, convertC),rank(" //", convertG, convertC)
type myString string
var ms myString
ms = conv //@rank(" //", convertC, convertF)
type myUint uint32
var mu myUint
mu = conv //@rank(" //", convertD, convertE)
// don't downrank constants when assigning to interface{}
var _ interface{} = c //@rank(" //", convertD, complex)
var _ time.Duration = conv //@rank(" //", convertD, convertE),snippet(" //", convertE, "time.Duration(convE)")
var convP myInt //@item(convertP, "convP", "myInt", "var")
var _ *int = conv //@snippet(" //", convertP, "(*int)(&convP)")
var ff float64 //@item(convertFloat, "ff", "float64", "var")
f == convD //@snippet(" =", convertFloat, "ff")
}
-- switch_rank.go --
package rank
import "time"
func _() {
switch pear {
case _: //@rank("_", pear, apple)
}
time.Monday //@item(timeMonday, "time.Monday", "time.Weekday", "const"),item(monday ,"Monday", "time.Weekday", "const")
time.Friday //@item(timeFriday, "time.Friday", "time.Weekday", "const"),item(friday ,"Friday", "time.Weekday", "const")
now := time.Now()
now.Weekday //@item(nowWeekday, "now.Weekday", "func() time.Weekday", "method")
then := time.Now()
then.Weekday //@item(thenWeekday, "then.Weekday", "func() time.Weekday", "method")
switch time.Weekday(0) {
case time.Monday, time.Tuesday:
case time.Wednesday, time.Thursday:
case time.Saturday, time.Sunday:
// TODO: these tests were disabled because they require deep completion
// (which would break other tests)
case t: // rank(":", timeFriday, timeMonday)
case time.: //@rank(":", friday, monday)
case now.Weekday():
case week: // rank(":", thenWeekday, nowWeekday)
}
}
-- type_assert_rank.go --
package rank
func _() {
type flower int //@item(flower, "flower", "int", "type")
var fig string //@item(fig, "fig", "string", "var")
_ = interface{}(nil).(f) //@complete(") //", flower)
}
-- type_switch_rank.go --
package rank
import (
"fmt"
"go/ast"
)
func _() {
type basket int //@item(basket, "basket", "int", "type")
var banana string //@item(banana, "banana", "string", "var")
switch interface{}(pear).(type) {
case b: //@complete(":", basket)
b //@complete(" //", banana, basket)
}
Ident //@item(astIdent, "Ident", "struct{...}", "struct")
IfStmt //@item(astIfStmt, "IfStmt", "struct{...}", "struct")
switch ast.Node(nil).(type) {
case *ast.Ident:
case *ast.I: //@rank(":", astIfStmt, astIdent)
}
Stringer //@item(fmtStringer, "Stringer", "interface{...}", "interface")
GoStringer //@item(fmtGoStringer, "GoStringer", "interface{...}", "interface")
switch interface{}(nil).(type) {
case fmt.Stringer: //@rank(":", fmtStringer, fmtGoStringer)
}
}