harmonyc 0.26.0 → 0.28.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/code_generator/VitestGenerator.d.ts +1 -2
- package/dist/code_generator/VitestGenerator.js +8 -21
- package/dist/code_generator/VitestGenerator.js.map +1 -1
- package/dist/compiler/compile.d.ts +1 -0
- package/dist/compiler/compile.js.map +1 -1
- package/dist/lsp/provideCompletion.d.ts +3 -0
- package/dist/lsp/provideCompletion.js +31 -0
- package/dist/lsp/provideCompletion.js.map +1 -0
- package/dist/lsp/provideDefinition.d.ts +2 -0
- package/dist/lsp/provideDefinition.js +71 -0
- package/dist/lsp/provideDefinition.js.map +1 -0
- package/dist/lsp/server.d.ts +5 -1
- package/dist/lsp/server.js +55 -140
- package/dist/lsp/server.js.map +1 -1
- package/dist/lsp/validateTextDocument.d.ts +2 -0
- package/dist/lsp/validateTextDocument.js +78 -0
- package/dist/lsp/validateTextDocument.js.map +1 -0
- package/dist/lsp/workspace.d.ts +48 -0
- package/dist/lsp/workspace.js +210 -0
- package/dist/lsp/workspace.js.map +1 -0
- package/dist/model/model.d.ts +19 -0
- package/dist/model/model.js +74 -1
- package/dist/model/model.js.map +1 -1
- package/dist/parser/parser.js +2 -2
- package/dist/parser/parser.js.map +1 -1
- package/dist/phrases_assistant/phrases_assistant.d.ts +6 -1
- package/dist/phrases_assistant/phrases_assistant.js +29 -3
- package/dist/phrases_assistant/phrases_assistant.js.map +1 -1
- package/dist/vitest/index.d.ts +2 -0
- package/dist/vitest/index.js +3 -3
- package/dist/vitest/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -31,6 +31,5 @@ export declare class VitestGenerator implements CodeGenerator {
|
|
|
31
31
|
private paramName;
|
|
32
32
|
stringParamDeclaration(index: number): string;
|
|
33
33
|
variantParamDeclaration(index: number): string;
|
|
34
|
-
functionName(
|
|
35
|
-
argPlaceholder(i: number): string;
|
|
34
|
+
functionName(p: Phrase): string;
|
|
36
35
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { basename } from 'path';
|
|
2
2
|
import { xyzab } from "../compiler/compile.js";
|
|
3
|
-
import {
|
|
3
|
+
import { Response, } from "../model/model.js";
|
|
4
4
|
const X = 'X'.codePointAt(0);
|
|
5
5
|
const A = 'A'.codePointAt(0);
|
|
6
6
|
export class VitestGenerator {
|
|
@@ -43,8 +43,8 @@ export class VitestGenerator {
|
|
|
43
43
|
}
|
|
44
44
|
this.tf.print(``);
|
|
45
45
|
for (const ph of this.phraseFns.keys()) {
|
|
46
|
-
const
|
|
47
|
-
const parameters =
|
|
46
|
+
const phrase = this.phraseFns.get(ph);
|
|
47
|
+
const parameters = phrase.args.map((a, i) => {
|
|
48
48
|
const declaration = a.toDeclaration(this, i);
|
|
49
49
|
const parts = declaration.split(': ');
|
|
50
50
|
return {
|
|
@@ -52,7 +52,7 @@ export class VitestGenerator {
|
|
|
52
52
|
type: parts[1] || 'any',
|
|
53
53
|
};
|
|
54
54
|
});
|
|
55
|
-
if (
|
|
55
|
+
if (phrase instanceof Response) {
|
|
56
56
|
parameters.push({
|
|
57
57
|
name: 'res',
|
|
58
58
|
type: 'any',
|
|
@@ -60,6 +60,7 @@ export class VitestGenerator {
|
|
|
60
60
|
}
|
|
61
61
|
this.phraseMethods.push({
|
|
62
62
|
name: ph,
|
|
63
|
+
phrase,
|
|
63
64
|
parameters,
|
|
64
65
|
});
|
|
65
66
|
}
|
|
@@ -137,7 +138,7 @@ export class VitestGenerator {
|
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
phrase(p) {
|
|
140
|
-
const phrasefn = this.
|
|
141
|
+
const phrasefn = p.toFunctionName(this.opts);
|
|
141
142
|
if (!this.phraseFns.has(phrasefn))
|
|
142
143
|
this.phraseFns.set(phrasefn, p);
|
|
143
144
|
const f = this.featureVars.get(p.feature.name);
|
|
@@ -180,22 +181,8 @@ export class VitestGenerator {
|
|
|
180
181
|
variantParamDeclaration(index) {
|
|
181
182
|
return `${this.paramName(index)}: any`;
|
|
182
183
|
}
|
|
183
|
-
functionName(
|
|
184
|
-
|
|
185
|
-
let argIndex = -1;
|
|
186
|
-
return ((kind === 'response' ? 'Then_' : 'When_') +
|
|
187
|
-
(phrase.parts
|
|
188
|
-
.flatMap((c) => c instanceof Word
|
|
189
|
-
? words(c.text).filter((x) => x)
|
|
190
|
-
: c instanceof Arg
|
|
191
|
-
? [this.argPlaceholder(++argIndex)]
|
|
192
|
-
: [])
|
|
193
|
-
.join('_') || ''));
|
|
194
|
-
}
|
|
195
|
-
argPlaceholder(i) {
|
|
196
|
-
return typeof this.opts.argumentPlaceholder === 'function'
|
|
197
|
-
? this.opts.argumentPlaceholder(i)
|
|
198
|
-
: this.opts.argumentPlaceholder;
|
|
184
|
+
functionName(p) {
|
|
185
|
+
return p.toFunctionName(this.opts);
|
|
199
186
|
}
|
|
200
187
|
}
|
|
201
188
|
function str(s) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VitestGenerator.js","sourceRoot":"","sources":["../../src/code_generator/VitestGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,EAAmB,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,
|
|
1
|
+
{"version":3,"file":"VitestGenerator.js","sourceRoot":"","sources":["../../src/code_generator/VitestGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAW,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAW,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAY3C,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAA;AAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAA;AAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAA;AAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAA;AAE7B,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAa;IACjC,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,mBAAmB,EAAE,KAAK;CAC3B,CAAA;AAED,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,GAAW,EACX,OAAiC,EAAE;IAEnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IACrD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAY,CAAA;IACtC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YAC5B,CAAC,CAAC,OAAO;gBACP,CAAC,CAAC,KAAK,GAAG,YAAY,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,CAAC,YAAY,EAAE,CAAA;QAC9F,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,KAAK,GAAG,YAAY,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,CAAA;QAC9C,CAAC;QACD,MAAM,CAAC,CAAA;IACT,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAChC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACvB,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC9C,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE;QACjD,GAAG,wBAAwB;QAC3B,GAAG,IAAI;KACR,CAAC,CAAA;IACF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAClB,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,aAAa,EAAE,EAAE,CAAC,aAAa;QAC/B,gBAAgB,EAAE,EAAE,CAAC,gBAAgB;KACtC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { CompletionItem, TextDocumentPositionParams } from 'vscode-languageserver';
|
|
2
|
+
export declare function resolveCompletion(item: CompletionItem): CompletionItem;
|
|
3
|
+
export declare function provideCompletion(_textDocumentPosition: TextDocumentPositionParams): CompletionItem[];
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CompletionItemKind, } from 'vscode-languageserver';
|
|
2
|
+
// This handler resolves additional information for the item selected in
|
|
3
|
+
// the completion list.
|
|
4
|
+
export function resolveCompletion(item) {
|
|
5
|
+
if (item.data === 1) {
|
|
6
|
+
item.detail = 'Harmony Code';
|
|
7
|
+
item.documentation = 'Harmony Code language support';
|
|
8
|
+
}
|
|
9
|
+
else if (item.data === 2) {
|
|
10
|
+
item.detail = 'Section keyword';
|
|
11
|
+
item.documentation = 'Define a test section';
|
|
12
|
+
}
|
|
13
|
+
return item;
|
|
14
|
+
}
|
|
15
|
+
export function provideCompletion(_textDocumentPosition) {
|
|
16
|
+
// The pass parameter contains the position of the text document in
|
|
17
|
+
// which code complete got requested.
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
label: 'Harmony',
|
|
21
|
+
kind: CompletionItemKind.Text,
|
|
22
|
+
data: 1,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
label: 'Section',
|
|
26
|
+
kind: CompletionItemKind.Keyword,
|
|
27
|
+
data: 2,
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=provideCompletion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provideCompletion.js","sourceRoot":"","sources":["../../src/lsp/provideCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,GAEnB,MAAM,uBAAuB,CAAA;AAE9B,wEAAwE;AACxE,uBAAuB;AACvB,MAAM,UAAU,iBAAiB,CAAC,IAAoB;IACpD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAA;QAC5B,IAAI,CAAC,aAAa,GAAG,+BAA+B,CAAA;IACtD,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAA;QAC/B,IAAI,CAAC,aAAa,GAAG,uBAAuB,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,qBAAiD;IAEjD,mEAAmE;IACnE,qCAAqC;IACrC,OAAO;QACL;YACE,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,kBAAkB,CAAC,IAAI;YAC7B,IAAI,EAAE,CAAC;SACR;QACD;YACE,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,kBAAkB,CAAC,OAAO;YAChC,IAAI,EAAE,CAAC;SACR;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Phrase } from '../model/model.js';
|
|
2
|
+
import { parse } from '../parser/parser.js';
|
|
3
|
+
import { connection, documents } from './server.js';
|
|
4
|
+
import { getWorkspace } from './workspace.js';
|
|
5
|
+
// Handle go to definition requests
|
|
6
|
+
export function provideDefinition(textDocumentParams) {
|
|
7
|
+
const uri = textDocumentParams.textDocument.uri;
|
|
8
|
+
const document = documents.get(uri);
|
|
9
|
+
if (!document) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
// Only handle .harmony files
|
|
13
|
+
if (!uri.endsWith('.harmony')) {
|
|
14
|
+
connection.console.log(`Definition request for non-harmony file: ${uri}`);
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const workspace = getWorkspace();
|
|
18
|
+
if (!workspace) {
|
|
19
|
+
connection.console.log('No workspace available for definition lookup');
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
// Convert URI to file path
|
|
24
|
+
const filePath = uri.replace('file://', '');
|
|
25
|
+
// Parse the document to get the AST
|
|
26
|
+
const text = document.getText();
|
|
27
|
+
const ast = parse(text);
|
|
28
|
+
connection.console.log(`Definition request for ${uri} at ${textDocumentParams.position.line}:${textDocumentParams.position.character}`);
|
|
29
|
+
// Use AST to find the node at the cursor position
|
|
30
|
+
const nodeAtPosition = ast.findNodeAtPosition(textDocumentParams.position.line + 1, textDocumentParams.position.character);
|
|
31
|
+
let phrase = null;
|
|
32
|
+
if (nodeAtPosition) {
|
|
33
|
+
connection.console.log(`Found node at position: ${nodeAtPosition.constructor.name}`);
|
|
34
|
+
// If we found a Phrase, use its information for definition lookup
|
|
35
|
+
if (nodeAtPosition instanceof Phrase) {
|
|
36
|
+
phrase = nodeAtPosition;
|
|
37
|
+
connection.console.log(`Found phrase: ${phrase.kind} - ${phrase.toString()}`);
|
|
38
|
+
// TODO: Use phrase information to improve definition lookup precision
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!phrase) {
|
|
42
|
+
connection.console.log('No phrase found at the given position');
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
// Use workspace to find definition in corresponding .phrases.ts file
|
|
46
|
+
const location = workspace.findDefinition(filePath, phrase);
|
|
47
|
+
if (location) {
|
|
48
|
+
connection.console.log(`Found definition at ${location.uri}`);
|
|
49
|
+
return location;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
connection.console.log('No definition found in phrases file');
|
|
53
|
+
// Fallback: return first line of the current harmony file
|
|
54
|
+
const fallbackLocation = {
|
|
55
|
+
uri: uri,
|
|
56
|
+
range: {
|
|
57
|
+
start: { line: 0, character: 0 },
|
|
58
|
+
end: { line: 0, character: 0 },
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
connection.console.log(`Returning fallback definition at line 0 of current file`);
|
|
62
|
+
return fallbackLocation;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// If there's a parse error, we can't provide definitions
|
|
67
|
+
connection.console.log(`Cannot provide definition due to error: ${error}`);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=provideDefinition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provideDefinition.js","sourceRoot":"","sources":["../../src/lsp/provideDefinition.ts"],"names":[],"mappings":"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"}
|
package/dist/lsp/server.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
import { TextDocuments } from 'vscode-languageserver/node.js';
|
|
3
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
4
|
+
export declare const connection: import("vscode-languageserver")._Connection<import("vscode-languageserver")._, import("vscode-languageserver")._, import("vscode-languageserver")._, import("vscode-languageserver")._, import("vscode-languageserver")._, import("vscode-languageserver")._, import("vscode-languageserver/lib/common/inlineCompletion.proposed.js").InlineCompletionFeatureShape, import("vscode-languageserver")._>;
|
|
5
|
+
export declare const documents: TextDocuments<TextDocument>;
|
|
6
|
+
export declare let hasDiagnosticRelatedInformationCapability: boolean;
|
package/dist/lsp/server.js
CHANGED
|
@@ -1,16 +1,30 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { createConnection, DidChangeConfigurationNotification, ProposedFeatures, TextDocuments, TextDocumentSyncKind, } from 'vscode-languageserver/node.js';
|
|
3
3
|
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
4
|
-
import {
|
|
4
|
+
import { provideCompletion, resolveCompletion } from './provideCompletion.js';
|
|
5
|
+
import { provideDefinition } from './provideDefinition.js';
|
|
6
|
+
import { validateTextDocument } from './validateTextDocument.js';
|
|
7
|
+
import { getWorkspace, initializeWorkspace } from './workspace.js';
|
|
5
8
|
// Create a connection for the server, using Node's IPC as a transport.
|
|
6
|
-
const connection = createConnection(ProposedFeatures.all);
|
|
9
|
+
export const connection = createConnection(ProposedFeatures.all);
|
|
7
10
|
// Create a simple text document manager.
|
|
8
|
-
const documents = new TextDocuments(TextDocument);
|
|
11
|
+
export const documents = new TextDocuments(TextDocument);
|
|
9
12
|
let hasConfigurationCapability = false;
|
|
10
13
|
let hasWorkspaceFolderCapability = false;
|
|
11
|
-
let hasDiagnosticRelatedInformationCapability = false;
|
|
14
|
+
export let hasDiagnosticRelatedInformationCapability = false;
|
|
12
15
|
connection.onInitialize((params) => {
|
|
13
16
|
const capabilities = params.capabilities;
|
|
17
|
+
// Initialize workspace if we have workspace folders
|
|
18
|
+
if (params.workspaceFolders && params.workspaceFolders.length > 0) {
|
|
19
|
+
const workspaceRoot = params.workspaceFolders[0].uri.replace('file://', '');
|
|
20
|
+
initializeWorkspace(workspaceRoot);
|
|
21
|
+
connection.console.log(`Initialized workspace at: ${workspaceRoot}`);
|
|
22
|
+
}
|
|
23
|
+
else if (params.rootUri) {
|
|
24
|
+
const workspaceRoot = params.rootUri.replace('file://', '');
|
|
25
|
+
initializeWorkspace(workspaceRoot);
|
|
26
|
+
connection.console.log(`Initialized workspace at: ${workspaceRoot}`);
|
|
27
|
+
}
|
|
14
28
|
// Does the client support the `workspace/configuration` request?
|
|
15
29
|
hasConfigurationCapability = !!(capabilities.workspace && !!capabilities.workspace.configuration);
|
|
16
30
|
hasWorkspaceFolderCapability = !!(capabilities.workspace && !!capabilities.workspace.workspaceFolders);
|
|
@@ -24,8 +38,7 @@ connection.onInitialize((params) => {
|
|
|
24
38
|
completionProvider: {
|
|
25
39
|
// WIP resolveProvider: true,
|
|
26
40
|
},
|
|
27
|
-
|
|
28
|
-
// WIP definitionProvider: true,
|
|
41
|
+
definitionProvider: true,
|
|
29
42
|
},
|
|
30
43
|
};
|
|
31
44
|
if (hasWorkspaceFolderCapability) {
|
|
@@ -78,153 +91,55 @@ function getDocumentSettings(resource) {
|
|
|
78
91
|
}
|
|
79
92
|
return result;
|
|
80
93
|
}
|
|
81
|
-
// Only keep settings for open documents
|
|
82
|
-
documents.onDidClose((e) => {
|
|
83
|
-
documentSettings.delete(e.document.uri);
|
|
84
|
-
});
|
|
85
94
|
// The content of a text document has changed. This event is emitted
|
|
86
95
|
// when the text document first opened or when its content has changed.
|
|
87
96
|
documents.onDidChangeContent((change) => {
|
|
88
97
|
validateTextDocument(change.document);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const ast = parse(text);
|
|
96
|
-
connection.console.log(`Successfully parsed document: ${textDocument.uri}`);
|
|
97
|
-
// If parsing succeeds, no errors to report
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
// If parsing fails, create a diagnostic for the error
|
|
101
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
102
|
-
// Try to extract line information from error message if available
|
|
103
|
-
let line = 0;
|
|
104
|
-
let character = 0;
|
|
105
|
-
// Look for line information in the error message
|
|
106
|
-
const lineMatch = errorMessage.match(/line (\d+)/i);
|
|
107
|
-
if (lineMatch) {
|
|
108
|
-
line = parseInt(lineMatch[1]) - 1; // Convert to 0-based
|
|
109
|
-
}
|
|
110
|
-
// Look for column/character information in the error message
|
|
111
|
-
const columnMatch = errorMessage.match(/column (\d+)/i);
|
|
112
|
-
if (columnMatch) {
|
|
113
|
-
character = parseInt(columnMatch[1]) - 1; // Convert to 0-based
|
|
98
|
+
const uri = change.document.uri;
|
|
99
|
+
const workspace = getWorkspace();
|
|
100
|
+
if (workspace) {
|
|
101
|
+
const filePath = uri.replace('file://', '');
|
|
102
|
+
if (uri.endsWith('.harmony')) {
|
|
103
|
+
workspace.addHarmonyFile(filePath, change.document.getText());
|
|
114
104
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
character === 0 &&
|
|
118
|
-
error instanceof Error &&
|
|
119
|
-
'pos' in error &&
|
|
120
|
-
typeof error.pos === 'object') {
|
|
121
|
-
const pos = error.pos;
|
|
122
|
-
if (pos && pos.rowBegin) {
|
|
123
|
-
line = pos.rowBegin - 1;
|
|
124
|
-
character = pos.columnBegin ? pos.columnBegin - 1 : 0;
|
|
125
|
-
}
|
|
105
|
+
else if (uri.endsWith('.phrases.ts')) {
|
|
106
|
+
workspace.addPhrasesFile(filePath, change.document.getText());
|
|
126
107
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
documents.onDidOpen((event) => {
|
|
111
|
+
const uri = event.document.uri;
|
|
112
|
+
const workspace = getWorkspace();
|
|
113
|
+
if (workspace) {
|
|
114
|
+
const filePath = uri.replace('file://', '');
|
|
115
|
+
if (uri.endsWith('.harmony')) {
|
|
116
|
+
workspace.addHarmonyFile(filePath, event.document.getText());
|
|
130
117
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const diagnostic = {
|
|
134
|
-
severity: DiagnosticSeverity.Error,
|
|
135
|
-
range: {
|
|
136
|
-
start: { line, character },
|
|
137
|
-
end: { line, character: Math.max(character, endCharacter) },
|
|
138
|
-
},
|
|
139
|
-
message: `${errorMessage}`
|
|
140
|
-
.replace(/^\{.*?\}:\s*/, '')
|
|
141
|
-
.replace(/^Unable to consume token: /, 'Invalid '),
|
|
142
|
-
source: 'harmony-parser',
|
|
143
|
-
};
|
|
144
|
-
if (hasDiagnosticRelatedInformationCapability) {
|
|
145
|
-
diagnostic.relatedInformation = [
|
|
146
|
-
{
|
|
147
|
-
location: {
|
|
148
|
-
uri: textDocument.uri,
|
|
149
|
-
range: diagnostic.range,
|
|
150
|
-
},
|
|
151
|
-
message: 'Harmony syntax error detected by parser',
|
|
152
|
-
},
|
|
153
|
-
];
|
|
118
|
+
else if (uri.endsWith('.phrases.ts')) {
|
|
119
|
+
workspace.addPhrasesFile(filePath, event.document.getText());
|
|
154
120
|
}
|
|
155
|
-
diagnostics.push(diagnostic);
|
|
156
|
-
connection.console.log(`Parse error in ${textDocument.uri}: ${errorMessage}`);
|
|
157
|
-
}
|
|
158
|
-
// Send the computed diagnostics to VS Code.
|
|
159
|
-
connection.sendDiagnostics({ uri: textDocument.uri, diagnostics });
|
|
160
|
-
}
|
|
161
|
-
// Handle go to definition requests
|
|
162
|
-
connection.onDefinition((textDocumentParams) => {
|
|
163
|
-
const uri = textDocumentParams.textDocument.uri;
|
|
164
|
-
const document = documents.get(uri);
|
|
165
|
-
if (!document) {
|
|
166
|
-
return null;
|
|
167
121
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
};
|
|
181
|
-
connection.console.log(`Definition request for ${uri} at ${textDocumentParams.position.line}:${textDocumentParams.position.character}`);
|
|
182
|
-
connection.console.log(`Returning definition at line 0`);
|
|
183
|
-
return location;
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
// If there's a parse error, we can't provide definitions
|
|
187
|
-
connection.console.log(`Cannot provide definition due to parse error: ${error}`);
|
|
188
|
-
return null;
|
|
122
|
+
});
|
|
123
|
+
documents.onDidClose((event) => {
|
|
124
|
+
const uri = event.document.uri;
|
|
125
|
+
documentSettings.delete(uri);
|
|
126
|
+
// When a .harmony file is closed, optionally remove its .phrases.ts file
|
|
127
|
+
if (uri.endsWith('.harmony')) {
|
|
128
|
+
const workspace = getWorkspace();
|
|
129
|
+
if (workspace) {
|
|
130
|
+
const filePath = uri.replace('file://', '');
|
|
131
|
+
// Note: We might want to keep the phrases file loaded even when harmony file is closed
|
|
132
|
+
// workspace.removePhrasesFile(filePath)
|
|
133
|
+
}
|
|
189
134
|
}
|
|
190
135
|
});
|
|
191
|
-
connection.
|
|
136
|
+
connection.onDefinition(provideDefinition);
|
|
137
|
+
connection.onDidChangeWatchedFiles((change) => {
|
|
192
138
|
// Monitored files have change in VS Code
|
|
193
139
|
connection.console.log('We received a file change event');
|
|
194
140
|
});
|
|
195
|
-
|
|
196
|
-
connection.
|
|
197
|
-
// The pass parameter contains the position of the text document in
|
|
198
|
-
// which code complete got requested.
|
|
199
|
-
return [
|
|
200
|
-
{
|
|
201
|
-
label: 'Harmony',
|
|
202
|
-
kind: CompletionItemKind.Text,
|
|
203
|
-
data: 1,
|
|
204
|
-
},
|
|
205
|
-
{
|
|
206
|
-
label: 'Section',
|
|
207
|
-
kind: CompletionItemKind.Keyword,
|
|
208
|
-
data: 2,
|
|
209
|
-
},
|
|
210
|
-
];
|
|
211
|
-
});
|
|
212
|
-
// This handler resolves additional information for the item selected in
|
|
213
|
-
// the completion list.
|
|
214
|
-
connection.onCompletionResolve((item) => {
|
|
215
|
-
if (item.data === 1) {
|
|
216
|
-
item.detail = 'Harmony Code';
|
|
217
|
-
item.documentation = 'Harmony Code language support';
|
|
218
|
-
}
|
|
219
|
-
else if (item.data === 2) {
|
|
220
|
-
item.detail = 'Section keyword';
|
|
221
|
-
item.documentation = 'Define a test section';
|
|
222
|
-
}
|
|
223
|
-
return item;
|
|
224
|
-
});
|
|
225
|
-
// Make the text document manager listen on the connection
|
|
226
|
-
// for open, change and close text document events
|
|
141
|
+
connection.onCompletion(provideCompletion);
|
|
142
|
+
connection.onCompletionResolve(resolveCompletion);
|
|
227
143
|
documents.listen(connection);
|
|
228
|
-
// Listen on the connection
|
|
229
144
|
connection.listen();
|
|
230
145
|
//# sourceMappingURL=server.js.map
|
package/dist/lsp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/lsp/server.ts"],"names":[],"mappings":";AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/lsp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { DiagnosticSeverity } from 'vscode-languageserver';
|
|
2
|
+
import { parse } from '../parser/parser.js';
|
|
3
|
+
import { connection, hasDiagnosticRelatedInformationCapability, } from './server.js';
|
|
4
|
+
export async function validateTextDocument(textDocument) {
|
|
5
|
+
if (!textDocument.uri.endsWith('.harmony')) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const text = textDocument.getText();
|
|
9
|
+
const diagnostics = [];
|
|
10
|
+
try {
|
|
11
|
+
// Try to parse the document using the harmonyc parser
|
|
12
|
+
const ast = parse(text);
|
|
13
|
+
connection.console.log(`Successfully parsed document: ${textDocument.uri}`);
|
|
14
|
+
// If parsing succeeds, no errors to report
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
// If parsing fails, create a diagnostic for the error
|
|
18
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
19
|
+
// Try to extract line information from error message if available
|
|
20
|
+
let line = 0;
|
|
21
|
+
let character = 0;
|
|
22
|
+
// Look for line information in the error message
|
|
23
|
+
const lineMatch = errorMessage.match(/line (\d+)/i);
|
|
24
|
+
if (lineMatch) {
|
|
25
|
+
line = parseInt(lineMatch[1]) - 1; // Convert to 0-based
|
|
26
|
+
}
|
|
27
|
+
// Look for column/character information in the error message
|
|
28
|
+
const columnMatch = errorMessage.match(/column (\d+)/i);
|
|
29
|
+
if (columnMatch) {
|
|
30
|
+
character = parseInt(columnMatch[1]) - 1; // Convert to 0-based
|
|
31
|
+
}
|
|
32
|
+
// If no specific position found, try to find the error position from the parser
|
|
33
|
+
if (line === 0 &&
|
|
34
|
+
character === 0 &&
|
|
35
|
+
error instanceof Error &&
|
|
36
|
+
'pos' in error &&
|
|
37
|
+
typeof error.pos === 'object') {
|
|
38
|
+
const pos = error.pos;
|
|
39
|
+
if (pos && pos.rowBegin) {
|
|
40
|
+
line = pos.rowBegin - 1;
|
|
41
|
+
character = pos.columnBegin ? pos.columnBegin - 1 : 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (errorMessage.match(/^<END-OF-FILE>/)) {
|
|
45
|
+
line = text.split('\n').length - 1;
|
|
46
|
+
character = text.length - text.lastIndexOf('\n') - 1;
|
|
47
|
+
}
|
|
48
|
+
const lines = text.split('\n');
|
|
49
|
+
const endCharacter = line < lines.length ? lines[line].length : character;
|
|
50
|
+
const diagnostic = {
|
|
51
|
+
severity: DiagnosticSeverity.Error,
|
|
52
|
+
range: {
|
|
53
|
+
start: { line, character },
|
|
54
|
+
end: { line, character: Math.max(character, endCharacter) },
|
|
55
|
+
},
|
|
56
|
+
message: `${errorMessage}`
|
|
57
|
+
.replace(/^\{.*?\}:\s*/, '')
|
|
58
|
+
.replace(/^Unable to consume token: /, 'Invalid '),
|
|
59
|
+
source: 'harmony-parser',
|
|
60
|
+
};
|
|
61
|
+
if (hasDiagnosticRelatedInformationCapability) {
|
|
62
|
+
diagnostic.relatedInformation = [
|
|
63
|
+
{
|
|
64
|
+
location: {
|
|
65
|
+
uri: textDocument.uri,
|
|
66
|
+
range: diagnostic.range,
|
|
67
|
+
},
|
|
68
|
+
message: 'Harmony syntax error detected by parser',
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
diagnostics.push(diagnostic);
|
|
73
|
+
connection.console.log(`Parse error in ${textDocument.uri}: ${errorMessage}`);
|
|
74
|
+
}
|
|
75
|
+
// Send the computed diagnostics to VS Code.
|
|
76
|
+
connection.sendDiagnostics({ uri: textDocument.uri, diagnostics });
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=validateTextDocument.js.map
|