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.
Files changed (60) hide show
  1. package/dist/casing.d.ts.map +1 -1
  2. package/dist/casing.js +4 -1
  3. package/dist/casing.js.map +1 -1
  4. package/dist/casing.test.js +35 -1
  5. package/dist/casing.test.js.map +1 -1
  6. package/dist/compatibility_checker.test.js +2 -2
  7. package/dist/compiler.js +23 -42
  8. package/dist/compiler.js.map +1 -1
  9. package/dist/config.d.ts +2 -2
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +5 -10
  12. package/dist/config.js.map +1 -1
  13. package/dist/config_parser.d.ts +25 -0
  14. package/dist/config_parser.d.ts.map +1 -0
  15. package/dist/config_parser.js +125 -0
  16. package/dist/config_parser.js.map +1 -0
  17. package/dist/config_parser.test.d.ts +2 -0
  18. package/dist/config_parser.test.d.ts.map +1 -0
  19. package/dist/config_parser.test.js +386 -0
  20. package/dist/config_parser.test.js.map +1 -0
  21. package/dist/doc_comment_parser.d.ts +3 -2
  22. package/dist/doc_comment_parser.d.ts.map +1 -1
  23. package/dist/doc_comment_parser.js +67 -52
  24. package/dist/doc_comment_parser.js.map +1 -1
  25. package/dist/doc_comment_parser.test.js +86 -154
  26. package/dist/doc_comment_parser.test.js.map +1 -1
  27. package/dist/error_renderer.d.ts +4 -0
  28. package/dist/error_renderer.d.ts.map +1 -1
  29. package/dist/error_renderer.js +21 -0
  30. package/dist/error_renderer.js.map +1 -1
  31. package/dist/module_set.d.ts.map +1 -1
  32. package/dist/module_set.js +29 -12
  33. package/dist/module_set.js.map +1 -1
  34. package/dist/module_set.test.js +318 -173
  35. package/dist/module_set.test.js.map +1 -1
  36. package/dist/parser.d.ts.map +1 -1
  37. package/dist/parser.js +10 -10
  38. package/dist/parser.js.map +1 -1
  39. package/dist/project_initializer.js +9 -1
  40. package/dist/project_initializer.js.map +1 -1
  41. package/dist/tokenizer.d.ts +7 -1
  42. package/dist/tokenizer.d.ts.map +1 -1
  43. package/dist/tokenizer.js +12 -0
  44. package/dist/tokenizer.js.map +1 -1
  45. package/package.json +10 -5
  46. package/src/casing.ts +6 -1
  47. package/src/compiler.ts +26 -40
  48. package/src/config.ts +10 -15
  49. package/src/config_parser.ts +169 -0
  50. package/src/doc_comment_parser.ts +76 -52
  51. package/src/error_renderer.ts +34 -0
  52. package/src/module_set.ts +31 -15
  53. package/src/parser.ts +16 -10
  54. package/src/project_initializer.ts +9 -1
  55. package/src/tokenizer.ts +20 -2
  56. package/dist/language_server.d.ts +0 -15
  57. package/dist/language_server.d.ts.map +0 -1
  58. package/dist/language_server.js +0 -248
  59. package/dist/language_server.js.map +0 -1
  60. 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
- nameChain: readonly Token[],
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 = nameChain[0]!;
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 (nameChain.length === 1) {
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
- return tryResolveReference(ref, nameChain.slice(1), match);
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
- const newNameChain = nameChain.slice(
885
- match.kind === "import" ? 0 : 1,
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 { nameChain } = reference;
951
- if (nameChain.length <= 0) {
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, nameChain, scope)) {
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 { parseDocComments } from "./doc_comment_parser.js";
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 { tokens, modulePath, sourceCode } = moduleTokens;
37
+ const { modulePath, sourceCode } = moduleTokens;
37
38
  const errors: SkirError[] = [];
38
- const it = new TokenIterator(tokens, errors);
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 = parseDoc(it);
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 parseDoc(it: TokenIterator): Doc {
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
- const result = parseDocComments(docComments);
1056
- result.errors.forEach((e) => it.errors.push(e));
1057
- return result.result;
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
- private readonly tokens: readonly Token[],
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 = `struct Point {
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
- /// Includes regular comments and doc comments.
13
+ /** Includes regular comments and doc comments. */
12
14
  readonly tokens: readonly Token[];
13
- /// Includes both kinds of comments.
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"}
@@ -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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"}