From 9de283cd3828d155a056c8f2947d9ee98ab059bd Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sat, 14 Dec 2024 22:12:41 -0700 Subject: [PATCH 1/3] d2compiler: validate that reserved keywords have values --- d2compiler/compile.go | 6 ++---- d2compiler/compile_test.go | 14 +++++++++++++- .../TestCompile/reserved_missing_values.exp.json | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 testdata/d2compiler/TestCompile/reserved_missing_values.exp.json diff --git a/d2compiler/compile.go b/d2compiler/compile.go index 65b5ee76e..1fa28054e 100644 --- a/d2compiler/compile.go +++ b/d2compiler/compile.go @@ -239,8 +239,6 @@ func (c *compiler) compileMap(obj *d2graph.Object, m *d2ir.Map) { } } } - } else { - c.errorf(class.LastRef().AST(), "class missing value") } for _, className := range classNames { @@ -505,6 +503,8 @@ func (c *compiler) compileReserved(attrs *d2graph.Attributes, f *d2ir.Field) { default: c.errorf(f.LastPrimaryKey(), "reserved field %v does not accept composite", f.Name.ScalarString()) } + } else { + c.errorf(f.LastRef().AST(), `reserved field "%v" must have a value`, f.Name.ScalarString()) } return } @@ -817,8 +817,6 @@ func (c *compiler) compileEdgeMap(edge *d2graph.Edge, m *d2ir.Map) { } } } - } else { - c.errorf(class.LastRef().AST(), "class missing value") } for _, className := range classNames { diff --git a/d2compiler/compile_test.go b/d2compiler/compile_test.go index deda85442..4a15e1678 100644 --- a/d2compiler/compile_test.go +++ b/d2compiler/compile_test.go @@ -127,6 +127,18 @@ x: { tassert.Equal(t, "200", g.Objects[0].Top.Value) }, }, + { + name: "reserved_missing_values", + text: `foobar: { + width + bottom + left + right +} +`, + expErr: `d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2:2:3: reserved field "width" must have a value +d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2:4:3: reserved field "left" must have a value`, + }, { name: "positions_negative", text: `hey: { @@ -3066,7 +3078,7 @@ object: { name: "no-class-primary", text: `x.class `, - expErr: `d2/testdata/d2compiler/TestCompile/no-class-primary.d2:1:3: class missing value`, + expErr: `d2/testdata/d2compiler/TestCompile/no-class-primary.d2:1:3: reserved field "class" must have a value`, }, { name: "no-class-inside-classes", diff --git a/testdata/d2compiler/TestCompile/reserved_missing_values.exp.json b/testdata/d2compiler/TestCompile/reserved_missing_values.exp.json new file mode 100644 index 000000000..115ab4734 --- /dev/null +++ b/testdata/d2compiler/TestCompile/reserved_missing_values.exp.json @@ -0,0 +1,15 @@ +{ + "graph": null, + "err": { + "errs": [ + { + "range": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2,1:2:12-1:7:17", + "errmsg": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2:2:3: reserved field width must have a value" + }, + { + "range": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2,3:2:29-3:6:33", + "errmsg": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2:4:3: reserved field left must have a value" + } + ] + } +} From a8c93f6f27a404fe5196338b7f47d4735ad1e392 Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sat, 14 Dec 2024 22:13:39 -0700 Subject: [PATCH 2/3] next --- ci/release/changelogs/next.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md index afe728b48..302685f37 100644 --- a/ci/release/changelogs/next.md +++ b/ci/release/changelogs/next.md @@ -13,6 +13,7 @@ - This is a breaking change. Previously Latex blocks required escaping the backslash. So for older D2 versions, you should remove the excess backslashes. - Links: non-http url scheme links are supported (e.g. `x.link: vscode://file/`) [#2237](https://github.com/terrastruct/d2/issues/2237) +- Compiler: reserved keywords with missing values error instead of silently doing nothing [#2251](https://github.com/terrastruct/d2/pull/2251) #### Bugfixes ⛑️ From 9e26318b42da31b9aa748d557121006d36348235 Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sat, 14 Dec 2024 23:25:06 -0700 Subject: [PATCH 3/3] ta --- testdata/d2compiler/TestCompile/no-class-primary.exp.json | 2 +- .../d2compiler/TestCompile/reserved_missing_values.exp.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/testdata/d2compiler/TestCompile/no-class-primary.exp.json b/testdata/d2compiler/TestCompile/no-class-primary.exp.json index f137a4b3e..35fc3a86a 100644 --- a/testdata/d2compiler/TestCompile/no-class-primary.exp.json +++ b/testdata/d2compiler/TestCompile/no-class-primary.exp.json @@ -4,7 +4,7 @@ "errs": [ { "range": "d2/testdata/d2compiler/TestCompile/no-class-primary.d2,0:2:2-0:7:7", - "errmsg": "d2/testdata/d2compiler/TestCompile/no-class-primary.d2:1:3: class missing value" + "errmsg": "d2/testdata/d2compiler/TestCompile/no-class-primary.d2:1:3: reserved field \"class\" must have a value" } ] } diff --git a/testdata/d2compiler/TestCompile/reserved_missing_values.exp.json b/testdata/d2compiler/TestCompile/reserved_missing_values.exp.json index 115ab4734..3d3cdd4da 100644 --- a/testdata/d2compiler/TestCompile/reserved_missing_values.exp.json +++ b/testdata/d2compiler/TestCompile/reserved_missing_values.exp.json @@ -4,11 +4,11 @@ "errs": [ { "range": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2,1:2:12-1:7:17", - "errmsg": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2:2:3: reserved field width must have a value" + "errmsg": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2:2:3: reserved field \"width\" must have a value" }, { "range": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2,3:2:29-3:6:33", - "errmsg": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2:4:3: reserved field left must have a value" + "errmsg": "d2/testdata/d2compiler/TestCompile/reserved_missing_values.d2:4:3: reserved field \"left\" must have a value" } ] }