diff --git a/internal/lsp/source/completion/completion.go b/internal/lsp/source/completion/completion.go index cde7b38a35..20f30dad6c 100644 --- a/internal/lsp/source/completion/completion.go +++ b/internal/lsp/source/completion/completion.go @@ -2444,6 +2444,11 @@ func (c *completer) matchingCandidate(cand *candidate) bool { return false } + // Bail out early if we are completing a field name in a composite literal. + if v, ok := cand.obj.(*types.Var); ok && v.IsField() && c.wantStructFieldCompletions() { + return true + } + if isTypeName(cand.obj) { return c.matchingTypeName(cand) } else if c.wantTypeName() { diff --git a/internal/lsp/testdata/snippets/snippets.go.in b/internal/lsp/testdata/snippets/snippets.go.in index 35a9295a9e..58150c644c 100644 --- a/internal/lsp/testdata/snippets/snippets.go.in +++ b/internal/lsp/testdata/snippets/snippets.go.in @@ -51,3 +51,11 @@ func _() { f.Baz() //@snippet("B", snipMethodBazBaz, "BazBaz(${1:})", "BazBaz(${1:at AliasType})") } + +func _() { + type bar struct { + a int + b float64 //@item(snipBarB, "b", "float64", "field") + } + bar{b} //@snippet("}", snipBarB, "b: ${1:}", "b: ${1:float64}") +} diff --git a/internal/lsp/testdata/summary.txt.golden b/internal/lsp/testdata/summary.txt.golden index 18f2b1bfe4..1ac9c9b7a4 100644 --- a/internal/lsp/testdata/summary.txt.golden +++ b/internal/lsp/testdata/summary.txt.golden @@ -2,7 +2,7 @@ CallHierarchyCount = 2 CodeLensCount = 5 CompletionsCount = 258 -CompletionSnippetCount = 89 +CompletionSnippetCount = 90 UnimportedCompletionsCount = 5 DeepCompletionsCount = 5 FuzzyCompletionsCount = 8