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
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { expect } from "buckwheat";
|
|
2
|
+
import { describe, it } from "mocha";
|
|
3
|
+
import { parseSkirConfig } from "./config_parser.js";
|
|
4
|
+
describe("config_parser", () => {
|
|
5
|
+
describe("parseConfig", () => {
|
|
6
|
+
it("should parse valid config with single generator", async () => {
|
|
7
|
+
const yamlCode = `
|
|
8
|
+
generators:
|
|
9
|
+
- mod: "@example/generator"
|
|
10
|
+
config:
|
|
11
|
+
foo: bar
|
|
12
|
+
srcDir: src
|
|
13
|
+
`;
|
|
14
|
+
const result = await parseSkirConfig(yamlCode);
|
|
15
|
+
expect(result).toMatch({
|
|
16
|
+
skirConfig: {
|
|
17
|
+
generators: [
|
|
18
|
+
{
|
|
19
|
+
mod: "@example/generator",
|
|
20
|
+
config: { foo: "bar" },
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
srcDir: "src",
|
|
24
|
+
},
|
|
25
|
+
errors: [],
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
it("should parse valid config with multiple generators", async () => {
|
|
29
|
+
const yamlCode = `
|
|
30
|
+
generators:
|
|
31
|
+
- mod: "@example/gen1"
|
|
32
|
+
config: {}
|
|
33
|
+
- mod: "@example/gen2"
|
|
34
|
+
config:
|
|
35
|
+
setting: value
|
|
36
|
+
outDir: custom/skirout
|
|
37
|
+
`;
|
|
38
|
+
const result = await parseSkirConfig(yamlCode);
|
|
39
|
+
expect(result).toMatch({
|
|
40
|
+
skirConfig: {
|
|
41
|
+
generators: [
|
|
42
|
+
{ mod: "@example/gen1", config: {} },
|
|
43
|
+
{
|
|
44
|
+
mod: "@example/gen2",
|
|
45
|
+
config: { setting: "value" },
|
|
46
|
+
outDir: "custom/skirout",
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
errors: [],
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
it("should parse config with outDir array", async () => {
|
|
54
|
+
const yamlCode = `
|
|
55
|
+
generators:
|
|
56
|
+
- mod: "@example/generator"
|
|
57
|
+
config: {}
|
|
58
|
+
outDir:
|
|
59
|
+
- path/to/skirout
|
|
60
|
+
- another/skirout
|
|
61
|
+
`;
|
|
62
|
+
const result = await parseSkirConfig(yamlCode);
|
|
63
|
+
expect(result).toMatch({
|
|
64
|
+
skirConfig: {
|
|
65
|
+
generators: [
|
|
66
|
+
{
|
|
67
|
+
mod: "@example/generator",
|
|
68
|
+
config: {},
|
|
69
|
+
outDir: ["path/to/skirout", "another/skirout"],
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
errors: [],
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
it("should parse config without optional srcDir", async () => {
|
|
77
|
+
const yamlCode = `
|
|
78
|
+
generators:
|
|
79
|
+
- mod: "@example/generator"
|
|
80
|
+
config: {}
|
|
81
|
+
`;
|
|
82
|
+
const result = await parseSkirConfig(yamlCode);
|
|
83
|
+
expect(result).toMatch({
|
|
84
|
+
skirConfig: {
|
|
85
|
+
generators: [{ mod: "@example/generator", config: {} }],
|
|
86
|
+
},
|
|
87
|
+
errors: [],
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it("should return error for invalid YAML syntax", async () => {
|
|
91
|
+
const yamlCode = `
|
|
92
|
+
generators:
|
|
93
|
+
- mod: "@example/generator"
|
|
94
|
+
config:
|
|
95
|
+
invalid: [unclosed array
|
|
96
|
+
`;
|
|
97
|
+
const result = await parseSkirConfig(yamlCode);
|
|
98
|
+
expect(result).toMatch({
|
|
99
|
+
skirConfig: undefined,
|
|
100
|
+
errors: [
|
|
101
|
+
{
|
|
102
|
+
// message: "",
|
|
103
|
+
},
|
|
104
|
+
], // At least one error
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
it("should return error with line number for YAML syntax error", async () => {
|
|
108
|
+
const yamlCode = `generators:
|
|
109
|
+
- mod: test
|
|
110
|
+
bad indentation`;
|
|
111
|
+
const result = await parseSkirConfig(yamlCode);
|
|
112
|
+
expect(result).toMatch({
|
|
113
|
+
skirConfig: undefined,
|
|
114
|
+
errors: [
|
|
115
|
+
{
|
|
116
|
+
range: {
|
|
117
|
+
start: {
|
|
118
|
+
lineNumber: 3,
|
|
119
|
+
colNumber: 5,
|
|
120
|
+
offset: 30,
|
|
121
|
+
},
|
|
122
|
+
end: {
|
|
123
|
+
lineNumber: 3,
|
|
124
|
+
colNumber: 20,
|
|
125
|
+
offset: 45,
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
it("should return error for missing required field", async () => {
|
|
133
|
+
const yamlCode = `
|
|
134
|
+
generators:
|
|
135
|
+
- config: {}
|
|
136
|
+
`;
|
|
137
|
+
const result = await parseSkirConfig(yamlCode);
|
|
138
|
+
expect(result).toMatch({
|
|
139
|
+
skirConfig: undefined,
|
|
140
|
+
errors: [
|
|
141
|
+
{
|
|
142
|
+
message: /(required|expected)/i,
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
it("should return error for wrong type", async () => {
|
|
148
|
+
const yamlCode = `
|
|
149
|
+
generators: "not an array"
|
|
150
|
+
`;
|
|
151
|
+
const result = await parseSkirConfig(yamlCode);
|
|
152
|
+
expect(result).toMatch({
|
|
153
|
+
skirConfig: undefined,
|
|
154
|
+
errors: [{}], // At least one error
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
it("should return error with line/column for schema validation error", async () => {
|
|
158
|
+
const yamlCode = `
|
|
159
|
+
generators:
|
|
160
|
+
- mod: "@example/generator"
|
|
161
|
+
config: {}
|
|
162
|
+
outDir: invalid/path
|
|
163
|
+
`;
|
|
164
|
+
const result = await parseSkirConfig(yamlCode);
|
|
165
|
+
expect(result).toMatch({
|
|
166
|
+
skirConfig: undefined,
|
|
167
|
+
errors: [
|
|
168
|
+
{
|
|
169
|
+
message: 'Invalid string: must end with "/skirout"',
|
|
170
|
+
range: {
|
|
171
|
+
start: {
|
|
172
|
+
lineNumber: 5,
|
|
173
|
+
colNumber: 13,
|
|
174
|
+
offset: 70,
|
|
175
|
+
},
|
|
176
|
+
end: {
|
|
177
|
+
lineNumber: 5,
|
|
178
|
+
colNumber: 25,
|
|
179
|
+
offset: 82,
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
it("should return error for extra fields in strict schema", async () => {
|
|
187
|
+
const yamlCode = `
|
|
188
|
+
generators:
|
|
189
|
+
- mod: "@example/generator"
|
|
190
|
+
config: {}
|
|
191
|
+
extraField: value
|
|
192
|
+
`;
|
|
193
|
+
const result = await parseSkirConfig(yamlCode);
|
|
194
|
+
expect(result).toMatch({
|
|
195
|
+
skirConfig: undefined,
|
|
196
|
+
errors: [
|
|
197
|
+
{
|
|
198
|
+
message: /unrecognized/i,
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
it("should return error for invalid outDir pattern", async () => {
|
|
204
|
+
const yamlCode = `
|
|
205
|
+
generators:
|
|
206
|
+
- mod: "@example/generator"
|
|
207
|
+
config: {}
|
|
208
|
+
outDir: does/not/end/properly
|
|
209
|
+
`;
|
|
210
|
+
const result = await parseSkirConfig(yamlCode);
|
|
211
|
+
expect(result).toMatch({
|
|
212
|
+
skirConfig: undefined,
|
|
213
|
+
errors: [{}], // At least one error
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
it("should return error for invalid outDir array element", async () => {
|
|
217
|
+
const yamlCode = `
|
|
218
|
+
generators:
|
|
219
|
+
- mod: "@example/generator"
|
|
220
|
+
config: {}
|
|
221
|
+
outDir:
|
|
222
|
+
- valid/skirout
|
|
223
|
+
- invalid/path
|
|
224
|
+
`;
|
|
225
|
+
const result = await parseSkirConfig(yamlCode);
|
|
226
|
+
expect(result).toMatch({
|
|
227
|
+
skirConfig: undefined,
|
|
228
|
+
errors: [{}], // At least one error
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
it("should parse config with empty generators array", async () => {
|
|
232
|
+
const yamlCode = `
|
|
233
|
+
generators: []
|
|
234
|
+
`;
|
|
235
|
+
const result = await parseSkirConfig(yamlCode);
|
|
236
|
+
expect(result).toMatch({
|
|
237
|
+
skirConfig: {
|
|
238
|
+
generators: [],
|
|
239
|
+
},
|
|
240
|
+
errors: [],
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
it("should handle empty YAML document", async () => {
|
|
244
|
+
const yamlCode = "";
|
|
245
|
+
const result = await parseSkirConfig(yamlCode);
|
|
246
|
+
// Empty YAML parses as null/undefined, which fails schema validation
|
|
247
|
+
expect(result).toMatch({
|
|
248
|
+
skirConfig: undefined,
|
|
249
|
+
errors: [{}], // At least one error
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
it("should handle YAML with comments", async () => {
|
|
253
|
+
const yamlCode = `
|
|
254
|
+
# This is a comment
|
|
255
|
+
generators:
|
|
256
|
+
# Generator 1
|
|
257
|
+
- mod: "@example/generator"
|
|
258
|
+
config: {}
|
|
259
|
+
# Source directory
|
|
260
|
+
srcDir: src
|
|
261
|
+
`;
|
|
262
|
+
const result = await parseSkirConfig(yamlCode);
|
|
263
|
+
expect(result).toMatch({
|
|
264
|
+
skirConfig: {
|
|
265
|
+
generators: [
|
|
266
|
+
{
|
|
267
|
+
mod: "@example/generator",
|
|
268
|
+
config: {},
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
srcDir: "src",
|
|
272
|
+
},
|
|
273
|
+
errors: [],
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
it("should return multiple errors for multiple validation issues", async () => {
|
|
277
|
+
const yamlCode = `
|
|
278
|
+
generators:
|
|
279
|
+
- config: {}
|
|
280
|
+
- mod: "@example/gen"
|
|
281
|
+
extraField: invalid
|
|
282
|
+
`;
|
|
283
|
+
const result = await parseSkirConfig(yamlCode);
|
|
284
|
+
expect(result).toMatch({
|
|
285
|
+
skirConfig: undefined,
|
|
286
|
+
errors: [{}, {}], // At least two errors
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
it("should handle complex nested config objects", async () => {
|
|
290
|
+
const yamlCode = `
|
|
291
|
+
generators:
|
|
292
|
+
- mod: "@example/generator"
|
|
293
|
+
config:
|
|
294
|
+
nested:
|
|
295
|
+
deeply:
|
|
296
|
+
value: 123
|
|
297
|
+
array:
|
|
298
|
+
- item1
|
|
299
|
+
- item2
|
|
300
|
+
boolean: true
|
|
301
|
+
`;
|
|
302
|
+
const result = await parseSkirConfig(yamlCode);
|
|
303
|
+
expect(result).toMatch({
|
|
304
|
+
skirConfig: {
|
|
305
|
+
generators: [
|
|
306
|
+
{
|
|
307
|
+
mod: "@example/generator",
|
|
308
|
+
config: {
|
|
309
|
+
nested: {
|
|
310
|
+
deeply: {
|
|
311
|
+
value: 123,
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
array: ["item1", "item2"],
|
|
315
|
+
boolean: true,
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
],
|
|
319
|
+
},
|
|
320
|
+
errors: [],
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
it("should validate outDir ends with skirout", async () => {
|
|
324
|
+
const yamlCode = `
|
|
325
|
+
generators:
|
|
326
|
+
- mod: "@example/generator"
|
|
327
|
+
config: {}
|
|
328
|
+
outDir: path/to/skirout
|
|
329
|
+
`;
|
|
330
|
+
const result = await parseSkirConfig(yamlCode);
|
|
331
|
+
expect(result).toMatch({
|
|
332
|
+
skirConfig: {
|
|
333
|
+
generators: [
|
|
334
|
+
{
|
|
335
|
+
mod: "@example/generator",
|
|
336
|
+
config: {},
|
|
337
|
+
outDir: "path/to/skirout",
|
|
338
|
+
},
|
|
339
|
+
],
|
|
340
|
+
},
|
|
341
|
+
errors: [],
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
it("should handle YAML with duplicate keys as warning/error", async () => {
|
|
345
|
+
const yamlCode = `
|
|
346
|
+
generators:
|
|
347
|
+
- mod: "@example/generator"
|
|
348
|
+
config: {}
|
|
349
|
+
mod: "@another/generator"
|
|
350
|
+
`;
|
|
351
|
+
const result = await parseSkirConfig(yamlCode);
|
|
352
|
+
// YAML library should detect duplicate keys
|
|
353
|
+
// The exact behavior depends on yaml library settings
|
|
354
|
+
if (result.errors.length > 0) {
|
|
355
|
+
expect(result.skirConfig).toMatch(undefined);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
it("should do validation on generator's config if known", async () => {
|
|
359
|
+
const yamlCode = `
|
|
360
|
+
generators:
|
|
361
|
+
- mod: skir-typescript-gen
|
|
362
|
+
outDir: ./skirout
|
|
363
|
+
config:
|
|
364
|
+
importPathExtension: .jss
|
|
365
|
+
`;
|
|
366
|
+
const result = await parseSkirConfig(yamlCode);
|
|
367
|
+
expect(result).toMatch({
|
|
368
|
+
errors: [
|
|
369
|
+
{
|
|
370
|
+
range: {
|
|
371
|
+
start: {
|
|
372
|
+
lineNumber: 6,
|
|
373
|
+
colNumber: 28,
|
|
374
|
+
},
|
|
375
|
+
end: {
|
|
376
|
+
lineNumber: 6,
|
|
377
|
+
colNumber: 32,
|
|
378
|
+
},
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
],
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
//# sourceMappingURL=config_parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config_parser.test.js","sourceRoot":"","sources":["../src/config_parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { Doc, Result, Token } from "skir-internal";
|
|
2
|
-
export declare function
|
|
1
|
+
import type { Doc, MutableDoc, Result, Token } from "skir-internal";
|
|
2
|
+
export declare function parseDocComment(docComment: Token): Result<Doc>;
|
|
3
|
+
export declare function mergeDocs(docs: readonly Doc[]): MutableDoc;
|
|
3
4
|
//# sourceMappingURL=doc_comment_parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc_comment_parser.d.ts","sourceRoot":"","sources":["../src/doc_comment_parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,GAAG,
|
|
1
|
+
{"version":3,"file":"doc_comment_parser.d.ts","sourceRoot":"","sources":["../src/doc_comment_parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,GAAG,EAIH,UAAU,EAGV,MAAM,EAEN,KAAK,EACN,MAAM,eAAe,CAAC;AAEvB,wBAAgB,eAAe,CAAC,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAG9D;AAuOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,GAAG,UAAU,CAqB1D"}
|
|
@@ -1,29 +1,44 @@
|
|
|
1
1
|
import { assert } from "node:console";
|
|
2
|
-
export function
|
|
3
|
-
const parser = new
|
|
2
|
+
export function parseDocComment(docComment) {
|
|
3
|
+
const parser = new DocCommentParser(docComment);
|
|
4
4
|
return parser.parse();
|
|
5
5
|
}
|
|
6
|
-
class
|
|
7
|
-
constructor(
|
|
8
|
-
this.
|
|
6
|
+
class DocCommentParser {
|
|
7
|
+
constructor(docComment) {
|
|
8
|
+
this.docComment = docComment;
|
|
9
9
|
this.pieces = [];
|
|
10
10
|
this.errors = [];
|
|
11
11
|
this.currentText = "";
|
|
12
|
-
this.docCommentIndex = -1;
|
|
13
12
|
this.charIndex = -1;
|
|
14
|
-
|
|
13
|
+
const { text } = docComment;
|
|
14
|
+
if (text.startsWith("/// ")) {
|
|
15
|
+
this.content = text.slice(4);
|
|
16
|
+
}
|
|
17
|
+
else if (text.startsWith("///")) {
|
|
18
|
+
this.content = text.slice(3);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
throw new Error("Expected doc comment to start with ///");
|
|
22
|
+
}
|
|
23
|
+
this.charIndex = 0;
|
|
15
24
|
}
|
|
16
25
|
parse() {
|
|
17
|
-
|
|
18
|
-
this.parseCurrentDocComment();
|
|
19
|
-
}
|
|
26
|
+
this.parseDocComment();
|
|
20
27
|
// Add any remaining text
|
|
21
28
|
if (this.currentText.length > 0) {
|
|
22
29
|
this.pieces.push({ kind: "text", text: this.currentText });
|
|
23
30
|
}
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
.
|
|
31
|
+
const { pieces } = this;
|
|
32
|
+
const text = pieces
|
|
33
|
+
.map((p) => {
|
|
34
|
+
switch (p.kind) {
|
|
35
|
+
case "text":
|
|
36
|
+
return p.text;
|
|
37
|
+
case "reference":
|
|
38
|
+
return p.referenceRange.text;
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
.join("");
|
|
27
42
|
return {
|
|
28
43
|
result: {
|
|
29
44
|
text: text,
|
|
@@ -32,7 +47,7 @@ class DocCommentsParser {
|
|
|
32
47
|
errors: this.errors,
|
|
33
48
|
};
|
|
34
49
|
}
|
|
35
|
-
|
|
50
|
+
parseDocComment() {
|
|
36
51
|
// Matches unescaped [ or ], OR escaped [[ or ]]
|
|
37
52
|
const specialCharRegex = /\[\[|\]\]|\[|\]/g;
|
|
38
53
|
while (this.charIndex < this.content.length) {
|
|
@@ -76,15 +91,12 @@ class DocCommentsParser {
|
|
|
76
91
|
this.charIndex++;
|
|
77
92
|
}
|
|
78
93
|
}
|
|
79
|
-
// Add newline between comment lines (except after the last line)
|
|
80
|
-
if (this.docCommentIndex < this.docComments.length - 1) {
|
|
81
|
-
this.currentText += "\n";
|
|
82
|
-
}
|
|
83
94
|
}
|
|
84
95
|
parseReference() {
|
|
85
96
|
const { content, docComment } = this;
|
|
86
97
|
const leftBracketCharIndex = this.charIndex;
|
|
87
|
-
const
|
|
98
|
+
const contentOffset = docComment.text.length - content.length;
|
|
99
|
+
const startPosition = docComment.position + contentOffset + leftBracketCharIndex;
|
|
88
100
|
const rightBracketCharIndex = content.indexOf("]", leftBracketCharIndex);
|
|
89
101
|
// End position: right after the closing bracket or at end of the line if
|
|
90
102
|
// not found.
|
|
@@ -111,7 +123,8 @@ class DocCommentsParser {
|
|
|
111
123
|
const tokens = [];
|
|
112
124
|
while (this.charIndex < endCharIndex) {
|
|
113
125
|
const char = content[this.charIndex];
|
|
114
|
-
const
|
|
126
|
+
const contentOffset = docComment.text.length - content.length;
|
|
127
|
+
const position = docComment.position + contentOffset + this.charIndex;
|
|
115
128
|
const makeToken = (text) => ({
|
|
116
129
|
text: text,
|
|
117
130
|
originalText: text,
|
|
@@ -139,7 +152,8 @@ class DocCommentsParser {
|
|
|
139
152
|
}
|
|
140
153
|
else {
|
|
141
154
|
// Invalid character in reference (including whitespace)
|
|
142
|
-
const
|
|
155
|
+
const contentOffset = docComment.text.length - content.length;
|
|
156
|
+
const column = this.docComment.colNumber + contentOffset + this.charIndex;
|
|
143
157
|
hasError = true;
|
|
144
158
|
this.errors.push({
|
|
145
159
|
token: referenceRange,
|
|
@@ -149,25 +163,28 @@ class DocCommentsParser {
|
|
|
149
163
|
this.charIndex = endCharIndex;
|
|
150
164
|
}
|
|
151
165
|
}
|
|
152
|
-
const
|
|
166
|
+
const nameParts = hasError ? [] : this.parseNameParts(tokens);
|
|
153
167
|
return {
|
|
154
168
|
kind: "reference",
|
|
155
|
-
|
|
169
|
+
nameParts: nameParts,
|
|
156
170
|
absolute: tokens[0]?.text === ".",
|
|
157
171
|
referee: undefined,
|
|
158
172
|
docComment: this.docComment,
|
|
159
173
|
referenceRange: referenceRange,
|
|
160
174
|
};
|
|
161
175
|
}
|
|
162
|
-
|
|
163
|
-
const
|
|
176
|
+
parseNameParts(tokens) {
|
|
177
|
+
const nameParts = [];
|
|
164
178
|
let expect = "identifier or '.'";
|
|
165
179
|
for (const token of tokens) {
|
|
166
180
|
let expected;
|
|
167
181
|
if (/^[a-zA-Z]/.test(token.text)) {
|
|
168
182
|
expected = expect === "identifier or '.'" || expect === "identifier";
|
|
169
183
|
expect = "'.' or ']'";
|
|
170
|
-
|
|
184
|
+
nameParts.push({
|
|
185
|
+
token: token,
|
|
186
|
+
declaration: undefined,
|
|
187
|
+
});
|
|
171
188
|
}
|
|
172
189
|
else if (token.text === ".") {
|
|
173
190
|
expected = expect === "identifier or '.'" || expect === "'.' or ']'";
|
|
@@ -185,39 +202,37 @@ class DocCommentsParser {
|
|
|
185
202
|
return [];
|
|
186
203
|
}
|
|
187
204
|
if (token.text === "]") {
|
|
188
|
-
return
|
|
205
|
+
return nameParts;
|
|
189
206
|
}
|
|
190
207
|
}
|
|
191
208
|
// An error has already been pushed to signify the unterminated reference.
|
|
192
209
|
return [];
|
|
193
210
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
/// The text of the current doc comment being parsed.
|
|
199
|
-
get content() {
|
|
200
|
-
return this.docComment.text;
|
|
211
|
+
}
|
|
212
|
+
export function mergeDocs(docs) {
|
|
213
|
+
if (docs.length <= 0) {
|
|
214
|
+
return EMPTY_DOC;
|
|
201
215
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
throw new Error("Expected doc comment to start with ///");
|
|
214
|
-
}
|
|
215
|
-
this.charIndex = this.contentOffset;
|
|
216
|
-
return true;
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
return false;
|
|
216
|
+
// Insert '\n' between each doc comment (== line)
|
|
217
|
+
const text = docs.map((d) => d.text).join("\n");
|
|
218
|
+
const pieces = [];
|
|
219
|
+
for (let i = 0; i < docs.length; ++i) {
|
|
220
|
+
const doc = docs[i];
|
|
221
|
+
if (i !== 0) {
|
|
222
|
+
pieces.push({
|
|
223
|
+
kind: "text",
|
|
224
|
+
text: "\n",
|
|
225
|
+
});
|
|
220
226
|
}
|
|
227
|
+
doc.pieces.forEach((p) => pieces.push(p));
|
|
221
228
|
}
|
|
229
|
+
return {
|
|
230
|
+
text: text,
|
|
231
|
+
pieces: pieces,
|
|
232
|
+
};
|
|
222
233
|
}
|
|
234
|
+
const EMPTY_DOC = {
|
|
235
|
+
text: "",
|
|
236
|
+
pieces: [],
|
|
237
|
+
};
|
|
223
238
|
//# sourceMappingURL=doc_comment_parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc_comment_parser.js","sourceRoot":"","sources":["../src/doc_comment_parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"doc_comment_parser.js","sourceRoot":"","sources":["../src/doc_comment_parser.ts"],"names":[],"mappings":"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"}
|