package complit

// general completions

type position struct { //@item(structPosition, "position", "struct{...}", "struct")
	X, Y int //@item(fieldX, "X", "int", "field"),item(fieldY, "Y", "int", "field")
}

func _() {
	_ = position{
		//@complete("", fieldX, fieldY, structPosition)
	}
	_ = position{
		X: 1,
		//@complete("", fieldY)
	}
	_ = position{
		//@complete("", fieldX)
		Y: 1,
	}
	_ = []*position{
        {
            //@complete("", fieldX, fieldY, structPosition)
        },
	}
}

func _() {
	var (
		aa string //@item(aaVar, "aa", "string", "var")
		ab int    //@item(abVar, "ab", "int", "var")
	)

	_ = map[int]int{
		a: a, //@complete(":", abVar, aaVar),complete(",", abVar, aaVar)
	}

	_ = map[int]int{
		//@complete("", abVar, aaVar, structPosition)
	}

	_ = []string{a: ""} //@complete(":", abVar, aaVar)
	_ = [1]string{a: ""} //@complete(":", abVar, aaVar)

	_ = position{X: a}   //@complete("}", abVar, aaVar)
	_ = position{a}      //@complete("}", abVar, aaVar)
	_ = position{a, }      //@complete("}", abVar, aaVar, structPosition)

	_ = []int{a}  //@complete("}", abVar, aaVar)
	_ = [1]int{a} //@complete("}", abVar, aaVar)

	type myStruct struct {
		AA int    //@item(fieldAA, "AA", "int", "field")
		AB string //@item(fieldAB, "AB", "string", "field")
	}

	_ = myStruct{
		AB: a, //@complete(",", aaVar, abVar)
	}

	var s myStruct

	_ = map[int]string{1: "" + s.A}                                //@complete("}", fieldAB, fieldAA)
	_ = map[int]string{1: (func(i int) string { return "" })(s.A)} //@complete(")}", fieldAA, fieldAB)
	_ = map[int]string{1: func() string { s.A }}                   //@complete(" }", fieldAA, fieldAB)

	_ = position{s.A} //@complete("}", fieldAA, fieldAB)

	var X int //@item(varX, "X", "int", "var")
	_ = position{X}      //@complete("}", fieldX, varX)
}

func _() {
	type foo struct{} //@item(complitFoo, "foo", "struct{...}", "struct")

	"&foo" //@item(complitAndFoo, "&foo", "struct{...}", "struct")

	var _ *foo = &fo{} //@rank("{", complitFoo)
	var _ *foo = fo{} //@rank("{", complitAndFoo)

	struct { a, b *foo }{
		a: &fo{}, //@rank("{", complitFoo)
		b: fo{}, //@rank("{", complitAndFoo)
	}
}

func _() {
	_ := position{
		X: 1, //@complete("X", fieldX),complete(" 1", structPosition)
		Y: ,  //@complete(":", fieldY),complete(" ,", structPosition)
	}
}
