skir 1.1.5 → 1.1.7
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/completion_helper.d.ts +12 -0
- package/dist/completion_helper.d.ts.map +1 -0
- package/dist/completion_helper.js +34 -0
- package/dist/completion_helper.js.map +1 -0
- package/dist/formatter.js +7 -1
- package/dist/formatter.js.map +1 -1
- package/dist/module_set.d.ts +6 -1
- package/dist/module_set.d.ts.map +1 -1
- package/dist/module_set.js +89 -51
- package/dist/module_set.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +109 -69
- package/dist/parser.js.map +1 -1
- package/dist/tokenizer.d.ts +3 -1
- package/dist/tokenizer.d.ts.map +1 -1
- package/dist/tokenizer.js +35 -1
- package/dist/tokenizer.js.map +1 -1
- package/package.json +7 -4
- package/src/completion_helper.ts +58 -0
- package/src/formatter.ts +8 -1
- package/src/module_set.ts +122 -56
- package/src/parser.ts +133 -77
- package/src/tokenizer.ts +36 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Doc } from "skir-internal";
|
|
2
|
+
import { ModuleSet } from "./module_set.js";
|
|
3
|
+
export interface CompletionItems {
|
|
4
|
+
readonly placeholderStartPos: number;
|
|
5
|
+
readonly placeholderEndPos: number;
|
|
6
|
+
readonly items: ReadonlyArray<{
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly doc?: Doc;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export declare function provideCompletionItems(modulePath: string, moduleContent: string, position: number, oldModuleSet: ModuleSet): CompletionItems | null;
|
|
12
|
+
//# sourceMappingURL=completion_helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion_helper.d.ts","sourceRoot":"","sources":["../src/completion_helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;QAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,SAAS,GACtB,eAAe,GAAG,IAAI,CAwCxB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ModuleSet } from "./module_set.js";
|
|
2
|
+
export function provideCompletionItems(modulePath, moduleContent, position, oldModuleSet) {
|
|
3
|
+
const modulePathToContent = new Map();
|
|
4
|
+
for (const [modulePath, module] of oldModuleSet.modules) {
|
|
5
|
+
modulePathToContent.set(modulePath, module.result.sourceCode);
|
|
6
|
+
}
|
|
7
|
+
modulePathToContent.set(modulePath, moduleContent);
|
|
8
|
+
const moduleResult = ModuleSet.compileForCompletion(modulePath, position, modulePathToContent, oldModuleSet);
|
|
9
|
+
for (const error of moduleResult.errors) {
|
|
10
|
+
const { token } = error;
|
|
11
|
+
let startPosition;
|
|
12
|
+
let endPosition;
|
|
13
|
+
if (token.text.startsWith('"') || token.text.startsWith("'")) {
|
|
14
|
+
startPosition = token.position + 1;
|
|
15
|
+
endPosition = token.position + token.originalText.length - 1;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
startPosition = token.position;
|
|
19
|
+
endPosition =
|
|
20
|
+
token.position + (token.text === "..." ? 0 : token.originalText.length);
|
|
21
|
+
}
|
|
22
|
+
if (startPosition <= position &&
|
|
23
|
+
position <= endPosition &&
|
|
24
|
+
error.expectedNames?.length) {
|
|
25
|
+
return {
|
|
26
|
+
placeholderStartPos: startPosition,
|
|
27
|
+
placeholderEndPos: endPosition,
|
|
28
|
+
items: error.expectedNames,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=completion_helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion_helper.js","sourceRoot":"","sources":["../src/completion_helper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAW5C,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,aAAqB,EACrB,QAAgB,EAChB,YAAuB;IAEvB,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtD,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACxD,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC;IACD,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAEnD,MAAM,YAAY,GAAG,SAAS,CAAC,oBAAoB,CACjD,UAAU,EACV,QAAQ,EACR,mBAAmB,EACnB,YAAY,CACb,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QACxB,IAAI,aAAqB,CAAC;QAC1B,IAAI,WAAmB,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7D,aAAa,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;YACnC,WAAW,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC/B,WAAW;gBACT,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5E,CAAC;QACD,IACE,aAAa,IAAI,QAAQ;YACzB,QAAQ,IAAI,WAAW;YACvB,KAAK,CAAC,aAAa,EAAE,MAAM,EAC3B,CAAC;YACD,OAAO;gBACL,mBAAmB,EAAE,aAAa;gBAClC,iBAAiB,EAAE,WAAW;gBAC9B,KAAK,EAAE,KAAK,CAAC,aAAa;aAC3B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/formatter.js
CHANGED
|
@@ -90,6 +90,13 @@ nextNonComment, context) {
|
|
|
90
90
|
(next.text === ")" && topOfStack().inlineRecordInBracket)) {
|
|
91
91
|
context.indentStack.pop();
|
|
92
92
|
}
|
|
93
|
+
// Reset context when we encounter a semicolon, even if the next token is a
|
|
94
|
+
// comment. Without this, the "in-value" context from a const declaration
|
|
95
|
+
// leaks past comments and into subsequent declarations, causing spurious
|
|
96
|
+
// trailing commas.
|
|
97
|
+
if (token.text === ";") {
|
|
98
|
+
context.context = null;
|
|
99
|
+
}
|
|
93
100
|
if (isComment(token)) {
|
|
94
101
|
return oneOrTwoLineBreaks(token, next);
|
|
95
102
|
}
|
|
@@ -127,7 +134,6 @@ nextNonComment, context) {
|
|
|
127
134
|
return next.text === "{" ? " " : "";
|
|
128
135
|
}
|
|
129
136
|
else if (token.text === ";") {
|
|
130
|
-
context.context = null;
|
|
131
137
|
return oneOrTwoLineBreaks(token, next);
|
|
132
138
|
}
|
|
133
139
|
else if (token.text === "}") {
|
package/dist/formatter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}
|
package/dist/module_set.d.ts
CHANGED
|
@@ -9,8 +9,13 @@ import { type Method, type Module, type RecordKey, type RecordLocation, type Res
|
|
|
9
9
|
export declare class ModuleSet {
|
|
10
10
|
private readonly modulePathToContent;
|
|
11
11
|
private readonly parseMode;
|
|
12
|
+
private readonly completionMode?;
|
|
12
13
|
static compile(modulePathToContent: ReadonlyMap<string, string>, cache?: ModuleSet, parseMode?: "strict" | "lenient"): ModuleSet;
|
|
13
|
-
|
|
14
|
+
static compileForCompletion(currentModulePath: string, currentPosition: number, modulePathToContent: ReadonlyMap<string, string>, cache?: ModuleSet): Result<Module>;
|
|
15
|
+
constructor(modulePathToContent: ReadonlyMap<string, string>, cache: ModuleSet | undefined, parseMode: "strict" | "lenient", completionMode?: {
|
|
16
|
+
readonly modulePath: string;
|
|
17
|
+
readonly position: number;
|
|
18
|
+
} | undefined);
|
|
14
19
|
private parseAndResolve;
|
|
15
20
|
/** Called by `parseAndResolve` when the module is not in the map already. */
|
|
16
21
|
private doParseAndResolve;
|
package/dist/module_set.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module_set.d.ts","sourceRoot":"","sources":["../src/module_set.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"module_set.d.ts","sourceRoot":"","sources":["../src/module_set.ts"],"names":[],"mappings":"AACA,OAAO,EASL,KAAK,MAAM,EACX,KAAK,MAAM,EAcX,KAAK,SAAS,EACd,KAAK,cAAc,EAInB,KAAK,MAAM,EACX,KAAK,SAAS,EAKf,MAAM,eAAe,CAAC;AAUvB;;;;;;GAMG;AACH,qBAAa,SAAS;IA0BlB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IA5BlC,MAAM,CAAC,OAAO,CACZ,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAChD,KAAK,CAAC,EAAE,SAAS,EACjB,SAAS,GAAE,QAAQ,GAAG,SAAoB,GACzC,SAAS;IAIZ,MAAM,CAAC,oBAAoB,CACzB,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAChD,KAAK,CAAC,EAAE,SAAS,GAChB,MAAM,CAAC,MAAM,CAAC;gBAYE,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACjE,KAAK,EAAE,SAAS,GAAG,SAAS,EACX,SAAS,EAAE,QAAQ,GAAG,SAAS,EAC/B,cAAc,CAAC,EAAE;QAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,YAAA;IAkBH,OAAO,CAAC,eAAe;IAevB,6EAA6E;IAC7E,OAAO,CAAC,iBAAiB;IAwTzB,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,eAAe;IAkCvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA6FzB,OAAO,CAAC,gBAAgB;IAyExB,OAAO,CAAC,sBAAsB;IAqF9B,OAAO,CAAC,oBAAoB;IAkI5B,OAAO,CAAC,cAAc;IAqCtB,2EAA2E;IAC3E,OAAO,CAAC,oBAAoB;IAkL5B,QAAQ,IAAI,kBAAkB;IAyE9B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAGxD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAMpE,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAM5D,IAAI,SAAS,IAAI,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC,CAEtD;IAED,IAAI,MAAM,IAAI,SAAS,SAAS,EAAE,CAEjC;IAED,IAAI,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAEjD;CACF;AA0YD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;CACvC"}
|
package/dist/module_set.js
CHANGED
|
@@ -14,15 +14,31 @@ export class ModuleSet {
|
|
|
14
14
|
static compile(modulePathToContent, cache, parseMode = "strict") {
|
|
15
15
|
return new ModuleSet(modulePathToContent, cache, parseMode);
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
static compileForCompletion(currentModulePath, currentPosition, modulePathToContent, cache) {
|
|
18
|
+
if (!modulePathToContent.has(currentModulePath)) {
|
|
19
|
+
throw new Error(`Not found: ${currentModulePath}`);
|
|
20
|
+
}
|
|
21
|
+
const moduleSet = new ModuleSet(modulePathToContent, cache, "lenient", {
|
|
22
|
+
modulePath: currentModulePath,
|
|
23
|
+
position: currentPosition,
|
|
24
|
+
});
|
|
25
|
+
return moduleSet.modules.get(currentModulePath);
|
|
26
|
+
}
|
|
27
|
+
constructor(modulePathToContent, cache, parseMode, completionMode) {
|
|
18
28
|
this.modulePathToContent = modulePathToContent;
|
|
19
29
|
this.parseMode = parseMode;
|
|
30
|
+
this.completionMode = completionMode;
|
|
20
31
|
this.moduleBundles = new Map();
|
|
21
32
|
this.registry = new DeclarationRegistry();
|
|
22
33
|
this.cache = cache
|
|
23
34
|
? new Cache(modulePathToContent, cache.moduleBundles)
|
|
24
35
|
: undefined;
|
|
25
|
-
|
|
36
|
+
// In completion mode, no need to recompile modules which are not dependencies of
|
|
37
|
+
// the current module.
|
|
38
|
+
const modulePaths = completionMode
|
|
39
|
+
? [completionMode.modulePath]
|
|
40
|
+
: modulePathToContent.keys();
|
|
41
|
+
for (const modulePath of modulePaths) {
|
|
26
42
|
this.parseAndResolve(modulePath, new Set());
|
|
27
43
|
}
|
|
28
44
|
this.finalizationResult = this.finalize();
|
|
@@ -51,7 +67,7 @@ export class ModuleSet {
|
|
|
51
67
|
const moduleCacheResult = this.cache?.getModuleCacheResult(modulePath) ?? { kind: "no-cache" };
|
|
52
68
|
switch (moduleCacheResult.kind) {
|
|
53
69
|
case "no-cache": {
|
|
54
|
-
moduleTokens = tokenizeModule(moduleContent, modulePath);
|
|
70
|
+
moduleTokens = tokenizeModule(moduleContent, modulePath, this.completionMode);
|
|
55
71
|
break;
|
|
56
72
|
}
|
|
57
73
|
case "module-tokens": {
|
|
@@ -110,7 +126,7 @@ export class ModuleSet {
|
|
|
110
126
|
errors.push({
|
|
111
127
|
token: declaration.modulePath,
|
|
112
128
|
message: "Module not found",
|
|
113
|
-
expectedNames: suggestModulePaths(unquoteAndUnescape(declaration.modulePath.text), modulePath, this.modulePathToContent),
|
|
129
|
+
expectedNames: suggestModulePaths(unquoteAndUnescape(declaration.modulePath.text), modulePath, this.modulePathToContent.keys()),
|
|
114
130
|
});
|
|
115
131
|
}
|
|
116
132
|
else if (otherModule.tokens.errors.length !== 0 ||
|
|
@@ -199,7 +215,7 @@ export class ModuleSet {
|
|
|
199
215
|
};
|
|
200
216
|
}
|
|
201
217
|
}
|
|
202
|
-
if (errors.length) {
|
|
218
|
+
if (errors.length && !this.completionMode) {
|
|
203
219
|
return moduleBundle;
|
|
204
220
|
}
|
|
205
221
|
// We can't merge these 3 loops into a single one, each operation must run
|
|
@@ -244,43 +260,49 @@ export class ModuleSet {
|
|
|
244
260
|
// Resolve the references in the doc comments of the record.
|
|
245
261
|
this.resolveDocReferences(record, module, errors);
|
|
246
262
|
}
|
|
263
|
+
const resolveTopLevelTypeAndValidate = (type) => {
|
|
264
|
+
const resolvedType = typeResolver.resolve(type, "top-level");
|
|
265
|
+
if (resolvedType) {
|
|
266
|
+
this.validateArrayKeys(resolvedType, errors);
|
|
267
|
+
}
|
|
268
|
+
return resolvedType;
|
|
269
|
+
};
|
|
247
270
|
// Resolve every request/response type of every method in the module.
|
|
248
271
|
// Store the result in the Method object.
|
|
249
272
|
for (const method of module.methods) {
|
|
250
|
-
{
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
this.validateArrayKeys(requestType, errors);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
{
|
|
259
|
-
const response = method.unresolvedResponseType;
|
|
260
|
-
const responseType = typeResolver.resolve(response, "top-level");
|
|
261
|
-
method.responseType = responseType;
|
|
262
|
-
if (responseType) {
|
|
263
|
-
this.validateArrayKeys(responseType, errors);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
273
|
+
const { unresolvedRequestType, unresolvedResponseType } = method;
|
|
274
|
+
// Resolve request type.
|
|
275
|
+
method.requestType = resolveTopLevelTypeAndValidate(unresolvedRequestType);
|
|
276
|
+
// Resolve response type.
|
|
277
|
+
method.responseType = resolveTopLevelTypeAndValidate(unresolvedResponseType);
|
|
266
278
|
const { number } = method;
|
|
267
279
|
moduleBundle.registry.pushNumberMethod(number, method);
|
|
268
280
|
// Resolve the references in the doc comments of the method.
|
|
269
281
|
this.resolveDocReferences(method, module, errors);
|
|
270
282
|
}
|
|
283
|
+
for (const method of module.brokenMethods) {
|
|
284
|
+
const { unresolvedRequestType, unresolvedResponseType } = method;
|
|
285
|
+
resolveTopLevelTypeAndValidate(unresolvedRequestType);
|
|
286
|
+
if (unresolvedResponseType) {
|
|
287
|
+
resolveTopLevelTypeAndValidate(unresolvedResponseType);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
271
290
|
// Resolve every constant type. Store the result in the constant object.
|
|
272
291
|
for (const constant of module.constants) {
|
|
273
292
|
const { unresolvedType } = constant;
|
|
274
|
-
const type =
|
|
293
|
+
const type = resolveTopLevelTypeAndValidate(unresolvedType);
|
|
275
294
|
constant.type = type;
|
|
276
295
|
if (type) {
|
|
277
|
-
this.validateArrayKeys(type, errors);
|
|
278
296
|
constant.valueAsDenseJson = //
|
|
279
297
|
this.valueToDenseJson(constant.value, type, errors);
|
|
280
298
|
}
|
|
281
299
|
// Resolve the references in the doc comments of the constant.
|
|
282
300
|
this.resolveDocReferences(constant, module, errors);
|
|
283
301
|
}
|
|
302
|
+
for (const constant of module.brokenConstants) {
|
|
303
|
+
const { unresolvedType } = constant;
|
|
304
|
+
resolveTopLevelTypeAndValidate(unresolvedType);
|
|
305
|
+
}
|
|
284
306
|
ensureAllImportsAreUsed(module, usedImports, errors);
|
|
285
307
|
this.registry.mergeFrom(moduleBundle.registry);
|
|
286
308
|
return moduleBundle;
|
|
@@ -510,13 +532,17 @@ export class ModuleSet {
|
|
|
510
532
|
}
|
|
511
533
|
const json = Array(expectedStruct.numSlotsInclRemovedNumbers).fill(0);
|
|
512
534
|
let allGood = true;
|
|
513
|
-
|
|
514
|
-
|
|
535
|
+
const fieldNameTokens = Object.values(value.entries)
|
|
536
|
+
.map((e) => e.name)
|
|
537
|
+
.concat(value.orphanNames);
|
|
538
|
+
const fieldNames = new Set(fieldNameTokens.map((t) => t.text));
|
|
539
|
+
for (const fieldName of fieldNameTokens) {
|
|
540
|
+
const field = expectedStruct.nameToDeclaration[fieldName.text];
|
|
515
541
|
if (field?.kind !== "field") {
|
|
516
542
|
errors.push({
|
|
517
|
-
token:
|
|
543
|
+
token: fieldName,
|
|
518
544
|
message: `Field not found in struct ${expectedStruct.name.text}`,
|
|
519
|
-
expectedNames: declarationsToExpectedNames(expectedStruct.nameToDeclaration, (d) => d.kind === "field"),
|
|
545
|
+
expectedNames: declarationsToExpectedNames(expectedStruct.nameToDeclaration, (d) => d.kind === "field" && !fieldNames.has(d.name.text)),
|
|
520
546
|
});
|
|
521
547
|
allGood = false;
|
|
522
548
|
continue;
|
|
@@ -606,8 +632,24 @@ export class ModuleSet {
|
|
|
606
632
|
// · 'kind' must match the name of one of the wrapper variants defined in
|
|
607
633
|
// the enum
|
|
608
634
|
// · 'value' must match the type of the wrapper variant
|
|
609
|
-
const entries =
|
|
635
|
+
const { entries } = value;
|
|
610
636
|
const kindEntry = entries.kind;
|
|
637
|
+
const enumValue = entries.value;
|
|
638
|
+
const nameTokens = Object.values(entries)
|
|
639
|
+
.map((e) => e.name)
|
|
640
|
+
.concat(value.orphanNames);
|
|
641
|
+
for (const nameToken of nameTokens) {
|
|
642
|
+
if (nameToken.text === "kind" || nameToken.text === "value") {
|
|
643
|
+
continue;
|
|
644
|
+
}
|
|
645
|
+
const expectedNames = (kindEntry ? [] : [{ name: "kind" }]).concat(enumValue ? [] : [{ name: "value" }]);
|
|
646
|
+
errors.push({
|
|
647
|
+
token: nameToken,
|
|
648
|
+
message: "Extraneous entry",
|
|
649
|
+
expectedNames: expectedNames,
|
|
650
|
+
});
|
|
651
|
+
return undefined;
|
|
652
|
+
}
|
|
611
653
|
if (!kindEntry) {
|
|
612
654
|
errors.push({
|
|
613
655
|
token: token,
|
|
@@ -615,7 +657,6 @@ export class ModuleSet {
|
|
|
615
657
|
});
|
|
616
658
|
return undefined;
|
|
617
659
|
}
|
|
618
|
-
delete entries.kind;
|
|
619
660
|
const kindValueToken = kindEntry.value.token;
|
|
620
661
|
if (kindEntry.value.kind !== "literal" ||
|
|
621
662
|
!isStringLiteral(kindValueToken.text)) {
|
|
@@ -625,9 +666,9 @@ export class ModuleSet {
|
|
|
625
666
|
});
|
|
626
667
|
return undefined;
|
|
627
668
|
}
|
|
628
|
-
const
|
|
629
|
-
const
|
|
630
|
-
if (
|
|
669
|
+
const variantName = unquoteAndUnescape(kindValueToken.text);
|
|
670
|
+
const variant = expectedEnum.nameToDeclaration[variantName];
|
|
671
|
+
if (variant?.kind !== "field") {
|
|
631
672
|
errors.push({
|
|
632
673
|
token: kindValueToken,
|
|
633
674
|
message: `Variant not found in enum ${expectedEnum.name.text}`,
|
|
@@ -635,14 +676,13 @@ export class ModuleSet {
|
|
|
635
676
|
});
|
|
636
677
|
return undefined;
|
|
637
678
|
}
|
|
638
|
-
if (!
|
|
679
|
+
if (!variant.type) {
|
|
639
680
|
errors.push({
|
|
640
681
|
token: kindValueToken,
|
|
641
|
-
message: "Refers to a constant
|
|
682
|
+
message: "Refers to a constant variant",
|
|
642
683
|
});
|
|
643
684
|
return undefined;
|
|
644
685
|
}
|
|
645
|
-
const enumValue = entries.value;
|
|
646
686
|
if (!enumValue) {
|
|
647
687
|
errors.push({
|
|
648
688
|
token: token,
|
|
@@ -650,24 +690,14 @@ export class ModuleSet {
|
|
|
650
690
|
});
|
|
651
691
|
return undefined;
|
|
652
692
|
}
|
|
653
|
-
delete entries.value;
|
|
654
693
|
const valueJson = //
|
|
655
|
-
this.valueToDenseJson(enumValue.value,
|
|
694
|
+
this.valueToDenseJson(enumValue.value, variant.type, errors);
|
|
656
695
|
if (valueJson === undefined) {
|
|
657
696
|
return undefined;
|
|
658
697
|
}
|
|
659
|
-
const extraEntries = Object.values(entries);
|
|
660
|
-
if (extraEntries.length !== 0) {
|
|
661
|
-
const extraEntry = extraEntries[0];
|
|
662
|
-
errors.push({
|
|
663
|
-
token: extraEntry.name,
|
|
664
|
-
message: "Extraneous entry",
|
|
665
|
-
});
|
|
666
|
-
return undefined;
|
|
667
|
-
}
|
|
668
698
|
value.record = expectedEnum;
|
|
669
699
|
// Return an array of length 2.
|
|
670
|
-
return [
|
|
700
|
+
return [variant.number, valueJson];
|
|
671
701
|
}
|
|
672
702
|
else {
|
|
673
703
|
// The value is neither a string nor an object. It can't be of enum type.
|
|
@@ -1106,7 +1136,9 @@ class TypeResolver {
|
|
|
1106
1136
|
const name = namePart.text;
|
|
1107
1137
|
let newIt = it.nameToDeclaration[name];
|
|
1108
1138
|
if (newIt === undefined) {
|
|
1109
|
-
errors.push(makeCannotFindNameError(namePart, declarationsToExpectedNames(it.nameToDeclaration, (d) => d.kind === "record" ||
|
|
1139
|
+
errors.push(makeCannotFindNameError(namePart, declarationsToExpectedNames(it.nameToDeclaration, (d) => d.kind === "record" ||
|
|
1140
|
+
(i === 0 && d.kind === "import-alias") ||
|
|
1141
|
+
(i === 0 && d.kind === "import"))));
|
|
1110
1142
|
return undefined;
|
|
1111
1143
|
}
|
|
1112
1144
|
else if (newIt.kind === "record") {
|
|
@@ -1173,7 +1205,6 @@ class TypeResolver {
|
|
|
1173
1205
|
}
|
|
1174
1206
|
class Cache {
|
|
1175
1207
|
constructor(modulePathToNewContent, modulePathToOldBundle) {
|
|
1176
|
-
this.modulePathToOldBundle = modulePathToOldBundle;
|
|
1177
1208
|
this.modulePathToCacheResult = new Map();
|
|
1178
1209
|
const unchangedModulePaths = new Set();
|
|
1179
1210
|
for (const [modulePath, newContent] of modulePathToNewContent) {
|
|
@@ -1342,9 +1373,11 @@ function suggestModulePaths(typedPath, originModulePath, modulePathToContent) {
|
|
|
1342
1373
|
}
|
|
1343
1374
|
const originBaseDir = Paths.dirname(originModulePath).replace(/\\/g, "/");
|
|
1344
1375
|
const suggestions = new Set();
|
|
1345
|
-
for (const path of modulePathToContent
|
|
1376
|
+
for (const path of modulePathToContent) {
|
|
1346
1377
|
if (!path.startsWith(absolutePrefix))
|
|
1347
1378
|
continue;
|
|
1379
|
+
if (path === originModulePath)
|
|
1380
|
+
continue;
|
|
1348
1381
|
const remaining = path.slice(absolutePrefix.length);
|
|
1349
1382
|
const slashIndex = remaining.indexOf("/");
|
|
1350
1383
|
// If there is a sub-path after the matched prefix, collapse to the next
|
|
@@ -1367,7 +1400,12 @@ function suggestModulePaths(typedPath, originModulePath, modulePathToContent) {
|
|
|
1367
1400
|
if (!rel.startsWith(".")) {
|
|
1368
1401
|
rel = "./" + rel;
|
|
1369
1402
|
}
|
|
1370
|
-
|
|
1403
|
+
const suggestion = isDir ? rel + "/" : rel;
|
|
1404
|
+
// When the user typed "../", don't suggest "./" — they would have typed
|
|
1405
|
+
// "./" directly if they wanted files in their own directory.
|
|
1406
|
+
if (typedPath.startsWith("../") && suggestion === "./")
|
|
1407
|
+
continue;
|
|
1408
|
+
suggestions.add(suggestion);
|
|
1371
1409
|
}
|
|
1372
1410
|
else {
|
|
1373
1411
|
suggestions.add(absoluteSuggestion);
|