Add unknown ranges and open object values

This commit is contained in:
2026-08-14 08:00:22 +09:00
parent 8c50dd202d
commit 848c7f169f
53 changed files with 9047 additions and 6572 deletions
+2 -2
View File
@@ -1,5 +1,5 @@
const DECODAL_KEYWORDS = new Set(['let', 'in', 'fn', 'match', 'import', 'default']);
const DECODAL_TYPES = new Set(['String', 'Int', 'Float', 'Bool']);
const DECODAL_TYPES = new Set(['String', 'Int', 'Float', 'Bool', 'Unknown']);
const DECODAL_LITERALS = new Set(['true', 'false']);
const HTML_ESCAPE = {
@@ -41,7 +41,7 @@ export function highlightDecodalTokens(source, tokens) {
function tokenClass(kind, text) {
if (['let', 'in', 'fn', 'match', 'import', 'default'].includes(kind)) return 'tok-keyword';
if (kind === 'ident' && ['String', 'Int', 'Float', 'Bool'].includes(text)) return 'tok-type';
if (kind === 'ident' && ['String', 'Int', 'Float', 'Bool', 'Unknown'].includes(text)) return 'tok-type';
if (kind === 'ident') return '';
if (['true', 'false'].includes(kind)) return 'tok-literal';
if (['int', 'float'].includes(kind)) return 'tok-number';
@@ -22,6 +22,13 @@ test('injects one JavaScript host environment into evaluation and completion', a
active: { $decodal: 'Bool', default: true },
},
},
OpenConfig: {
$decodal: 'Object',
fields: {
enabled: { $decodal: 'Bool', default: true },
},
rest: { $decodal: 'Unknown' },
},
},
},
loadImport(_currentKey, specifier) {
@@ -46,11 +53,12 @@ test('injects one JavaScript host environment into evaluation and completion', a
const evaluated = JSON.parse(service.evaluate(
'main.dcdl',
'main.dcdl',
'let s = import "./schema.dcdl"; in { server = { port = 8080; } as s.Server; services = { api = { port = 8081; }; } as App.Services; enabled = App.enabled; post = import "./post.md" as { frontmatter = { draft = Bool; }; body = String; }; }',
'let s = import "./schema.dcdl"; in { server = { port = 8080; } as s.Server; services = { api = { port = 8081; }; } as App.Services; open = { enabled = false; plugin = { name = "cache"; }; } as App.OpenConfig; enabled = App.enabled; post = import "./post.md" as { frontmatter = { draft = Bool; }; body = String; }; }',
));
assert.equal(evaluated.ok, true, evaluated.error);
assert.match(evaluated.output, /"port": 8080/);
assert.match(evaluated.output, /"active": true/);
assert.match(evaluated.output, /"plugin": \{/);
assert.match(evaluated.output, /"body": "# Hello"/);
const member = JSON.parse(service.complete('main.dcdl', 'App.en', 6, false));
@@ -61,5 +69,9 @@ test('injects one JavaScript host environment into evaluation and completion', a
assert.equal(imported.ok, true, imported.error);
assert.ok(imported.completion.options.some((item) => item.label === './schema.dcdl'));
const unknown = JSON.parse(service.complete('main.dcdl', 'Unk', 3, false));
assert.equal(unknown.ok, true, unknown.error);
assert.ok(unknown.completion.options.some((item) => item.label === 'Unknown'));
service.free();
});