Skip to content

Commit 72b9f13

Browse files
committed
Custom model editor: Fix another edge-case (pairs in list)
1 parent 7bd1571 commit 72b9f13

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

web-bundle/src/main/js/custom-model-editor/src/validate.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,10 @@ function validateList(path, node, minLength, maxLength, validateListItem) {
285285
const range = node.cstNode.items[i].range;
286286
errors.push(error(`${path}[${i}]`, `must not be null`, [range.start, range.end]));
287287
} else if (isYamlPair(item.type)) {
288-
errors.push(error(`${path}[${i}]`, `must be an object. given type: ${displayType(item)}`, [item.key.range[0], item.value.range[1]]));
288+
// this is a bit ugly. we do not reliably get useful range information, e.g. for nested pairs
289+
// so we fallback to the range of the entire node. maybe related: https://github.com/eemeli/yaml/discussions/231
290+
errors.push(error(`${path}`, `must not contain pairs`, node.range));
291+
break;
289292
} else {
290293
errors.push.apply(errors, validateListItem(`${path}[${i}]`, item, i));
291294
}
@@ -332,6 +335,8 @@ function isValidAreaName(string) {
332335
}
333336

334337
function validateObject(path, obj, keyIsValid, validateKeys, message, validateKeyValuePair) {
338+
if (obj.value === null)
339+
return [error(path, `must not be null`, obj.range)];
335340
if (!isYamlObject(obj.type))
336341
return [error(path, `must be an object. given type: ${displayType(obj)}`, obj.range)];
337342

web-bundle/src/main/js/custom-model-editor/src/validate.test.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,7 @@ describe("validate", () => {
138138
`priority[1]: every statement must have an operator ['multiply_by', 'limit_to']. given: if, range: [44, 60]`
139139
]);
140140
test_validate(`speed: [ if: condition, limit_to: 100 ]`, [
141-
`speed[0]: must be an object. given type: pair, range: [9, 22]`,
142-
`speed[1]: must be an object. given type: pair, range: [24, 38]`
141+
`speed: must not contain pairs, range: [7, 39]`
143142
]);
144143
});
145144

@@ -168,6 +167,16 @@ describe("validate", () => {
168167
test_validate(`speed: [{limit_to: 100, if:`, [
169168
`speed[0][if]: must be a string or boolean. given type: null, range: [24, 26]`
170169
]);
170+
test_validate(`speed: [ if:`, [
171+
`speed[0]: must be an object. given type: string, range: [9, 11]`,
172+
`speed[1]: must not be null, range: [11, 12]`
173+
]);
174+
test_validate(`speed: [ if: `, [
175+
`speed: must not contain pairs, range: [7, 13]`,
176+
]);
177+
test_validate(`speed: [ if: if: `, [
178+
`speed: must not contain pairs, range: [7, 17]`
179+
]);
171180
test_validate(`speed: [{if: true, multiply_by: 0.15}]`, []);
172181
});
173182

0 commit comments

Comments
 (0)