mirror of
https://github.com/golang/go
synced 2024-10-01 13:08:32 -06:00
49ba83114e
When the value of a composite literal key/value pair was unparsable, you were getting completions for the composite literal keys instead of values. For example "struct { foo int }{foo: []<>" was completing to the field name "foo". This was because the leaf ast.Node at the cursor was the composite literal itself, and our go-back-one-character logic was not happening because the preceding character's node was *ast.BadExpr, not *ast.Ident. Fix by always generating the ast path for the character before the cursor's position. I couldn't find any cases where this broke completion. I also added expected type detection for the following composite literal cases: - array/slice literals - struct literals (both implicit and explicit field names) - map keys and values Fixes golang/go#29153 Change-Id: If8cf678cbd743a970f52893fcf4a9b83ea06d7e9 GitHub-Last-Rev: f385705cc05eb98132e20561451dbb8c39b68519 GitHub-Pull-Request: golang/tools#86 Reviewed-on: https://go-review.googlesource.com/c/tools/+/173099 Run-TryBot: Rebecca Stambler <rstambler@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
package complit
|
|
|
|
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,
|
|
}
|
|
}
|
|
|
|
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)
|
|
}
|
|
|
|
_ = position{X: a} //@complete("}", abVar, aaVar)
|
|
_ = position{a} //@complete("}", abVar, aaVar)
|
|
|
|
_ = []int{a} //@complete("a", abVar, aaVar, structPosition)
|
|
_ = [1]int{a} //@complete("a", abVar, aaVar, structPosition)
|
|
|
|
var s struct {
|
|
AA int //@item(fieldAA, "AA", "int", "field")
|
|
AB string //@item(fieldAB, "AB", "string", "field")
|
|
}
|
|
_ = map[int]string{1: "" + s.A} //@complete("}", fieldAB, fieldAA)
|
|
_ = map[int]string{1: (func(i int) string { return "" })(s.A)} //@complete(")}", fieldAA, fieldAB)
|
|
}
|
|
|
|
func _() {
|
|
_ := position{
|
|
X: 1, //@complete("X", fieldX),complete(" 1", structPosition)
|
|
Y: , //@complete(":", fieldY),complete(" ,", structPosition)
|
|
}
|
|
}
|