skir 0.0.3 → 0.0.6
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/casing.d.ts.map +1 -1
- package/dist/casing.js +4 -1
- package/dist/casing.js.map +1 -1
- package/dist/casing.test.js +35 -1
- package/dist/casing.test.js.map +1 -1
- package/dist/compatibility_checker.test.js +2 -2
- package/dist/compiler.js +23 -42
- package/dist/compiler.js.map +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -10
- package/dist/config.js.map +1 -1
- package/dist/config_parser.d.ts +25 -0
- package/dist/config_parser.d.ts.map +1 -0
- package/dist/config_parser.js +125 -0
- package/dist/config_parser.js.map +1 -0
- package/dist/config_parser.test.d.ts +2 -0
- package/dist/config_parser.test.d.ts.map +1 -0
- package/dist/config_parser.test.js +386 -0
- package/dist/config_parser.test.js.map +1 -0
- package/dist/doc_comment_parser.d.ts +3 -2
- package/dist/doc_comment_parser.d.ts.map +1 -1
- package/dist/doc_comment_parser.js +67 -52
- package/dist/doc_comment_parser.js.map +1 -1
- package/dist/doc_comment_parser.test.js +86 -154
- package/dist/doc_comment_parser.test.js.map +1 -1
- package/dist/error_renderer.d.ts +4 -0
- package/dist/error_renderer.d.ts.map +1 -1
- package/dist/error_renderer.js +21 -0
- package/dist/error_renderer.js.map +1 -1
- package/dist/module_set.d.ts.map +1 -1
- package/dist/module_set.js +29 -12
- package/dist/module_set.js.map +1 -1
- package/dist/module_set.test.js +318 -173
- package/dist/module_set.test.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +10 -10
- package/dist/parser.js.map +1 -1
- package/dist/project_initializer.js +9 -1
- package/dist/project_initializer.js.map +1 -1
- package/dist/tokenizer.d.ts +7 -1
- package/dist/tokenizer.d.ts.map +1 -1
- package/dist/tokenizer.js +12 -0
- package/dist/tokenizer.js.map +1 -1
- package/package.json +10 -5
- package/src/casing.ts +6 -1
- package/src/compiler.ts +26 -40
- package/src/config.ts +10 -15
- package/src/config_parser.ts +169 -0
- package/src/doc_comment_parser.ts +76 -52
- package/src/error_renderer.ts +34 -0
- package/src/module_set.ts +31 -15
- package/src/parser.ts +16 -10
- package/src/project_initializer.ts +9 -1
- package/src/tokenizer.ts +20 -2
- package/dist/language_server.d.ts +0 -15
- package/dist/language_server.d.ts.map +0 -1
- package/dist/language_server.js +0 -248
- package/dist/language_server.js.map +0 -1
- package/src/language_server.ts +0 -301
package/src/module_set.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as paths from "path";
|
|
2
2
|
import {
|
|
3
|
+
MutableDocReferenceName,
|
|
3
4
|
unquoteAndUnescape,
|
|
4
5
|
type DenseJson,
|
|
5
6
|
type ErrorSink,
|
|
@@ -10,6 +11,7 @@ import {
|
|
|
10
11
|
type Module,
|
|
11
12
|
type MutableArrayType,
|
|
12
13
|
type MutableConstant,
|
|
14
|
+
type MutableDoc,
|
|
13
15
|
type MutableDocReference,
|
|
14
16
|
type MutableMethod,
|
|
15
17
|
type MutableModule,
|
|
@@ -812,7 +814,7 @@ export class ModuleSet {
|
|
|
812
814
|
module: Module,
|
|
813
815
|
errors: ErrorSink,
|
|
814
816
|
): void {
|
|
815
|
-
const doc =
|
|
817
|
+
const doc: MutableDoc =
|
|
816
818
|
documentee.kind === "field" ? documentee.field.doc : documentee.doc;
|
|
817
819
|
|
|
818
820
|
const docReferences = doc.pieces.filter(
|
|
@@ -826,23 +828,24 @@ export class ModuleSet {
|
|
|
826
828
|
// Returns true if resolved, false otherwise.
|
|
827
829
|
const tryResolveReference = (
|
|
828
830
|
ref: MutableDocReference,
|
|
829
|
-
|
|
831
|
+
nameParts: readonly MutableDocReferenceName[],
|
|
830
832
|
scope: Record | Module,
|
|
831
833
|
): boolean => {
|
|
832
834
|
if (ref.absolute && scope !== module) {
|
|
833
835
|
return false;
|
|
834
836
|
}
|
|
835
|
-
const firstName =
|
|
836
|
-
const match = scope.nameToDeclaration[firstName.text];
|
|
837
|
+
const firstName = nameParts[0]!;
|
|
838
|
+
const match = scope.nameToDeclaration[firstName.token.text];
|
|
837
839
|
if (!match) {
|
|
838
840
|
return false;
|
|
839
841
|
}
|
|
840
|
-
if (
|
|
842
|
+
if (nameParts.length === 1) {
|
|
841
843
|
// Single name: must refer to a declaration.
|
|
842
844
|
switch (match.kind) {
|
|
843
845
|
case "constant":
|
|
844
846
|
case "method":
|
|
845
847
|
case "record": {
|
|
848
|
+
firstName.declaration = match;
|
|
846
849
|
ref.referee = match;
|
|
847
850
|
return true;
|
|
848
851
|
}
|
|
@@ -850,6 +853,7 @@ export class ModuleSet {
|
|
|
850
853
|
if (scope.kind !== "record") {
|
|
851
854
|
throw new TypeError(scope.kind);
|
|
852
855
|
}
|
|
856
|
+
firstName.declaration = match;
|
|
853
857
|
ref.referee = {
|
|
854
858
|
kind: "field",
|
|
855
859
|
field: match,
|
|
@@ -857,16 +861,21 @@ export class ModuleSet {
|
|
|
857
861
|
};
|
|
858
862
|
return true;
|
|
859
863
|
}
|
|
864
|
+
case "import-alias": {
|
|
865
|
+
firstName.declaration = match;
|
|
866
|
+
return false;
|
|
867
|
+
}
|
|
860
868
|
case "import":
|
|
861
|
-
case "import-alias":
|
|
862
869
|
case "removed":
|
|
863
870
|
return false;
|
|
864
871
|
}
|
|
865
872
|
} else {
|
|
866
873
|
// Multi-part name: first part must be a naming scope.
|
|
867
874
|
switch (match.kind) {
|
|
868
|
-
case "record":
|
|
869
|
-
|
|
875
|
+
case "record": {
|
|
876
|
+
firstName.declaration = match;
|
|
877
|
+
return tryResolveReference(ref, nameParts.slice(1), match);
|
|
878
|
+
}
|
|
870
879
|
case "import":
|
|
871
880
|
case "import-alias": {
|
|
872
881
|
if (scope !== module) {
|
|
@@ -881,9 +890,13 @@ export class ModuleSet {
|
|
|
881
890
|
if (!importedModule?.result) {
|
|
882
891
|
return false;
|
|
883
892
|
}
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
893
|
+
let newNameChain: readonly MutableDocReferenceName[];
|
|
894
|
+
if (match.kind === "import") {
|
|
895
|
+
newNameChain = nameParts;
|
|
896
|
+
} else {
|
|
897
|
+
firstName.declaration = match;
|
|
898
|
+
newNameChain = nameParts.slice(1);
|
|
899
|
+
}
|
|
887
900
|
return tryResolveReference(
|
|
888
901
|
ref,
|
|
889
902
|
newNameChain,
|
|
@@ -892,7 +905,10 @@ export class ModuleSet {
|
|
|
892
905
|
}
|
|
893
906
|
case "constant":
|
|
894
907
|
case "field":
|
|
895
|
-
case "method":
|
|
908
|
+
case "method": {
|
|
909
|
+
firstName.declaration = match;
|
|
910
|
+
return false;
|
|
911
|
+
}
|
|
896
912
|
case "removed":
|
|
897
913
|
return false;
|
|
898
914
|
}
|
|
@@ -947,13 +963,13 @@ export class ModuleSet {
|
|
|
947
963
|
|
|
948
964
|
// Resolve each reference by searching through scopes in priority order.
|
|
949
965
|
for (const reference of docReferences) {
|
|
950
|
-
const {
|
|
951
|
-
if (
|
|
966
|
+
const { nameParts } = reference;
|
|
967
|
+
if (nameParts.length <= 0) {
|
|
952
968
|
continue;
|
|
953
969
|
}
|
|
954
970
|
let resolved = false;
|
|
955
971
|
for (const scope of scopes) {
|
|
956
|
-
if (tryResolveReference(reference,
|
|
972
|
+
if (tryResolveReference(reference, nameParts, scope)) {
|
|
957
973
|
resolved = true;
|
|
958
974
|
break;
|
|
959
975
|
}
|
package/src/parser.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
ImportAlias,
|
|
8
8
|
MutableConstant,
|
|
9
9
|
MutableDeclaration,
|
|
10
|
+
MutableDoc,
|
|
10
11
|
MutableField,
|
|
11
12
|
MutableMethod,
|
|
12
13
|
MutableModule,
|
|
@@ -28,14 +29,14 @@ import type {
|
|
|
28
29
|
} from "skir-internal";
|
|
29
30
|
import { convertCase, simpleHash } from "skir-internal";
|
|
30
31
|
import * as casing from "./casing.js";
|
|
31
|
-
import {
|
|
32
|
+
import { mergeDocs } from "./doc_comment_parser.js";
|
|
32
33
|
import { ModuleTokens } from "./tokenizer.js";
|
|
33
34
|
|
|
34
35
|
/** Runs syntactic analysis on a module. */
|
|
35
36
|
export function parseModule(moduleTokens: ModuleTokens): Result<MutableModule> {
|
|
36
|
-
const {
|
|
37
|
+
const { modulePath, sourceCode } = moduleTokens;
|
|
37
38
|
const errors: SkirError[] = [];
|
|
38
|
-
const it = new TokenIterator(
|
|
39
|
+
const it = new TokenIterator(moduleTokens, errors);
|
|
39
40
|
const declarations = parseDeclarations(it, "module");
|
|
40
41
|
it.expectThenNext([""]);
|
|
41
42
|
// Create a mappinng from names to declarations, and check for duplicates.
|
|
@@ -160,7 +161,7 @@ function parseDeclaration(
|
|
|
160
161
|
it: TokenIterator,
|
|
161
162
|
parentNode: "module" | "struct" | "enum",
|
|
162
163
|
): MutableDeclaration | null {
|
|
163
|
-
const doc =
|
|
164
|
+
const doc = collectDoc(it);
|
|
164
165
|
let recordType: "struct" | "enum" = "enum";
|
|
165
166
|
const parentIsRoot = parentNode === "module";
|
|
166
167
|
const expected = [
|
|
@@ -1046,15 +1047,16 @@ function parseArrayValue(it: TokenIterator): MutableValue[] | null {
|
|
|
1046
1047
|
}
|
|
1047
1048
|
}
|
|
1048
1049
|
|
|
1049
|
-
function
|
|
1050
|
+
function collectDoc(it: TokenIterator): MutableDoc {
|
|
1051
|
+
const { moduleTokens } = it;
|
|
1050
1052
|
const docComments: Token[] = [];
|
|
1051
1053
|
while (it.current.startsWith("///")) {
|
|
1052
1054
|
docComments.push(it.currentToken);
|
|
1053
1055
|
it.next();
|
|
1054
1056
|
}
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1057
|
+
return mergeDocs(
|
|
1058
|
+
docComments.map((c) => moduleTokens.posToDoc[c.position] ?? EMPTY_DOC),
|
|
1059
|
+
);
|
|
1058
1060
|
}
|
|
1059
1061
|
|
|
1060
1062
|
const EMPTY_DOC: Doc = {
|
|
@@ -1121,10 +1123,14 @@ interface TokenMatch {
|
|
|
1121
1123
|
}
|
|
1122
1124
|
|
|
1123
1125
|
class TokenIterator {
|
|
1126
|
+
private readonly tokens: readonly Token[];
|
|
1127
|
+
|
|
1124
1128
|
constructor(
|
|
1125
|
-
|
|
1129
|
+
readonly moduleTokens: ModuleTokens,
|
|
1126
1130
|
readonly errors: ErrorSink,
|
|
1127
|
-
) {
|
|
1131
|
+
) {
|
|
1132
|
+
this.tokens = moduleTokens.tokens;
|
|
1133
|
+
}
|
|
1128
1134
|
|
|
1129
1135
|
// Returns both:
|
|
1130
1136
|
// · the index of the first predicate matching the current token, or -1 if
|
|
@@ -30,10 +30,18 @@ export function initializeProject(rootDir: string): void {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
const SKIR_YML_CONTENT = `srcDir: skir-src
|
|
33
|
+
|
|
34
|
+
generators:
|
|
35
|
+
- mod: skir-python-gen
|
|
36
|
+
skiroutDir: ./skirout
|
|
37
|
+
config: {}
|
|
33
38
|
`;
|
|
34
39
|
|
|
35
|
-
const HELLO_WORLD_SKIR_CONTENT =
|
|
40
|
+
const HELLO_WORLD_SKIR_CONTENT = `/// A point in 2D space.
|
|
41
|
+
struct Point {
|
|
42
|
+
/// x-coordinate
|
|
36
43
|
x: int32;
|
|
44
|
+
/// y-coordinate
|
|
37
45
|
y: int32;
|
|
38
46
|
}
|
|
39
47
|
`;
|
package/src/tokenizer.ts
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import {
|
|
2
2
|
unquoteAndUnescape,
|
|
3
3
|
type CodeLine,
|
|
4
|
+
type Doc,
|
|
4
5
|
type ErrorSink,
|
|
5
6
|
type Result,
|
|
6
7
|
type SkirError,
|
|
7
8
|
type Token,
|
|
8
9
|
} from "skir-internal";
|
|
10
|
+
import { parseDocComment } from "./doc_comment_parser.js";
|
|
9
11
|
|
|
10
12
|
export interface ModuleTokens {
|
|
11
|
-
|
|
13
|
+
/** Includes regular comments and doc comments. */
|
|
12
14
|
readonly tokens: readonly Token[];
|
|
13
|
-
|
|
15
|
+
/** Includes both kinds of comments. */
|
|
14
16
|
readonly tokensWithComments: readonly Token[];
|
|
17
|
+
/** Maps the start position of a doc comment (///) to the parsed documentation. */
|
|
18
|
+
readonly posToDoc: Readonly<{
|
|
19
|
+
[pos: number]: Doc;
|
|
20
|
+
}>;
|
|
15
21
|
readonly sourceCode: string;
|
|
16
22
|
readonly modulePath: string;
|
|
17
23
|
}
|
|
@@ -133,10 +139,22 @@ export function tokenizeModule(
|
|
|
133
139
|
}
|
|
134
140
|
}
|
|
135
141
|
|
|
142
|
+
// Parse the doc comments.
|
|
143
|
+
const posToDoc: { [pos: number]: Doc } = {};
|
|
144
|
+
for (const token of tokens) {
|
|
145
|
+
if (!token.text.startsWith("///")) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const docResult = parseDocComment(token);
|
|
149
|
+
posToDoc[token.position] = docResult.result;
|
|
150
|
+
docResult.errors.forEach((e) => errors.push(e));
|
|
151
|
+
}
|
|
152
|
+
|
|
136
153
|
return {
|
|
137
154
|
result: {
|
|
138
155
|
tokens: tokens.filter((t) => !isRegularComment(t.originalText)),
|
|
139
156
|
tokensWithComments: tokens,
|
|
157
|
+
posToDoc: posToDoc,
|
|
140
158
|
sourceCode: sourceCode,
|
|
141
159
|
modulePath: modulePath,
|
|
142
160
|
},
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export declare class LanguageServerModuleSet {
|
|
2
|
-
private readonly rootPath;
|
|
3
|
-
constructor(rootPath: string);
|
|
4
|
-
setFileContent(uri: string, content: string): void;
|
|
5
|
-
deleteFile(uri: string): void;
|
|
6
|
-
private reassignModulesToWorkspaces;
|
|
7
|
-
private parseSkirConfig;
|
|
8
|
-
private parseSkirModule;
|
|
9
|
-
/** Finds the workspace which contains the given module URI. */
|
|
10
|
-
private findModuleWorkspace;
|
|
11
|
-
private reassigneModulesTimeout?;
|
|
12
|
-
private readonly moduleBundles;
|
|
13
|
-
private readonly workspaces;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=language_server.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"language_server.d.ts","sourceRoot":"","sources":["../src/language_server.ts"],"names":[],"mappings":"AAeA,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE7C,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IA2BlD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAuB7B,OAAO,CAAC,2BAA2B;IAoBnC,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,eAAe;IAmBvB,+DAA+D;IAC/D,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,uBAAuB,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;CAC5D"}
|
package/dist/language_server.js
DELETED
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import * as yaml from "yaml";
|
|
2
|
-
import { fromZodError } from "zod-validation-error";
|
|
3
|
-
import { SkirConfig } from "./config.js";
|
|
4
|
-
import { ModuleSet } from "./module_set.js";
|
|
5
|
-
import { parseModule } from "./parser.js";
|
|
6
|
-
import { tokenizeModule } from "./tokenizer.js";
|
|
7
|
-
export class LanguageServerModuleSet {
|
|
8
|
-
constructor(rootPath) {
|
|
9
|
-
this.rootPath = rootPath;
|
|
10
|
-
this.moduleBundles = new Map(); // key: file URI
|
|
11
|
-
this.workspaces = new Map(); // key: file URI
|
|
12
|
-
}
|
|
13
|
-
setFileContent(uri, content) {
|
|
14
|
-
this.deleteFile(uri);
|
|
15
|
-
const fileType = getFileType(uri);
|
|
16
|
-
switch (fileType) {
|
|
17
|
-
case "skir.yml": {
|
|
18
|
-
const workspace = this.parseSkirConfig(content, uri);
|
|
19
|
-
if (workspace) {
|
|
20
|
-
this.workspaces.set(uri, workspace);
|
|
21
|
-
this.reassignModulesToWorkspaces();
|
|
22
|
-
}
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
case "*.skir": {
|
|
26
|
-
const moduleWorkspace = this.findModuleWorkspace(uri);
|
|
27
|
-
const moduleBundle = this.parseSkirModule(content, uri);
|
|
28
|
-
this.moduleBundles.set(uri, moduleBundle);
|
|
29
|
-
if (moduleWorkspace) {
|
|
30
|
-
Workspace.addModule(moduleBundle, moduleWorkspace);
|
|
31
|
-
}
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
default: {
|
|
35
|
-
const _ = fileType;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
deleteFile(uri) {
|
|
40
|
-
const fileType = getFileType(uri);
|
|
41
|
-
switch (fileType) {
|
|
42
|
-
case "skir.yml": {
|
|
43
|
-
if (this.workspaces.delete(uri)) {
|
|
44
|
-
this.reassignModulesToWorkspaces();
|
|
45
|
-
}
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
case "*.skir": {
|
|
49
|
-
const moduleBundle = this.moduleBundles.get(uri);
|
|
50
|
-
if (moduleBundle) {
|
|
51
|
-
Workspace.removeModule(moduleBundle);
|
|
52
|
-
this.moduleBundles.delete(uri);
|
|
53
|
-
}
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
default: {
|
|
57
|
-
const _ = fileType;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
reassignModulesToWorkspaces() {
|
|
62
|
-
if (this.reassigneModulesTimeout) {
|
|
63
|
-
// Already scheduled, do nothing.
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
this.reassigneModulesTimeout = setTimeout(() => {
|
|
67
|
-
for (const [moduleUri, moduleBundle] of this.moduleBundles.entries()) {
|
|
68
|
-
Workspace.removeModule(moduleBundle);
|
|
69
|
-
const newWorkspace = this.findModuleWorkspace(moduleUri);
|
|
70
|
-
if (newWorkspace) {
|
|
71
|
-
Workspace.addModule(moduleBundle, newWorkspace);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
for (const workspace of this.workspaces.values()) {
|
|
75
|
-
workspace.scheduleResolution();
|
|
76
|
-
}
|
|
77
|
-
this.reassigneModulesTimeout = undefined;
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
parseSkirConfig(content, uri) {
|
|
81
|
-
let skirConfig;
|
|
82
|
-
{
|
|
83
|
-
// `yaml.parse` fail with a helpful error message, no need to add context.
|
|
84
|
-
const parseResult = SkirConfig.safeParse(yaml.parse(content));
|
|
85
|
-
if (parseResult.success) {
|
|
86
|
-
skirConfig = parseResult.data;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
const validationError = fromZodError(parseResult.error);
|
|
90
|
-
console.error(`Error parsing skir.yml at ${uri}:`, validationError.message);
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
let rootUri = new URL(skirConfig.srcDir || ".", uri).href;
|
|
95
|
-
if (!rootUri.endsWith("/")) {
|
|
96
|
-
rootUri += "/";
|
|
97
|
-
}
|
|
98
|
-
return new Workspace(rootUri);
|
|
99
|
-
}
|
|
100
|
-
parseSkirModule(content, uri) {
|
|
101
|
-
let astTree;
|
|
102
|
-
{
|
|
103
|
-
const tokens = tokenizeModule(content, uri);
|
|
104
|
-
if (tokens.errors.length !== 0) {
|
|
105
|
-
astTree = {
|
|
106
|
-
result: null,
|
|
107
|
-
errors: tokens.errors,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
astTree = parseModule(tokens.result);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
astTree,
|
|
116
|
-
errors: [],
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
/** Finds the workspace which contains the given module URI. */
|
|
120
|
-
findModuleWorkspace(moduleUri) {
|
|
121
|
-
let match;
|
|
122
|
-
const leftIsBetter = (left, right) => {
|
|
123
|
-
if (right === undefined || left.rootUri.length < right.rootUri.length) {
|
|
124
|
-
return true;
|
|
125
|
-
}
|
|
126
|
-
if (left.rootUri.length === right.rootUri.length) {
|
|
127
|
-
// Completely arbitrary, just to have a consistent order.
|
|
128
|
-
return left.rootUri < right.rootUri;
|
|
129
|
-
}
|
|
130
|
-
return false;
|
|
131
|
-
};
|
|
132
|
-
for (const workspace of this.workspaces.values()) {
|
|
133
|
-
const { rootUri } = workspace;
|
|
134
|
-
if (moduleUri.startsWith(rootUri) && leftIsBetter(workspace, match)) {
|
|
135
|
-
match = workspace;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
if (!match) {
|
|
139
|
-
return undefined;
|
|
140
|
-
}
|
|
141
|
-
return {
|
|
142
|
-
workspace: match,
|
|
143
|
-
modulePath: moduleUri.substring(match.rootUri.length),
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
function errorToDiagnostic(error) {
|
|
148
|
-
const { token, message, expected } = error;
|
|
149
|
-
return {
|
|
150
|
-
range: {
|
|
151
|
-
start: token.position,
|
|
152
|
-
end: token.position + token.text.length,
|
|
153
|
-
},
|
|
154
|
-
message: message ? message : `expected: ${expected}`,
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
function getFileType(uri) {
|
|
158
|
-
if (uri.endsWith("/skir.yml")) {
|
|
159
|
-
return "skir.yml";
|
|
160
|
-
}
|
|
161
|
-
else if (uri.endsWith(".skir")) {
|
|
162
|
-
return "*.skir";
|
|
163
|
-
}
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
class Workspace {
|
|
167
|
-
constructor(rootUri) {
|
|
168
|
-
this.rootUri = rootUri;
|
|
169
|
-
this.mutableRecordMap = new Map();
|
|
170
|
-
// key: module path
|
|
171
|
-
this.modules = new Map();
|
|
172
|
-
}
|
|
173
|
-
static addModule(moduleBundle, moduleWorkspace) {
|
|
174
|
-
// If the module was already in a workspace, remove it from the old workspace.
|
|
175
|
-
Workspace.removeModule(moduleBundle);
|
|
176
|
-
const { workspace } = moduleWorkspace;
|
|
177
|
-
moduleBundle.moduleWorkspace = moduleWorkspace;
|
|
178
|
-
workspace.modules.set(moduleWorkspace.modulePath, moduleBundle);
|
|
179
|
-
for (const record of moduleBundle.astTree.result?.records || []) {
|
|
180
|
-
workspace.mutableRecordMap.set(record.record.key, record);
|
|
181
|
-
}
|
|
182
|
-
workspace.scheduleResolution();
|
|
183
|
-
}
|
|
184
|
-
static removeModule(moduleBundle) {
|
|
185
|
-
const { moduleWorkspace } = moduleBundle;
|
|
186
|
-
if (!moduleWorkspace) {
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const { workspace } = moduleWorkspace;
|
|
190
|
-
workspace.modules.delete(moduleWorkspace.modulePath);
|
|
191
|
-
for (const record of moduleBundle.astTree.result?.records || []) {
|
|
192
|
-
workspace.mutableRecordMap.delete(record.record.key);
|
|
193
|
-
}
|
|
194
|
-
moduleBundle.moduleWorkspace = undefined;
|
|
195
|
-
workspace.scheduleResolution();
|
|
196
|
-
}
|
|
197
|
-
parseModule(modulePath) {
|
|
198
|
-
const moduleBundle = this.modules.get(modulePath);
|
|
199
|
-
if (!moduleBundle) {
|
|
200
|
-
return {
|
|
201
|
-
result: null,
|
|
202
|
-
errors: [],
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
return moduleBundle.astTree;
|
|
206
|
-
}
|
|
207
|
-
scheduleResolution() {
|
|
208
|
-
if (this.scheduledResolution) {
|
|
209
|
-
clearTimeout(this.scheduledResolution.timeout);
|
|
210
|
-
}
|
|
211
|
-
const delayMilliseconds = 500;
|
|
212
|
-
const timeout = setTimeout(() => {
|
|
213
|
-
this.scheduledResolution = undefined;
|
|
214
|
-
this.resolve();
|
|
215
|
-
}, delayMilliseconds);
|
|
216
|
-
const scheduledResolution = {
|
|
217
|
-
timeout,
|
|
218
|
-
promise: new Promise((resolve) => {
|
|
219
|
-
scheduledResolution.callback = resolve;
|
|
220
|
-
}),
|
|
221
|
-
callback: (() => {
|
|
222
|
-
throw new Error("callback not set");
|
|
223
|
-
}),
|
|
224
|
-
};
|
|
225
|
-
this.scheduledResolution = scheduledResolution;
|
|
226
|
-
}
|
|
227
|
-
get resolutionDone() {
|
|
228
|
-
if (this.scheduledResolution) {
|
|
229
|
-
return this.scheduledResolution.promise;
|
|
230
|
-
}
|
|
231
|
-
return Promise.resolve();
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Synchronously performs type resolution (and validation).
|
|
235
|
-
* Stores the errors in every module bundle.
|
|
236
|
-
*/
|
|
237
|
-
resolve() {
|
|
238
|
-
const moduleSet = new ModuleSet(this);
|
|
239
|
-
for (const [modulePath, moduleBundle] of this.modules.entries()) {
|
|
240
|
-
const parseResult = moduleSet.parseAndResolve(modulePath);
|
|
241
|
-
moduleBundle.errors = parseResult.errors.map(errorToDiagnostic);
|
|
242
|
-
}
|
|
243
|
-
if (this.scheduledResolution) {
|
|
244
|
-
this.scheduledResolution.callback();
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
//# sourceMappingURL=language_server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"language_server.js","sourceRoot":"","sources":["../src/language_server.ts"],"names":[],"mappings":"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"}
|