| 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) |
| } |
| } |
| |