diff --git a/d2lsp/completion.go b/d2lsp/completion.go index cbdd2706c..86e683ce7 100644 --- a/d2lsp/completion.go +++ b/d2lsp/completion.go @@ -42,18 +42,21 @@ func GetCompletionItems(text string, line, column int) ([]CompletionItem, error) case "shape", "shape:": return getShapeCompletions(), nil case "shadow", "3d", "multiple", "animated", "bold", "italic", "underline", "filled", "double-border", - "shadow:", "3d:", "multiple:", "animated:", "bold:", "italic:", "underline:", "filled:", "double-border:": + "shadow:", "3d:", "multiple:", "animated:", "bold:", "italic:", "underline:", "filled:", "double-border:", + "style.shadow:", "style.3d:", "style.multiple:", "style.animated:", "style.bold:", "style.italic:", "style.underline:", "style.filled:", "style.double-border:": return getBooleanCompletions(), nil - case "fill-pattern", "fill-pattern:": + case "fill-pattern", "fill-pattern:", "style.fill-pattern:": return getFillPatternCompletions(), nil - case "text-transform", "text-transform:": + case "text-transform", "text-transform:", "style.text-transform:": return getTextTransformCompletions(), nil case "opacity", "stroke-width", "stroke-dash", "border-radius", "font-size", "stroke", "fill", "font-color": return getValueCompletions(keyword), nil case "opacity:", "stroke-width:", "stroke-dash:", "border-radius:", "font-size:", - "stroke:", "fill:", "font-color:": - return getValueCompletions(keyword[:len(keyword)-1]), nil + "stroke:", "fill:", "font-color:", + "style.opacity:", "style.stroke-width:", "style.stroke-dash:", "style.border-radius:", "style.font-size:", + "style.stroke:", "style.fill:", "style.font-color:": + return getValueCompletions(strings.TrimSuffix(strings.TrimPrefix(keyword, "style."), ":")), nil case "width", "height", "top", "left": return getValueCompletions(keyword), nil case "width:", "height:", "top:", "left:": @@ -142,6 +145,9 @@ func getKeywordContext(text string, m *d2ast.Map, line, column int) string { if _, isBoard := d2ast.BoardKeywords[firstPart]; isBoard { firstPart = "" } + if firstPart == "classes" { + firstPart = "" + } _, isHolder := d2ast.ReservedKeywordHolders[firstPart] if !isHolder { diff --git a/d2lsp/completion_test.go b/d2lsp/completion_test.go index 9937ac358..8a8ee901e 100644 --- a/d2lsp/completion_test.go +++ b/d2lsp/completion_test.go @@ -30,6 +30,30 @@ func TestGetCompletionItems(t *testing.T) { column: 8, want: getStyleCompletions(), }, + { + name: "classes shapes", + text: `classes: { + goal: { + shape: + } +} +`, + line: 2, + column: 10, + want: getShapeCompletions(), + }, + { + name: "nested style map suggestions", + text: `a: { + style: { + 3d: + } +} +`, + line: 2, + column: 7, + want: getBooleanCompletions(), + }, { name: "3d style map suggestions", text: `a.style: { @@ -279,6 +303,15 @@ layers: { column: 16, want: getShapeCompletions(), }, + { + name: "shape 2 suggestions", + text: `a: { + shape: +}`, + line: 1, + column: 8, + want: getShapeCompletions(), + }, } for _, tt := range tests {