aontu 0.45.1 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aontu.js +5 -0
- package/dist/aontu.js.map +1 -1
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +203 -0
- package/dist/cli.js.map +1 -0
- package/dist/err.js +1 -1
- package/dist/err.js.map +1 -1
- package/dist/hints.js +1 -0
- package/dist/hints.js.map +1 -1
- package/dist/lang.d.ts +1 -1
- package/dist/lang.js +45 -18
- package/dist/lang.js.map +1 -1
- package/dist/lsp-server.d.ts +14 -0
- package/dist/lsp-server.js +87 -0
- package/dist/lsp-server.js.map +1 -0
- package/dist/lsp.d.ts +71 -0
- package/dist/lsp.js +375 -0
- package/dist/lsp.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/type.d.ts +1 -1
- package/dist/unify.js +31 -4
- package/dist/unify.js.map +1 -1
- package/dist/utility.js +9 -2
- package/dist/utility.js.map +1 -1
- package/dist/val/BagVal.js +20 -2
- package/dist/val/BagVal.js.map +1 -1
- package/dist/val/DisjunctVal.js +25 -16
- package/dist/val/DisjunctVal.js.map +1 -1
- package/dist/val/IntegerVal.js +1 -0
- package/dist/val/IntegerVal.js.map +1 -1
- package/dist/val/LowerFuncVal.d.ts +1 -1
- package/dist/val/LowerFuncVal.js +1 -1
- package/dist/val/LowerFuncVal.js.map +1 -1
- package/dist/val/MapVal.js +127 -16
- package/dist/val/MapVal.js.map +1 -1
- package/dist/val/NumberVal.js +7 -2
- package/dist/val/NumberVal.js.map +1 -1
- package/dist/val/OpBaseVal.d.ts +1 -1
- package/dist/val/OpBaseVal.js +1 -1
- package/dist/val/OpBaseVal.js.map +1 -1
- package/dist/val/ScalarVal.js +3 -1
- package/dist/val/ScalarVal.js.map +1 -1
- package/dist/val/Val.d.ts +2 -0
- package/dist/val/Val.js +16 -1
- package/dist/val/Val.js.map +1 -1
- package/dist/val/VarVal.js +5 -3
- package/dist/val/VarVal.js.map +1 -1
- package/package.json +25 -13
- package/src/aontu.ts +5 -0
- package/src/cli.ts +193 -0
- package/src/err.ts +1 -1
- package/src/hints.ts +2 -0
- package/src/lang.ts +46 -18
- package/src/lsp-server.ts +109 -0
- package/src/lsp.ts +486 -0
- package/src/type.ts +1 -1
- package/src/unify.ts +33 -4
- package/src/utility.ts +11 -2
- package/src/val/BagVal.ts +22 -2
- package/src/val/DisjunctVal.ts +27 -18
- package/src/val/IntegerVal.ts +1 -0
- package/src/val/LowerFuncVal.ts +1 -1
- package/src/val/MapVal.ts +138 -23
- package/src/val/NumberVal.ts +7 -2
- package/src/val/OpBaseVal.ts +1 -1
- package/src/val/ScalarVal.ts +3 -1
- package/src/val/Val.ts +18 -1
- package/src/val/VarVal.ts +6 -4
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/* Copyright (c) 2025 Richard Rodger, MIT License */
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.FrameCodec = void 0;
|
|
6
|
+
// Aontu Language Server (stdio).
|
|
7
|
+
//
|
|
8
|
+
// aontu-lsp
|
|
9
|
+
//
|
|
10
|
+
// Speaks LSP over stdio (JSON-RPC with Content-Length framing) and
|
|
11
|
+
// publishes unification diagnostics as `.aontu` files are edited. This
|
|
12
|
+
// binary is intentionally thin: all protocol logic lives in the reusable
|
|
13
|
+
// library ./lsp (LspHandler + computeDiagnostics). See docs/lsp.md for
|
|
14
|
+
// editor configuration.
|
|
15
|
+
const lsp_1 = require("./lsp");
|
|
16
|
+
// A byte-level LSP framing codec: feed it incoming chunks, give it a
|
|
17
|
+
// handler, and it decodes Content-Length frames, dispatches them, and
|
|
18
|
+
// writes framed replies. Kept transport-injectable (write/onExit) so it
|
|
19
|
+
// can be unit-tested without real stdio.
|
|
20
|
+
class FrameCodec {
|
|
21
|
+
constructor(handler, write, onExit) {
|
|
22
|
+
this.handler = handler;
|
|
23
|
+
this.write = write;
|
|
24
|
+
this.onExit = onExit;
|
|
25
|
+
this.buffer = Buffer.alloc(0);
|
|
26
|
+
}
|
|
27
|
+
// Feed a chunk of incoming bytes; processes any complete frames.
|
|
28
|
+
push(chunk) {
|
|
29
|
+
this.buffer = Buffer.concat([this.buffer, chunk]);
|
|
30
|
+
this.drain();
|
|
31
|
+
}
|
|
32
|
+
// Called when the input stream ends.
|
|
33
|
+
end() {
|
|
34
|
+
this.onExit(this.handler.exitCode);
|
|
35
|
+
}
|
|
36
|
+
drain() {
|
|
37
|
+
for (;;) {
|
|
38
|
+
const headerEnd = this.buffer.indexOf('\r\n\r\n');
|
|
39
|
+
if (headerEnd < 0)
|
|
40
|
+
return;
|
|
41
|
+
const header = this.buffer.subarray(0, headerEnd).toString('ascii');
|
|
42
|
+
const match = /Content-Length:\s*(\d+)/i.exec(header);
|
|
43
|
+
if (null == match) {
|
|
44
|
+
// Malformed header block: skip past it and continue.
|
|
45
|
+
this.buffer = this.buffer.subarray(headerEnd + 4);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const length = parseInt(match[1], 10);
|
|
49
|
+
const bodyStart = headerEnd + 4;
|
|
50
|
+
if (this.buffer.length < bodyStart + length)
|
|
51
|
+
return; // need more bytes
|
|
52
|
+
const body = this.buffer.subarray(bodyStart, bodyStart + length).toString('utf8');
|
|
53
|
+
this.buffer = this.buffer.subarray(bodyStart + length);
|
|
54
|
+
let msg;
|
|
55
|
+
try {
|
|
56
|
+
msg = JSON.parse(body);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
continue; // ignore unparseable frame
|
|
60
|
+
}
|
|
61
|
+
for (const out of this.handler.handle(msg)) {
|
|
62
|
+
this.send(out);
|
|
63
|
+
}
|
|
64
|
+
if (this.handler.shouldExit) {
|
|
65
|
+
this.onExit(this.handler.exitCode);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
send(out) {
|
|
71
|
+
const body = Buffer.from(JSON.stringify(out), 'utf8');
|
|
72
|
+
this.write(Buffer.from('Content-Length: ' + body.length + '\r\n\r\n', 'ascii'));
|
|
73
|
+
this.write(body);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.FrameCodec = FrameCodec;
|
|
77
|
+
function main() {
|
|
78
|
+
const handler = new lsp_1.LspHandler();
|
|
79
|
+
const codec = new FrameCodec(handler, (chunk) => process.stdout.write(chunk), (code) => process.exit(code));
|
|
80
|
+
process.stdin.on('data', (chunk) => codec.push(chunk));
|
|
81
|
+
process.stdin.on('end', () => codec.end());
|
|
82
|
+
}
|
|
83
|
+
// Only auto-run when invoked as a program, not when imported by tests.
|
|
84
|
+
if (require.main === module) {
|
|
85
|
+
main();
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=lsp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp-server.js","sourceRoot":"","sources":["../src/lsp-server.ts"],"names":[],"mappings":"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"}
|
package/dist/lsp.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Val } from './type';
|
|
2
|
+
declare const SEVERITY_ERROR = 1;
|
|
3
|
+
declare const SEVERITY_WARNING = 2;
|
|
4
|
+
declare const SEVERITY_INFORMATION = 3;
|
|
5
|
+
declare const SEVERITY_HINT = 4;
|
|
6
|
+
declare const LSP_VERSION = "0.1.0";
|
|
7
|
+
type Position = {
|
|
8
|
+
line: number;
|
|
9
|
+
character: number;
|
|
10
|
+
};
|
|
11
|
+
type Range = {
|
|
12
|
+
start: Position;
|
|
13
|
+
end: Position;
|
|
14
|
+
};
|
|
15
|
+
type Diagnostic = {
|
|
16
|
+
range: Range;
|
|
17
|
+
severity: number;
|
|
18
|
+
code?: string;
|
|
19
|
+
source: string;
|
|
20
|
+
message: string;
|
|
21
|
+
};
|
|
22
|
+
type Message = {
|
|
23
|
+
jsonrpc?: string;
|
|
24
|
+
id?: number | string | null;
|
|
25
|
+
method?: string;
|
|
26
|
+
params?: any;
|
|
27
|
+
};
|
|
28
|
+
type OutMessage = {
|
|
29
|
+
jsonrpc: string;
|
|
30
|
+
id?: number | string | null;
|
|
31
|
+
method?: string;
|
|
32
|
+
params?: any;
|
|
33
|
+
result?: any;
|
|
34
|
+
error?: {
|
|
35
|
+
code: number;
|
|
36
|
+
message: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
declare function computeDiagnostics(src: string, opts?: {
|
|
40
|
+
vars?: Record<string, Val>;
|
|
41
|
+
}): Diagnostic[];
|
|
42
|
+
type MarkupContent = {
|
|
43
|
+
kind: 'markdown' | 'plaintext';
|
|
44
|
+
value: string;
|
|
45
|
+
};
|
|
46
|
+
type Hover = {
|
|
47
|
+
contents: MarkupContent;
|
|
48
|
+
range?: Range;
|
|
49
|
+
};
|
|
50
|
+
declare function computeHover(src: string, position: Position): Hover | null;
|
|
51
|
+
type CompletionItem = {
|
|
52
|
+
label: string;
|
|
53
|
+
kind?: number;
|
|
54
|
+
detail?: string;
|
|
55
|
+
};
|
|
56
|
+
declare const COMPLETION_FUNCTION = 3;
|
|
57
|
+
declare const COMPLETION_KEYWORD = 14;
|
|
58
|
+
declare const BUILTIN_FUNCS: string[];
|
|
59
|
+
declare function computeCompletions(): CompletionItem[];
|
|
60
|
+
declare class LspHandler {
|
|
61
|
+
private docs;
|
|
62
|
+
private shutdownOK;
|
|
63
|
+
private exited;
|
|
64
|
+
get shouldExit(): boolean;
|
|
65
|
+
get exitCode(): number;
|
|
66
|
+
doc(uri: string): string | undefined;
|
|
67
|
+
handle(msg: Message): OutMessage[];
|
|
68
|
+
private publish;
|
|
69
|
+
}
|
|
70
|
+
export { computeDiagnostics, computeHover, computeCompletions, LspHandler, LSP_VERSION, BUILTIN_FUNCS, SEVERITY_ERROR, SEVERITY_WARNING, SEVERITY_INFORMATION, SEVERITY_HINT, COMPLETION_FUNCTION, COMPLETION_KEYWORD, };
|
|
71
|
+
export type { Position, Range, Diagnostic, Message, OutMessage, Hover, MarkupContent, CompletionItem, };
|
package/dist/lsp.js
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2025 Richard Rodger, MIT License */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.COMPLETION_KEYWORD = exports.COMPLETION_FUNCTION = exports.SEVERITY_HINT = exports.SEVERITY_INFORMATION = exports.SEVERITY_WARNING = exports.SEVERITY_ERROR = exports.BUILTIN_FUNCS = exports.LSP_VERSION = exports.LspHandler = void 0;
|
|
5
|
+
exports.computeDiagnostics = computeDiagnostics;
|
|
6
|
+
exports.computeHover = computeHover;
|
|
7
|
+
exports.computeCompletions = computeCompletions;
|
|
8
|
+
const aontu_1 = require("./aontu");
|
|
9
|
+
const err_1 = require("./err");
|
|
10
|
+
// LSP DiagnosticSeverity subset.
|
|
11
|
+
const SEVERITY_ERROR = 1;
|
|
12
|
+
exports.SEVERITY_ERROR = SEVERITY_ERROR;
|
|
13
|
+
const SEVERITY_WARNING = 2;
|
|
14
|
+
exports.SEVERITY_WARNING = SEVERITY_WARNING;
|
|
15
|
+
const SEVERITY_INFORMATION = 3;
|
|
16
|
+
exports.SEVERITY_INFORMATION = SEVERITY_INFORMATION;
|
|
17
|
+
const SEVERITY_HINT = 4;
|
|
18
|
+
exports.SEVERITY_HINT = SEVERITY_HINT;
|
|
19
|
+
// Reported to the client in the initialize response.
|
|
20
|
+
const LSP_VERSION = '0.1.0';
|
|
21
|
+
exports.LSP_VERSION = LSP_VERSION;
|
|
22
|
+
// Compute LSP diagnostics for a unit of Aontu source. A valid document —
|
|
23
|
+
// including a non-concrete schema such as `a:string` — returns an empty
|
|
24
|
+
// array; only genuine errors (conflicts, unresolved references, unknown
|
|
25
|
+
// functions, syntax errors) produce diagnostics.
|
|
26
|
+
function computeDiagnostics(src, opts) {
|
|
27
|
+
const aontu = new aontu_1.Aontu();
|
|
28
|
+
let root;
|
|
29
|
+
try {
|
|
30
|
+
const ac = aontu.ctx({ collect: true });
|
|
31
|
+
if (opts?.vars) {
|
|
32
|
+
Object.assign(ac.vars, opts.vars);
|
|
33
|
+
}
|
|
34
|
+
root = aontu.unify(src, { collect: true }, ac);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
// Hard parse/syntax failure: report a single diagnostic. jsonic
|
|
38
|
+
// errors may carry 1-based line/col; fall back to the document start.
|
|
39
|
+
return [parseErrorDiagnostic(err)];
|
|
40
|
+
}
|
|
41
|
+
const nils = [];
|
|
42
|
+
walkNils(root, nils, new Set());
|
|
43
|
+
return nils.map(nilToDiagnostic);
|
|
44
|
+
}
|
|
45
|
+
// Walk a unified Val tree collecting every NilVal exactly once. A NilVal
|
|
46
|
+
// in the result always represents an error; valid non-concrete values
|
|
47
|
+
// (scalar kinds, refs, conjuncts) are never NilVals.
|
|
48
|
+
function walkNils(v, out, seen) {
|
|
49
|
+
if (null == v || 'object' !== typeof v || true !== v.isVal)
|
|
50
|
+
return;
|
|
51
|
+
if (seen.has(v))
|
|
52
|
+
return;
|
|
53
|
+
seen.add(v);
|
|
54
|
+
if (v.isNil) {
|
|
55
|
+
out.push(v);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const peg = v.peg;
|
|
59
|
+
if (Array.isArray(peg)) {
|
|
60
|
+
for (const c of peg)
|
|
61
|
+
walkNils(c, out, seen);
|
|
62
|
+
}
|
|
63
|
+
else if (null != peg && 'object' === typeof peg) {
|
|
64
|
+
for (const k in peg)
|
|
65
|
+
walkNils(peg[k], out, seen);
|
|
66
|
+
}
|
|
67
|
+
// Spread constraints live off-peg on Map/List Vals.
|
|
68
|
+
const spreadCj = v.spread?.cj;
|
|
69
|
+
if (spreadCj)
|
|
70
|
+
walkNils(spreadCj, out, seen);
|
|
71
|
+
}
|
|
72
|
+
// Convert a NilVal (1-based site row/col) to an LSP diagnostic (0-based
|
|
73
|
+
// line/character).
|
|
74
|
+
function nilToDiagnostic(nil) {
|
|
75
|
+
const row = nil.site?.row ?? -1;
|
|
76
|
+
const col = nil.site?.col ?? -1;
|
|
77
|
+
let start;
|
|
78
|
+
let end;
|
|
79
|
+
if (row >= 1 && col >= 1) {
|
|
80
|
+
start = { line: row - 1, character: col - 1 };
|
|
81
|
+
const len = labelLength(nil);
|
|
82
|
+
end = { line: row - 1, character: col - 1 + len };
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
start = { line: 0, character: 0 };
|
|
86
|
+
end = { line: 0, character: 1 };
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
range: { start, end },
|
|
90
|
+
severity: SEVERITY_ERROR,
|
|
91
|
+
code: nil.why,
|
|
92
|
+
source: 'aontu',
|
|
93
|
+
message: nilMessage(nil),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Length (UTF-16 units, like LSP characters) of the offending value's
|
|
97
|
+
// canonical form, used to size the diagnostic range (minimum 1).
|
|
98
|
+
function labelLength(nil) {
|
|
99
|
+
const c = nil.primary?.canon;
|
|
100
|
+
return 'string' === typeof c && c.length > 0 ? c.length : 1;
|
|
101
|
+
}
|
|
102
|
+
// Build the human-readable message. Kept identical to the Go port's
|
|
103
|
+
// NilVal.Message() (go/val.go) so diagnostics match across
|
|
104
|
+
// implementations: "Cannot <attempt> value: X with value: Y\n<hint>".
|
|
105
|
+
function nilMessage(nil) {
|
|
106
|
+
if (nil.msg)
|
|
107
|
+
return nil.msg;
|
|
108
|
+
const attempt = nil.attempt ?? (null == nil.secondary ? 'resolve' : 'unify');
|
|
109
|
+
let msg = 'Cannot ' + attempt + ' value';
|
|
110
|
+
if (null != nil.primary) {
|
|
111
|
+
msg += ': ' + nil.primary.canon;
|
|
112
|
+
if (null != nil.secondary) {
|
|
113
|
+
msg += ' with value: ' + nil.secondary.canon;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const hint = (0, err_1.getHint)(nil.why, nil.details);
|
|
117
|
+
if (hint) {
|
|
118
|
+
msg += '\n' + hint;
|
|
119
|
+
}
|
|
120
|
+
return msg;
|
|
121
|
+
}
|
|
122
|
+
function parseErrorDiagnostic(err) {
|
|
123
|
+
// jsonic/AontuError may expose 1-based line/col.
|
|
124
|
+
const row = err?.lineNumber ?? err?.row ?? err?.line ?? -1;
|
|
125
|
+
const col = err?.column ?? err?.col ?? -1;
|
|
126
|
+
const start = row >= 1 && col >= 1
|
|
127
|
+
? { line: row - 1, character: col - 1 }
|
|
128
|
+
: { line: 0, character: 0 };
|
|
129
|
+
return {
|
|
130
|
+
range: { start, end: { line: start.line, character: start.character + 1 } },
|
|
131
|
+
severity: SEVERITY_ERROR,
|
|
132
|
+
code: 'parse',
|
|
133
|
+
source: 'aontu',
|
|
134
|
+
message: ('string' === typeof err?.message ? err.message : String(err)),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// initialize result: advertise full-text document sync feeding diagnostics.
|
|
138
|
+
function initializeResult() {
|
|
139
|
+
return {
|
|
140
|
+
capabilities: {
|
|
141
|
+
// 1 = TextDocumentSyncKind.Full
|
|
142
|
+
textDocumentSync: 1,
|
|
143
|
+
hoverProvider: true,
|
|
144
|
+
completionProvider: {},
|
|
145
|
+
},
|
|
146
|
+
serverInfo: {
|
|
147
|
+
name: 'aontu-lsp',
|
|
148
|
+
version: LSP_VERSION,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function publishDiagnosticsMsg(uri, diagnostics) {
|
|
153
|
+
return {
|
|
154
|
+
jsonrpc: '2.0',
|
|
155
|
+
method: 'textDocument/publishDiagnostics',
|
|
156
|
+
params: { uri, diagnostics },
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// Resolve the value under the cursor and describe it. Returns null when
|
|
160
|
+
// the position is not over a value with a known source location. Because
|
|
161
|
+
// hover reads the *unified* tree, a literal shows its resolved value and
|
|
162
|
+
// kind (e.g. a reference target resolves to the value it points at).
|
|
163
|
+
function computeHover(src, position) {
|
|
164
|
+
let root;
|
|
165
|
+
try {
|
|
166
|
+
root = new aontu_1.Aontu().unify(src, { collect: true });
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const cands = [];
|
|
172
|
+
collectHoverCandidates(root, cands, new Set());
|
|
173
|
+
let best = null;
|
|
174
|
+
for (const c of cands) {
|
|
175
|
+
if (c.line === position.line &&
|
|
176
|
+
c.start <= position.character && position.character < c.end) {
|
|
177
|
+
// Most specific (smallest) span wins.
|
|
178
|
+
if (null == best || (c.end - c.start) < (best.end - best.start))
|
|
179
|
+
best = c;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (null == best)
|
|
183
|
+
return null;
|
|
184
|
+
return {
|
|
185
|
+
contents: { kind: 'markdown', value: hoverMarkdown(best.val) },
|
|
186
|
+
range: {
|
|
187
|
+
start: { line: best.line, character: best.start },
|
|
188
|
+
end: { line: best.line, character: best.end },
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function collectHoverCandidates(v, out, seen) {
|
|
193
|
+
if (null == v || 'object' !== typeof v || true !== v.isVal)
|
|
194
|
+
return;
|
|
195
|
+
if (seen.has(v))
|
|
196
|
+
return;
|
|
197
|
+
seen.add(v);
|
|
198
|
+
const row = v.site?.row ?? -1;
|
|
199
|
+
const col = v.site?.col ?? -1;
|
|
200
|
+
let canon = '';
|
|
201
|
+
try {
|
|
202
|
+
canon = v.canon;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
canon = '';
|
|
206
|
+
}
|
|
207
|
+
// Hover targets concrete values (scalars, kinds, refs, …), not
|
|
208
|
+
// containers: a map/list source span is not reliably reconstructable
|
|
209
|
+
// from a single site, and the same restriction in the Go port keeps
|
|
210
|
+
// hover behaviour identical across implementations. The walk still
|
|
211
|
+
// recurses into containers below to reach their leaf values. Canon is
|
|
212
|
+
// single-line, so its length approximates the on-line source span.
|
|
213
|
+
if (row >= 1 && col >= 1 && canon.length > 0 && !canon.includes('\n') &&
|
|
214
|
+
!v.isMap && !v.isList) {
|
|
215
|
+
out.push({ val: v, line: row - 1, start: col - 1, end: col - 1 + canon.length });
|
|
216
|
+
}
|
|
217
|
+
const peg = v.peg;
|
|
218
|
+
if (Array.isArray(peg)) {
|
|
219
|
+
for (const c of peg)
|
|
220
|
+
collectHoverCandidates(c, out, seen);
|
|
221
|
+
}
|
|
222
|
+
else if (null != peg && 'object' === typeof peg) {
|
|
223
|
+
for (const k in peg)
|
|
224
|
+
collectHoverCandidates(peg[k], out, seen);
|
|
225
|
+
}
|
|
226
|
+
const spreadCj = v.spread?.cj;
|
|
227
|
+
if (spreadCj)
|
|
228
|
+
collectHoverCandidates(spreadCj, out, seen);
|
|
229
|
+
}
|
|
230
|
+
function hoverMarkdown(val) {
|
|
231
|
+
let canon = '';
|
|
232
|
+
try {
|
|
233
|
+
canon = val.canon;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
canon = '';
|
|
237
|
+
}
|
|
238
|
+
return '```aontu\n' + canon + '\n```\n\n' + '*' + valKind(val) + '*';
|
|
239
|
+
}
|
|
240
|
+
// A short human description of a Val's kind, shown under the hover canon.
|
|
241
|
+
function valKind(val) {
|
|
242
|
+
if (val.isNil)
|
|
243
|
+
return 'error';
|
|
244
|
+
if (val.isScalarKind)
|
|
245
|
+
return 'type';
|
|
246
|
+
if (val.isMap)
|
|
247
|
+
return 'map';
|
|
248
|
+
if (val.isList)
|
|
249
|
+
return 'list';
|
|
250
|
+
if (val.isRef)
|
|
251
|
+
return 'reference';
|
|
252
|
+
if (val.isInteger)
|
|
253
|
+
return 'integer';
|
|
254
|
+
if (val.isNumber)
|
|
255
|
+
return 'number';
|
|
256
|
+
if (val.isString)
|
|
257
|
+
return 'string';
|
|
258
|
+
if (val.isBoolean)
|
|
259
|
+
return 'boolean';
|
|
260
|
+
if (val.isScalar)
|
|
261
|
+
return 'scalar';
|
|
262
|
+
return val.constructor.name.replace(/Val$/, '').toLowerCase();
|
|
263
|
+
}
|
|
264
|
+
// LSP CompletionItemKind subset.
|
|
265
|
+
const COMPLETION_FUNCTION = 3;
|
|
266
|
+
exports.COMPLETION_FUNCTION = COMPLETION_FUNCTION;
|
|
267
|
+
const COMPLETION_KEYWORD = 14;
|
|
268
|
+
exports.COMPLETION_KEYWORD = COMPLETION_KEYWORD;
|
|
269
|
+
// The twelve built-in functions. Kept in sync with the engine by
|
|
270
|
+
// `lsp.test.ts`, which asserts each is recognised and no others are.
|
|
271
|
+
const BUILTIN_FUNCS = [
|
|
272
|
+
'close', 'copy', 'hide', 'key', 'lower', 'move',
|
|
273
|
+
'open', 'path', 'pref', 'super', 'type', 'upper',
|
|
274
|
+
];
|
|
275
|
+
exports.BUILTIN_FUNCS = BUILTIN_FUNCS;
|
|
276
|
+
// Scalar-kind and literal keywords.
|
|
277
|
+
const KIND_KEYWORDS = ['string', 'number', 'integer', 'boolean'];
|
|
278
|
+
const LITERAL_KEYWORDS = ['true', 'false', 'null', 'top'];
|
|
279
|
+
// Context-free completion: the built-in functions, scalar-kind keywords
|
|
280
|
+
// and literals. Clients filter by the typed prefix.
|
|
281
|
+
function computeCompletions() {
|
|
282
|
+
const out = [];
|
|
283
|
+
for (const f of BUILTIN_FUNCS) {
|
|
284
|
+
out.push({ label: f, kind: COMPLETION_FUNCTION, detail: 'Aontu built-in function' });
|
|
285
|
+
}
|
|
286
|
+
for (const k of KIND_KEYWORDS) {
|
|
287
|
+
out.push({ label: k, kind: COMPLETION_KEYWORD, detail: 'scalar kind' });
|
|
288
|
+
}
|
|
289
|
+
for (const k of LITERAL_KEYWORDS) {
|
|
290
|
+
out.push({ label: k, kind: COMPLETION_KEYWORD, detail: 'keyword' });
|
|
291
|
+
}
|
|
292
|
+
return out;
|
|
293
|
+
}
|
|
294
|
+
// Transport-agnostic LSP message dispatcher. Consumes decoded JSON-RPC
|
|
295
|
+
// messages and returns the messages to send back, tracking open document
|
|
296
|
+
// text and recomputing diagnostics on open/change/close. Not safe for
|
|
297
|
+
// concurrent use; drive it from a single loop (as the stdio server does).
|
|
298
|
+
class LspHandler {
|
|
299
|
+
constructor() {
|
|
300
|
+
this.docs = new Map();
|
|
301
|
+
this.shutdownOK = false;
|
|
302
|
+
this.exited = false;
|
|
303
|
+
}
|
|
304
|
+
// True once an `exit` notification has been received.
|
|
305
|
+
get shouldExit() { return this.exited; }
|
|
306
|
+
// Process exit code per the LSP spec: 0 if `shutdown` preceded `exit`,
|
|
307
|
+
// else 1.
|
|
308
|
+
get exitCode() { return this.shutdownOK ? 0 : 1; }
|
|
309
|
+
// Current text of an open document, or undefined.
|
|
310
|
+
doc(uri) { return this.docs.get(uri); }
|
|
311
|
+
// Process one incoming message, returning zero or more to send.
|
|
312
|
+
handle(msg) {
|
|
313
|
+
switch (msg.method) {
|
|
314
|
+
case 'initialize':
|
|
315
|
+
return [{ jsonrpc: '2.0', id: msg.id, result: initializeResult() }];
|
|
316
|
+
case 'initialized':
|
|
317
|
+
return [];
|
|
318
|
+
case 'shutdown':
|
|
319
|
+
this.shutdownOK = true;
|
|
320
|
+
return [{ jsonrpc: '2.0', id: msg.id, result: null }];
|
|
321
|
+
case 'exit':
|
|
322
|
+
this.exited = true;
|
|
323
|
+
return [];
|
|
324
|
+
case 'textDocument/didOpen': {
|
|
325
|
+
const td = msg.params?.textDocument;
|
|
326
|
+
if (null == td?.uri)
|
|
327
|
+
return [];
|
|
328
|
+
this.docs.set(td.uri, td.text ?? '');
|
|
329
|
+
return [this.publish(td.uri)];
|
|
330
|
+
}
|
|
331
|
+
case 'textDocument/didChange': {
|
|
332
|
+
const uri = msg.params?.textDocument?.uri;
|
|
333
|
+
const changes = msg.params?.contentChanges;
|
|
334
|
+
if (null == uri || !Array.isArray(changes) || 0 === changes.length)
|
|
335
|
+
return [];
|
|
336
|
+
// Full document sync: the last change holds the entire new text.
|
|
337
|
+
this.docs.set(uri, changes[changes.length - 1].text ?? '');
|
|
338
|
+
return [this.publish(uri)];
|
|
339
|
+
}
|
|
340
|
+
case 'textDocument/didClose': {
|
|
341
|
+
const uri = msg.params?.textDocument?.uri;
|
|
342
|
+
if (null == uri)
|
|
343
|
+
return [];
|
|
344
|
+
this.docs.delete(uri);
|
|
345
|
+
// Clear diagnostics for the closed document.
|
|
346
|
+
return [publishDiagnosticsMsg(uri, [])];
|
|
347
|
+
}
|
|
348
|
+
case 'textDocument/hover': {
|
|
349
|
+
const uri = msg.params?.textDocument?.uri;
|
|
350
|
+
const pos = msg.params?.position;
|
|
351
|
+
const text = null != uri ? this.docs.get(uri) : undefined;
|
|
352
|
+
const hover = (null != text && null != pos) ? computeHover(text, pos) : null;
|
|
353
|
+
return [{ jsonrpc: '2.0', id: msg.id, result: hover }];
|
|
354
|
+
}
|
|
355
|
+
case 'textDocument/completion':
|
|
356
|
+
return [{ jsonrpc: '2.0', id: msg.id, result: computeCompletions() }];
|
|
357
|
+
default:
|
|
358
|
+
// Unknown request (has an id): reply method-not-found. Unknown
|
|
359
|
+
// notification: ignore.
|
|
360
|
+
if (null != msg.id) {
|
|
361
|
+
return [{
|
|
362
|
+
jsonrpc: '2.0',
|
|
363
|
+
id: msg.id,
|
|
364
|
+
error: { code: -32601, message: 'method not found: ' + msg.method },
|
|
365
|
+
}];
|
|
366
|
+
}
|
|
367
|
+
return [];
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
publish(uri) {
|
|
371
|
+
return publishDiagnosticsMsg(uri, computeDiagnostics(this.docs.get(uri) ?? ''));
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
exports.LspHandler = LspHandler;
|
|
375
|
+
//# sourceMappingURL=lsp.js.map
|
package/dist/lsp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lsp.js","sourceRoot":"","sources":["../src/lsp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/aontu.ts","../src/ctx.ts","../src/err.ts","../src/hints.ts","../src/lang.ts","../src/site.ts","../src/type.ts","../src/unify.ts","../src/utility.ts","../src/val/bagval.ts","../src/val/booleanval.ts","../src/val/closefuncval.ts","../src/val/conjunctval.ts","../src/val/copyfuncval.ts","../src/val/disjunctval.ts","../src/val/expectval.ts","../src/val/featureval.ts","../src/val/funcbaseval.ts","../src/val/hidefuncval.ts","../src/val/integerval.ts","../src/val/junctionval.ts","../src/val/keyfuncval.ts","../src/val/listval.ts","../src/val/lowerfuncval.ts","../src/val/mapval.ts","../src/val/movefuncval.ts","../src/val/nilval.ts","../src/val/nullval.ts","../src/val/numberval.ts","../src/val/opbaseval.ts","../src/val/openfuncval.ts","../src/val/pathfuncval.ts","../src/val/plusopval.ts","../src/val/preffuncval.ts","../src/val/prefval.ts","../src/val/refval.ts","../src/val/scalarkindval.ts","../src/val/scalarval.ts","../src/val/stringval.ts","../src/val/superfuncval.ts","../src/val/topval.ts","../src/val/typefuncval.ts","../src/val/upperfuncval.ts","../src/val/val.ts","../src/val/varval.ts","../src/val/top.ts","../src/val/valutil.ts"],"version":"6.0.3"}
|
|
1
|
+
{"root":["../src/aontu.ts","../src/cli.ts","../src/ctx.ts","../src/err.ts","../src/hints.ts","../src/lang.ts","../src/lsp-server.ts","../src/lsp.ts","../src/site.ts","../src/type.ts","../src/unify.ts","../src/utility.ts","../src/val/bagval.ts","../src/val/booleanval.ts","../src/val/closefuncval.ts","../src/val/conjunctval.ts","../src/val/copyfuncval.ts","../src/val/disjunctval.ts","../src/val/expectval.ts","../src/val/featureval.ts","../src/val/funcbaseval.ts","../src/val/hidefuncval.ts","../src/val/integerval.ts","../src/val/junctionval.ts","../src/val/keyfuncval.ts","../src/val/listval.ts","../src/val/lowerfuncval.ts","../src/val/mapval.ts","../src/val/movefuncval.ts","../src/val/nilval.ts","../src/val/nullval.ts","../src/val/numberval.ts","../src/val/opbaseval.ts","../src/val/openfuncval.ts","../src/val/pathfuncval.ts","../src/val/plusopval.ts","../src/val/preffuncval.ts","../src/val/prefval.ts","../src/val/refval.ts","../src/val/scalarkindval.ts","../src/val/scalarval.ts","../src/val/stringval.ts","../src/val/superfuncval.ts","../src/val/topval.ts","../src/val/typefuncval.ts","../src/val/upperfuncval.ts","../src/val/val.ts","../src/val/varval.ts","../src/val/top.ts","../src/val/valutil.ts"],"version":"6.0.3"}
|
package/dist/type.d.ts
CHANGED
package/dist/unify.js
CHANGED
|
@@ -130,13 +130,39 @@ const unite = (ctx, a, b, whence) => {
|
|
|
130
130
|
// because the branch that set `out = X.unify(Y, ctx)` already
|
|
131
131
|
// ran that Val's own unify logic.
|
|
132
132
|
if (!out.done && !unified) {
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
// Once per pass per (Val, path): within a single fixpoint pass
|
|
134
|
+
// nothing external to the subtree changes, so repeating the TOP
|
|
135
|
+
// self-unify — which conjunct folds otherwise trigger once per
|
|
136
|
+
// fold term — is pure re-work, and on large models (hundreds of
|
|
137
|
+
// sibling terms) the repeats trip the MAXCYCLE guard as a false
|
|
138
|
+
// positive. The path is part of the key: a shared Val can
|
|
139
|
+
// resolve path-dependent content differently per location.
|
|
140
|
+
if (undefined !== ctx.cc
|
|
141
|
+
&& out._tcc === ctx.cc && out._tpi === ctx.pathidx) {
|
|
142
|
+
why += 't';
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
out = out.unify((0, top_1.top)(), te ? ctx.clone({ explain: (0, utility_1.ec)(te, 'ND') }) : ctx);
|
|
146
|
+
if (!out.done && undefined !== ctx.cc) {
|
|
147
|
+
;
|
|
148
|
+
out._tcc = ctx.cc;
|
|
149
|
+
out._tpi = ctx.pathidx;
|
|
150
|
+
}
|
|
151
|
+
why += 'T';
|
|
152
|
+
}
|
|
135
153
|
}
|
|
136
154
|
}
|
|
137
155
|
catch (err) {
|
|
138
|
-
//
|
|
139
|
-
|
|
156
|
+
// This catch-all converts an unexpected exception into an 'internal'
|
|
157
|
+
// Nil so one bad node doesn't crash a whole unify. To avoid fully
|
|
158
|
+
// masking regressions, preserve the original error message (and a
|
|
159
|
+
// RangeError flag — i.e. stack overflow from runaway recursion) on
|
|
160
|
+
// the Nil's details so it surfaces in the formatted error rather
|
|
161
|
+
// than vanishing. See err.ts (descErr) for how details render.
|
|
162
|
+
out = (0, err_1.makeNilErr)(ctx, 'internal', a, b, undefined, {
|
|
163
|
+
error: String(err?.message ?? err),
|
|
164
|
+
...(err instanceof RangeError ? { overflow: true } : {}),
|
|
165
|
+
});
|
|
140
166
|
}
|
|
141
167
|
}
|
|
142
168
|
ctx.explain && (0, utility_1.explainClose)(te, out);
|
|
@@ -183,6 +209,7 @@ class Unify {
|
|
|
183
209
|
// uctx.seterr(this.err)
|
|
184
210
|
uctx.err = this.err;
|
|
185
211
|
uctx.explain = this.explain;
|
|
212
|
+
uctx.snapmap = new Map();
|
|
186
213
|
const explain = null == ctx?.explain ? undefined : ctx?.explain;
|
|
187
214
|
const te = explain && (0, utility_1.explainOpen)(uctx, explain, 'root', res);
|
|
188
215
|
// NOTE: if true === res.done already, then this loop never needs to run.
|