in internal/langserver/handlers/tfschema/body_candidates.go [71:133]
func buildCandidates(hclNode *parser.HclNode, filename string, pos hcl.Pos, def types.TypeBase) []lsp.CompletionItem {
candidateList := make([]lsp.CompletionItem, 0)
hclNodes := parser.HclNodeArraysOfPos(hclNode, pos)
if len(hclNodes) == 0 {
return nil
}
lastHclNode := hclNodes[len(hclNodes)-1]
switch {
case parser.ContainsPos(lastHclNode.KeyRange, pos):
// input a property with a prefix
hclNodes := hclNodes[0 : len(hclNodes)-1]
defs := schema.GetDef(def.AsTypeBase(), hclNodes, 0)
keys := make([]schema.Property, 0)
for _, def := range defs {
keys = append(keys, schema.GetAllowedProperties(def)...)
}
if len(hclNodes) == 1 {
keys = ignorePulledOutProperties(keys)
}
editRange := ilsp.HCLRangeToLSP(lastHclNode.KeyRange)
candidateList = keyCandidates(keys, editRange, lastHclNode)
case !lastHclNode.KeyRange.Empty() && !lastHclNode.EqualRange.Empty() && lastHclNode.Children == nil:
// input property =
defs := schema.GetDef(def.AsTypeBase(), hclNodes, 0)
values := make([]string, 0)
for _, def := range defs {
values = append(values, schema.GetAllowedValues(def)...)
}
editRange := lastHclNode.ValueRange
if lastHclNode.Value == nil {
editRange.End = pos
}
candidateList = valueCandidates(values, ilsp.HCLRangeToLSP(editRange), false)
case parser.ContainsPos(lastHclNode.ValueRange, pos):
// input a property
defs := schema.GetDef(def.AsTypeBase(), hclNodes, 0)
keys := make([]schema.Property, 0)
for _, def := range defs {
keys = append(keys, schema.GetAllowedProperties(def)...)
}
if len(hclNodes) == 1 {
keys = ignorePulledOutProperties(keys)
}
editRange := ilsp.HCLRangeToLSP(hcl.Range{Start: pos, End: pos, Filename: filename})
candidateList = keyCandidates(keys, editRange, lastHclNode)
if len(lastHclNode.Children) == 0 {
propertySets := make([]schema.PropertySet, 0)
for _, def := range defs {
propertySets = append(propertySets, schema.GetRequiredPropertySet(def)...)
}
if len(hclNodes) == 1 {
for i, ps := range propertySets {
propertySets[i].Name = ""
propertySets[i].Properties = ignorePulledOutPropertiesFromPropertySet(ps.Properties)
}
}
candidateList = append(candidateList, requiredPropertiesCandidates(propertySets, editRange, lastHclNode)...)
}
}
return candidateList
}