From 74e64ca3d0b01ffd543a5f64f2e9f849eaa08ab2 Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sun, 23 Mar 2025 07:25:15 -0600 Subject: [PATCH] d2ir: fix panic with class overlay --- d2compiler/compile_test.go | 34 +++++++++++++++++++ d2ir/compile.go | 2 +- .../import-classes-boards.exp.json | 11 ++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 testdata/d2compiler/TestCompile/import-classes-boards.exp.json diff --git a/d2compiler/compile_test.go b/d2compiler/compile_test.go index ccd042fad..2cdc05a4e 100644 --- a/d2compiler/compile_test.go +++ b/d2compiler/compile_test.go @@ -1714,6 +1714,40 @@ steps: { assert.Equal(t, 1, len(g.Layers[0].Steps)) }, }, + { + name: "import-classes-boards", + + text: `classes: { + a: { + label: hi + } +} + +layers: { + asdf: { + qwer: { + layers: { + ok: { + bok + } + } + } + } + wert: { + classes: @classes + } +} + +`, + files: map[string]string{ + "classes.d2": ` +c: { + label: bye +} +`, + }, + expErr: `d2/testdata/d2compiler/TestCompile/import-classes-boards.d2:10:7: layers is only allowed at a board root`, + }, { name: "import_url_link", diff --git a/d2ir/compile.go b/d2ir/compile.go index 19a77c037..68e19b6da 100644 --- a/d2ir/compile.go +++ b/d2ir/compile.go @@ -113,7 +113,7 @@ func (c *compiler) overlayClasses(m *Map) { if lClasses == nil { lClasses = classes.Copy(l).(*Field) l.Fields = append(l.Fields, lClasses) - } else { + } else if lClasses.Map() != nil { base := classes.Copy(l).(*Field) OverlayMap(base.Map(), lClasses.Map()) l.DeleteField("classes") diff --git a/testdata/d2compiler/TestCompile/import-classes-boards.exp.json b/testdata/d2compiler/TestCompile/import-classes-boards.exp.json new file mode 100644 index 000000000..f746a724a --- /dev/null +++ b/testdata/d2compiler/TestCompile/import-classes-boards.exp.json @@ -0,0 +1,11 @@ +{ + "graph": null, + "err": { + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/import-classes-boards.d2,9:6:75-9:12:81", + "errmsg": "d2/testdata/d2compiler/TestCompile/import-classes-boards.d2:10:7: layers is only allowed at a board root" + } + ] + } +}