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

