@typespec/compiler 1.10.0-dev.1 → 1.10.0-dev.11
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/generated-defs/TypeSpec.Prototypes.ts-test.js +1 -1
- package/dist/generated-defs/TypeSpec.Prototypes.ts-test.js.map +1 -1
- package/dist/generated-defs/TypeSpec.ts-test.js +1 -1
- package/dist/generated-defs/TypeSpec.ts-test.js.map +1 -1
- package/dist/manifest.js +2 -2
- package/dist/src/core/binder.d.ts.map +1 -1
- package/dist/src/core/binder.js +33 -19
- package/dist/src/core/binder.js.map +1 -1
- package/dist/src/core/checker.d.ts.map +1 -1
- package/dist/src/core/checker.js +594 -67
- package/dist/src/core/checker.js.map +1 -1
- package/dist/src/core/cli/actions/info/emitter-options.d.ts +40 -0
- package/dist/src/core/cli/actions/info/emitter-options.d.ts.map +1 -0
- package/dist/src/core/cli/actions/info/emitter-options.js +345 -0
- package/dist/src/core/cli/actions/info/emitter-options.js.map +1 -0
- package/dist/src/core/cli/actions/info.d.ts +5 -2
- package/dist/src/core/cli/actions/info.d.ts.map +1 -1
- package/dist/src/core/cli/actions/info.js +6 -2
- package/dist/src/core/cli/actions/info.js.map +1 -1
- package/dist/src/core/cli/cli.js +43 -4
- package/dist/src/core/cli/cli.js.map +1 -1
- package/dist/src/core/helpers/string-template-utils.d.ts.map +1 -1
- package/dist/src/core/helpers/string-template-utils.js +7 -4
- package/dist/src/core/helpers/string-template-utils.js.map +1 -1
- package/dist/src/core/helpers/syntax-utils.d.ts.map +1 -1
- package/dist/src/core/helpers/syntax-utils.js +11 -3
- package/dist/src/core/helpers/syntax-utils.js.map +1 -1
- package/dist/src/core/helpers/type-name-utils.d.ts.map +1 -1
- package/dist/src/core/helpers/type-name-utils.js +13 -0
- package/dist/src/core/helpers/type-name-utils.js.map +1 -1
- package/dist/src/core/js-marshaller.d.ts +4 -2
- package/dist/src/core/js-marshaller.d.ts.map +1 -1
- package/dist/src/core/js-marshaller.js +96 -6
- package/dist/src/core/js-marshaller.js.map +1 -1
- package/dist/src/core/messages.d.ts +123 -32
- package/dist/src/core/messages.d.ts.map +1 -1
- package/dist/src/core/messages.js +29 -6
- package/dist/src/core/messages.js.map +1 -1
- package/dist/src/core/modifiers.d.ts +14 -0
- package/dist/src/core/modifiers.d.ts.map +1 -0
- package/dist/src/core/modifiers.js +166 -0
- package/dist/src/core/modifiers.js.map +1 -0
- package/dist/src/core/module-host.d.ts +5 -0
- package/dist/src/core/module-host.d.ts.map +1 -0
- package/dist/src/core/module-host.js +12 -0
- package/dist/src/core/module-host.js.map +1 -0
- package/dist/src/core/name-resolver.d.ts.map +1 -1
- package/dist/src/core/name-resolver.js +32 -0
- package/dist/src/core/name-resolver.js.map +1 -1
- package/dist/src/core/parser.d.ts.map +1 -1
- package/dist/src/core/parser.js +154 -101
- package/dist/src/core/parser.js.map +1 -1
- package/dist/src/core/program.d.ts.map +1 -1
- package/dist/src/core/program.js +5 -11
- package/dist/src/core/program.js.map +1 -1
- package/dist/src/core/scanner.d.ts +48 -48
- package/dist/src/core/scanner.d.ts.map +1 -1
- package/dist/src/core/scanner.js +55 -56
- package/dist/src/core/scanner.js.map +1 -1
- package/dist/src/core/semantic-walker.d.ts +3 -3
- package/dist/src/core/semantic-walker.d.ts.map +1 -1
- package/dist/src/core/semantic-walker.js +63 -44
- package/dist/src/core/semantic-walker.js.map +1 -1
- package/dist/src/core/source-loader.d.ts.map +1 -1
- package/dist/src/core/source-loader.js +4 -11
- package/dist/src/core/source-loader.js.map +1 -1
- package/dist/src/core/type-relation-checker.d.ts.map +1 -1
- package/dist/src/core/type-relation-checker.js +157 -10
- package/dist/src/core/type-relation-checker.js.map +1 -1
- package/dist/src/core/types.d.ts +215 -32
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/types.js +2 -0
- package/dist/src/core/types.js.map +1 -1
- package/dist/src/experimental/mutators.js +3 -3
- package/dist/src/experimental/mutators.js.map +1 -1
- package/dist/src/experimental/typekit/index.d.ts.map +1 -1
- package/dist/src/experimental/typekit/index.js.map +1 -1
- package/dist/src/formatter/print/printer.d.ts +2 -2
- package/dist/src/formatter/print/printer.d.ts.map +1 -1
- package/dist/src/formatter/print/printer.js +55 -5
- package/dist/src/formatter/print/printer.js.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/examples.d.ts +10 -3
- package/dist/src/lib/examples.d.ts.map +1 -1
- package/dist/src/lib/examples.js +22 -7
- package/dist/src/lib/examples.js.map +1 -1
- package/dist/src/package-manger/npm-registry-utils.d.ts.map +1 -1
- package/dist/src/package-manger/npm-registry-utils.js +10 -2
- package/dist/src/package-manger/npm-registry-utils.js.map +1 -1
- package/dist/src/server/completion.js +1 -0
- package/dist/src/server/completion.js.map +1 -1
- package/dist/src/server/server-compile-manager.js +1 -1
- package/dist/src/server/server-compile-manager.js.map +1 -1
- package/dist/src/server/tmlanguage.d.ts +1 -1
- package/dist/src/server/tmlanguage.d.ts.map +1 -1
- package/dist/src/server/tmlanguage.js +39 -29
- package/dist/src/server/tmlanguage.js.map +1 -1
- package/dist/src/server/type-signature.js +19 -0
- package/dist/src/server/type-signature.js.map +1 -1
- package/dist/src/utils/fs-utils.d.ts.map +1 -1
- package/dist/src/utils/fs-utils.js +1 -1
- package/dist/src/utils/fs-utils.js.map +1 -1
- package/dist/typespec.tmLanguage +103 -53
- package/lib/prototypes.tsp +2 -1
- package/package.json +13 -14
- package/templates/__snapshots__/emitter-ts/eslint.config.js +10 -1
- package/templates/__snapshots__/emitter-ts/package.json +1 -2
- package/templates/__snapshots__/emitter-ts/test/test-host.ts +7 -34
- package/templates/__snapshots__/library-ts/eslint.config.js +10 -1
- package/templates/__snapshots__/library-ts/package.json +1 -2
- package/templates/__snapshots__/library-ts/test/decorators.test.ts +18 -23
- package/templates/__snapshots__/library-ts/test/test-host.ts +5 -15
- package/templates/emitter-ts/eslint.config.js +10 -1
- package/templates/emitter-ts/package.json +1 -2
- package/templates/emitter-ts/test/test-host.ts.mu +7 -34
- package/templates/library-ts/eslint.config.js +10 -1
- package/templates/library-ts/package.json +1 -2
- package/templates/library-ts/test/decorators.test.ts.mu +18 -23
- package/templates/library-ts/test/test-host.ts.mu +5 -15
package/dist/src/core/parser.js
CHANGED
|
@@ -2,7 +2,8 @@ import { isArray, mutate } from "../utils/misc.js";
|
|
|
2
2
|
import { codePointBefore, isIdentifierContinue, trim } from "./charcode.js";
|
|
3
3
|
import { compilerAssert } from "./diagnostics.js";
|
|
4
4
|
import { createDiagnostic } from "./messages.js";
|
|
5
|
-
import {
|
|
5
|
+
import { modifiersToFlags } from "./modifiers.js";
|
|
6
|
+
import { createScanner, isComment, isKeyword, isModifier, isPunctuation, isReservedKeyword, isStatementKeyword, isTrivia, skipContinuousIdentifier, skipTrivia, skipTriviaBackward, Token, TokenDisplay, TokenFlags, } from "./scanner.js";
|
|
6
7
|
import { IdentifierKind, SyntaxKind, } from "./types.js";
|
|
7
8
|
/**
|
|
8
9
|
* The fixed set of options for each of the kinds of delimited lists in TypeSpec.
|
|
@@ -221,35 +222,6 @@ function createParser(code, options = {}) {
|
|
|
221
222
|
reportInvalidDecorators(decorators, "import statement");
|
|
222
223
|
item = parseImportStatement();
|
|
223
224
|
break;
|
|
224
|
-
case Token.ModelKeyword:
|
|
225
|
-
item = parseModelStatement(pos, decorators);
|
|
226
|
-
break;
|
|
227
|
-
case Token.ScalarKeyword:
|
|
228
|
-
item = parseScalarStatement(pos, decorators);
|
|
229
|
-
break;
|
|
230
|
-
case Token.NamespaceKeyword:
|
|
231
|
-
item = parseNamespaceStatement(pos, decorators, docs, directives);
|
|
232
|
-
break;
|
|
233
|
-
case Token.InterfaceKeyword:
|
|
234
|
-
item = parseInterfaceStatement(pos, decorators);
|
|
235
|
-
break;
|
|
236
|
-
case Token.UnionKeyword:
|
|
237
|
-
item = parseUnionStatement(pos, decorators);
|
|
238
|
-
break;
|
|
239
|
-
case Token.OpKeyword:
|
|
240
|
-
item = parseOperationStatement(pos, decorators);
|
|
241
|
-
break;
|
|
242
|
-
case Token.EnumKeyword:
|
|
243
|
-
item = parseEnumStatement(pos, decorators);
|
|
244
|
-
break;
|
|
245
|
-
case Token.AliasKeyword:
|
|
246
|
-
reportInvalidDecorators(decorators, "alias statement");
|
|
247
|
-
item = parseAliasStatement(pos);
|
|
248
|
-
break;
|
|
249
|
-
case Token.ConstKeyword:
|
|
250
|
-
reportInvalidDecorators(decorators, "const statement");
|
|
251
|
-
item = parseConstStatement(pos);
|
|
252
|
-
break;
|
|
253
225
|
case Token.UsingKeyword:
|
|
254
226
|
reportInvalidDecorators(decorators, "using statement");
|
|
255
227
|
item = parseUsingStatement(pos);
|
|
@@ -259,10 +231,20 @@ function createParser(code, options = {}) {
|
|
|
259
231
|
item = parseEmptyStatement(pos);
|
|
260
232
|
break;
|
|
261
233
|
// Start of declaration with modifiers
|
|
234
|
+
case Token.NamespaceKeyword:
|
|
235
|
+
case Token.ModelKeyword:
|
|
236
|
+
case Token.ScalarKeyword:
|
|
237
|
+
case Token.InterfaceKeyword:
|
|
238
|
+
case Token.UnionKeyword:
|
|
239
|
+
case Token.OpKeyword:
|
|
240
|
+
case Token.EnumKeyword:
|
|
241
|
+
case Token.AliasKeyword:
|
|
242
|
+
case Token.ConstKeyword:
|
|
262
243
|
case Token.ExternKeyword:
|
|
244
|
+
case Token.InternalKeyword:
|
|
263
245
|
case Token.FnKeyword:
|
|
264
246
|
case Token.DecKeyword:
|
|
265
|
-
item = parseDeclaration(pos);
|
|
247
|
+
item = parseDeclaration(pos, decorators, docs, directives);
|
|
266
248
|
break;
|
|
267
249
|
default:
|
|
268
250
|
item = parseInvalidStatement(pos, decorators);
|
|
@@ -312,47 +294,24 @@ function createParser(code, options = {}) {
|
|
|
312
294
|
item = parseImportStatement();
|
|
313
295
|
error({ code: "import-first", messageId: "topLevel", target: item });
|
|
314
296
|
break;
|
|
315
|
-
case Token.
|
|
316
|
-
|
|
297
|
+
case Token.UsingKeyword:
|
|
298
|
+
reportInvalidDecorators(decorators, "using statement");
|
|
299
|
+
item = parseUsingStatement(pos);
|
|
317
300
|
break;
|
|
301
|
+
case Token.ModelKeyword:
|
|
318
302
|
case Token.ScalarKeyword:
|
|
319
|
-
item = parseScalarStatement(pos, decorators);
|
|
320
|
-
break;
|
|
321
303
|
case Token.NamespaceKeyword:
|
|
322
|
-
const ns = parseNamespaceStatement(pos, decorators, docs, directives);
|
|
323
|
-
if (isBlocklessNamespace(ns)) {
|
|
324
|
-
error({ code: "blockless-namespace-first", messageId: "topLevel", target: ns });
|
|
325
|
-
}
|
|
326
|
-
item = ns;
|
|
327
|
-
break;
|
|
328
304
|
case Token.InterfaceKeyword:
|
|
329
|
-
item = parseInterfaceStatement(pos, decorators);
|
|
330
|
-
break;
|
|
331
305
|
case Token.UnionKeyword:
|
|
332
|
-
item = parseUnionStatement(pos, decorators);
|
|
333
|
-
break;
|
|
334
306
|
case Token.OpKeyword:
|
|
335
|
-
item = parseOperationStatement(pos, decorators);
|
|
336
|
-
break;
|
|
337
307
|
case Token.EnumKeyword:
|
|
338
|
-
item = parseEnumStatement(pos, decorators);
|
|
339
|
-
break;
|
|
340
308
|
case Token.AliasKeyword:
|
|
341
|
-
reportInvalidDecorators(decorators, "alias statement");
|
|
342
|
-
item = parseAliasStatement(pos);
|
|
343
|
-
break;
|
|
344
309
|
case Token.ConstKeyword:
|
|
345
|
-
reportInvalidDecorators(decorators, "const statement");
|
|
346
|
-
item = parseConstStatement(pos);
|
|
347
|
-
break;
|
|
348
|
-
case Token.UsingKeyword:
|
|
349
|
-
reportInvalidDecorators(decorators, "using statement");
|
|
350
|
-
item = parseUsingStatement(pos);
|
|
351
|
-
break;
|
|
352
310
|
case Token.ExternKeyword:
|
|
311
|
+
case Token.InternalKeyword:
|
|
353
312
|
case Token.FnKeyword:
|
|
354
313
|
case Token.DecKeyword:
|
|
355
|
-
item = parseDeclaration(pos);
|
|
314
|
+
item = parseDeclaration(pos, decorators, docs, directives);
|
|
356
315
|
break;
|
|
357
316
|
case Token.EndOfFile:
|
|
358
317
|
parseExpected(Token.CloseBrace);
|
|
@@ -365,6 +324,9 @@ function createParser(code, options = {}) {
|
|
|
365
324
|
item = parseInvalidStatement(pos, decorators);
|
|
366
325
|
break;
|
|
367
326
|
}
|
|
327
|
+
if (isBlocklessNamespace(item)) {
|
|
328
|
+
error({ code: "blockless-namespace-first", messageId: "topLevel", target: item });
|
|
329
|
+
}
|
|
368
330
|
mutate(item).directives = directives;
|
|
369
331
|
if (tok !== Token.NamespaceKeyword) {
|
|
370
332
|
mutate(item).docs = docs;
|
|
@@ -387,7 +349,7 @@ function createParser(code, options = {}) {
|
|
|
387
349
|
}
|
|
388
350
|
return directives;
|
|
389
351
|
}
|
|
390
|
-
function parseNamespaceStatement(pos, decorators, docs, directives) {
|
|
352
|
+
function parseNamespaceStatement(pos, decorators, modifiers, docs, directives) {
|
|
391
353
|
parseExpected(Token.NamespaceKeyword);
|
|
392
354
|
let currentName = parseIdentifierOrMemberExpression();
|
|
393
355
|
const nsSegments = [];
|
|
@@ -410,6 +372,8 @@ function createParser(code, options = {}) {
|
|
|
410
372
|
locals: undefined,
|
|
411
373
|
statements,
|
|
412
374
|
directives: directives,
|
|
375
|
+
modifiers,
|
|
376
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
413
377
|
...finishNode(pos),
|
|
414
378
|
};
|
|
415
379
|
for (let i = 1; i < nsSegments.length; i++) {
|
|
@@ -420,12 +384,14 @@ function createParser(code, options = {}) {
|
|
|
420
384
|
id: nsSegments[i],
|
|
421
385
|
statements: outerNs,
|
|
422
386
|
locals: undefined,
|
|
387
|
+
modifiers: [],
|
|
388
|
+
modifierFlags: 0 /* ModifierFlags.None */,
|
|
423
389
|
...finishNode(pos),
|
|
424
390
|
};
|
|
425
391
|
}
|
|
426
392
|
return outerNs;
|
|
427
393
|
}
|
|
428
|
-
function parseInterfaceStatement(pos, decorators) {
|
|
394
|
+
function parseInterfaceStatement(pos, decorators, modifiers) {
|
|
429
395
|
parseExpected(Token.InterfaceKeyword);
|
|
430
396
|
const id = parseIdentifier();
|
|
431
397
|
const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
|
|
@@ -438,7 +404,7 @@ function createParser(code, options = {}) {
|
|
|
438
404
|
error({ code: "token-expected", format: { token: "'extends' or '{'" } });
|
|
439
405
|
nextToken();
|
|
440
406
|
}
|
|
441
|
-
const { items: operations, range: bodyRange } = parseList(ListKind.InterfaceMembers, (pos, decorators) => parseOperationStatement(pos, decorators, true));
|
|
407
|
+
const { items: operations, range: bodyRange } = parseList(ListKind.InterfaceMembers, (pos, decorators) => parseOperationStatement(pos, decorators, /* modifiers */ undefined, true));
|
|
442
408
|
return {
|
|
443
409
|
kind: SyntaxKind.InterfaceStatement,
|
|
444
410
|
id,
|
|
@@ -448,6 +414,8 @@ function createParser(code, options = {}) {
|
|
|
448
414
|
bodyRange,
|
|
449
415
|
extends: extendList.items,
|
|
450
416
|
decorators,
|
|
417
|
+
modifiers,
|
|
418
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
451
419
|
...finishNode(pos),
|
|
452
420
|
};
|
|
453
421
|
}
|
|
@@ -465,7 +433,7 @@ function createParser(code, options = {}) {
|
|
|
465
433
|
}
|
|
466
434
|
return detail;
|
|
467
435
|
}
|
|
468
|
-
function parseUnionStatement(pos, decorators) {
|
|
436
|
+
function parseUnionStatement(pos, decorators, modifiers) {
|
|
469
437
|
parseExpected(Token.UnionKeyword);
|
|
470
438
|
const id = parseIdentifier();
|
|
471
439
|
const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
|
|
@@ -476,6 +444,8 @@ function createParser(code, options = {}) {
|
|
|
476
444
|
templateParameters,
|
|
477
445
|
templateParametersRange,
|
|
478
446
|
decorators,
|
|
447
|
+
modifiers,
|
|
448
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
479
449
|
options,
|
|
480
450
|
...finishNode(pos),
|
|
481
451
|
};
|
|
@@ -483,11 +453,16 @@ function createParser(code, options = {}) {
|
|
|
483
453
|
function parseIdOrValueForVariant() {
|
|
484
454
|
const nextToken = token();
|
|
485
455
|
let id;
|
|
486
|
-
if (isReservedKeyword(nextToken)) {
|
|
456
|
+
if (isReservedKeyword(nextToken) || isModifier(nextToken)) {
|
|
487
457
|
id = parseIdentifier({ allowReservedIdentifier: true });
|
|
488
458
|
// If the next token is not a colon this means we tried to use the reserved keyword as a type reference
|
|
489
459
|
if (token() !== Token.Colon) {
|
|
490
|
-
|
|
460
|
+
if (isReservedKeyword(nextToken)) {
|
|
461
|
+
error({ code: "reserved-identifier", messageId: "future", format: { name: id.sv } });
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
error({ code: "reserved-identifier" });
|
|
465
|
+
}
|
|
491
466
|
}
|
|
492
467
|
return {
|
|
493
468
|
kind: SyntaxKind.TypeReference,
|
|
@@ -552,11 +527,14 @@ function createParser(code, options = {}) {
|
|
|
552
527
|
...finishNode(pos),
|
|
553
528
|
};
|
|
554
529
|
}
|
|
555
|
-
function parseOperationStatement(pos, decorators, inInterface) {
|
|
530
|
+
function parseOperationStatement(pos, decorators, _modifiers, inInterface) {
|
|
531
|
+
let modifiers;
|
|
556
532
|
if (inInterface) {
|
|
533
|
+
modifiers = parseModifiers();
|
|
557
534
|
parseOptional(Token.OpKeyword);
|
|
558
535
|
}
|
|
559
536
|
else {
|
|
537
|
+
modifiers = _modifiers;
|
|
560
538
|
parseExpected(Token.OpKeyword);
|
|
561
539
|
}
|
|
562
540
|
const id = parseIdentifier();
|
|
@@ -597,6 +575,8 @@ function createParser(code, options = {}) {
|
|
|
597
575
|
templateParametersRange,
|
|
598
576
|
signature,
|
|
599
577
|
decorators,
|
|
578
|
+
modifiers,
|
|
579
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
600
580
|
...finishNode(pos),
|
|
601
581
|
};
|
|
602
582
|
}
|
|
@@ -611,7 +591,7 @@ function createParser(code, options = {}) {
|
|
|
611
591
|
};
|
|
612
592
|
return parameters;
|
|
613
593
|
}
|
|
614
|
-
function parseModelStatement(pos, decorators) {
|
|
594
|
+
function parseModelStatement(pos, decorators, modifiers) {
|
|
615
595
|
parseExpected(Token.ModelKeyword);
|
|
616
596
|
const id = parseIdentifier();
|
|
617
597
|
const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
|
|
@@ -641,6 +621,8 @@ function createParser(code, options = {}) {
|
|
|
641
621
|
decorators,
|
|
642
622
|
properties: propDetail.items,
|
|
643
623
|
bodyRange: propDetail.range,
|
|
624
|
+
modifiers,
|
|
625
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
644
626
|
...finishNode(pos),
|
|
645
627
|
};
|
|
646
628
|
}
|
|
@@ -661,7 +643,7 @@ function createParser(code, options = {}) {
|
|
|
661
643
|
const id = parseIdentifier();
|
|
662
644
|
let constraint;
|
|
663
645
|
if (parseOptional(Token.ExtendsKeyword)) {
|
|
664
|
-
constraint =
|
|
646
|
+
constraint = parseMixedConstraint();
|
|
665
647
|
}
|
|
666
648
|
let def;
|
|
667
649
|
if (parseOptional(Token.Equals)) {
|
|
@@ -680,13 +662,13 @@ function createParser(code, options = {}) {
|
|
|
680
662
|
return parseValueOfExpression();
|
|
681
663
|
}
|
|
682
664
|
else if (parseOptional(Token.OpenParen)) {
|
|
683
|
-
const expr =
|
|
665
|
+
const expr = parseMixedConstraint();
|
|
684
666
|
parseExpected(Token.CloseParen);
|
|
685
667
|
return expr;
|
|
686
668
|
}
|
|
687
669
|
return parseIntersectionExpressionOrHigher();
|
|
688
670
|
}
|
|
689
|
-
function
|
|
671
|
+
function parseMixedConstraint() {
|
|
690
672
|
const pos = tokenPos();
|
|
691
673
|
parseOptional(Token.Bar);
|
|
692
674
|
const node = parseValueOfExpressionOrIntersectionOrHigher();
|
|
@@ -771,7 +753,7 @@ function createParser(code, options = {}) {
|
|
|
771
753
|
...finishNode(pos),
|
|
772
754
|
};
|
|
773
755
|
}
|
|
774
|
-
function parseScalarStatement(pos, decorators) {
|
|
756
|
+
function parseScalarStatement(pos, decorators, modifiers) {
|
|
775
757
|
parseExpected(Token.ScalarKeyword);
|
|
776
758
|
const id = parseIdentifier();
|
|
777
759
|
const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
|
|
@@ -786,6 +768,8 @@ function createParser(code, options = {}) {
|
|
|
786
768
|
members,
|
|
787
769
|
bodyRange,
|
|
788
770
|
decorators,
|
|
771
|
+
modifiers,
|
|
772
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
789
773
|
...finishNode(pos),
|
|
790
774
|
};
|
|
791
775
|
}
|
|
@@ -816,7 +800,7 @@ function createParser(code, options = {}) {
|
|
|
816
800
|
...finishNode(pos),
|
|
817
801
|
};
|
|
818
802
|
}
|
|
819
|
-
function parseEnumStatement(pos, decorators) {
|
|
803
|
+
function parseEnumStatement(pos, decorators, modifiers) {
|
|
820
804
|
parseExpected(Token.EnumKeyword);
|
|
821
805
|
const id = parseIdentifier();
|
|
822
806
|
const { items: members } = parseList(ListKind.EnumMembers, parseEnumMemberOrSpread);
|
|
@@ -824,6 +808,8 @@ function createParser(code, options = {}) {
|
|
|
824
808
|
kind: SyntaxKind.EnumStatement,
|
|
825
809
|
id,
|
|
826
810
|
decorators,
|
|
811
|
+
modifiers,
|
|
812
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
827
813
|
members,
|
|
828
814
|
...finishNode(pos),
|
|
829
815
|
};
|
|
@@ -871,7 +857,7 @@ function createParser(code, options = {}) {
|
|
|
871
857
|
...finishNode(pos),
|
|
872
858
|
};
|
|
873
859
|
}
|
|
874
|
-
function parseAliasStatement(pos) {
|
|
860
|
+
function parseAliasStatement(pos, modifiers) {
|
|
875
861
|
parseExpected(Token.AliasKeyword);
|
|
876
862
|
const id = parseIdentifier();
|
|
877
863
|
const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
|
|
@@ -884,10 +870,12 @@ function createParser(code, options = {}) {
|
|
|
884
870
|
templateParameters,
|
|
885
871
|
templateParametersRange,
|
|
886
872
|
value,
|
|
873
|
+
modifiers,
|
|
874
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
887
875
|
...finishNode(pos),
|
|
888
876
|
};
|
|
889
877
|
}
|
|
890
|
-
function parseConstStatement(pos) {
|
|
878
|
+
function parseConstStatement(pos, modifiers) {
|
|
891
879
|
parseExpected(Token.ConstKeyword);
|
|
892
880
|
const id = parseIdentifier();
|
|
893
881
|
const type = parseOptionalTypeAnnotation();
|
|
@@ -899,6 +887,8 @@ function createParser(code, options = {}) {
|
|
|
899
887
|
id,
|
|
900
888
|
value,
|
|
901
889
|
type,
|
|
890
|
+
modifiers,
|
|
891
|
+
modifierFlags: modifiersToFlags(modifiers),
|
|
902
892
|
...finishNode(pos),
|
|
903
893
|
};
|
|
904
894
|
}
|
|
@@ -923,6 +913,14 @@ function createParser(code, options = {}) {
|
|
|
923
913
|
const expr = parseIntersectionExpressionOrHigher();
|
|
924
914
|
options.push(expr);
|
|
925
915
|
}
|
|
916
|
+
for (const fnVariant of options.filter((n) => n.kind === SyntaxKind.FunctionTypeExpression)) {
|
|
917
|
+
if (!fnVariant.parenthesized) {
|
|
918
|
+
error({
|
|
919
|
+
code: "fn-in-union-expression",
|
|
920
|
+
target: fnVariant,
|
|
921
|
+
});
|
|
922
|
+
}
|
|
923
|
+
}
|
|
926
924
|
return {
|
|
927
925
|
kind: SyntaxKind.UnionExpression,
|
|
928
926
|
options,
|
|
@@ -1013,6 +1011,19 @@ function createParser(code, options = {}) {
|
|
|
1013
1011
|
}
|
|
1014
1012
|
}
|
|
1015
1013
|
}
|
|
1014
|
+
function parseFunctionTypeExpression() {
|
|
1015
|
+
const pos = tokenPos();
|
|
1016
|
+
parseExpected(Token.FnKeyword);
|
|
1017
|
+
const { items: parameters } = parseFunctionParameters();
|
|
1018
|
+
const optionalReturnType = parseOptional(Token.EqualsGreaterThan);
|
|
1019
|
+
const returnType = optionalReturnType ? parseMixedConstraint() : undefined;
|
|
1020
|
+
return {
|
|
1021
|
+
kind: SyntaxKind.FunctionTypeExpression,
|
|
1022
|
+
parameters,
|
|
1023
|
+
returnType,
|
|
1024
|
+
...finishNode(pos),
|
|
1025
|
+
};
|
|
1026
|
+
}
|
|
1016
1027
|
function parseReferenceExpression(message) {
|
|
1017
1028
|
const pos = tokenPos();
|
|
1018
1029
|
const target = parseIdentifierOrMemberExpression({
|
|
@@ -1255,6 +1266,8 @@ function createParser(code, options = {}) {
|
|
|
1255
1266
|
switch (token()) {
|
|
1256
1267
|
case Token.TypeOfKeyword:
|
|
1257
1268
|
return parseTypeOfExpression();
|
|
1269
|
+
case Token.FnKeyword:
|
|
1270
|
+
return parseFunctionTypeExpression();
|
|
1258
1271
|
case Token.Identifier:
|
|
1259
1272
|
return parseCallOrReferenceExpression();
|
|
1260
1273
|
case Token.StringLiteral:
|
|
@@ -1303,6 +1316,14 @@ function createParser(code, options = {}) {
|
|
|
1303
1316
|
...finishNode(pos),
|
|
1304
1317
|
};
|
|
1305
1318
|
}
|
|
1319
|
+
function parseInternalKeyword() {
|
|
1320
|
+
const pos = tokenPos();
|
|
1321
|
+
parseExpected(Token.InternalKeyword);
|
|
1322
|
+
return {
|
|
1323
|
+
kind: SyntaxKind.InternalKeyword,
|
|
1324
|
+
...finishNode(pos),
|
|
1325
|
+
};
|
|
1326
|
+
}
|
|
1306
1327
|
function parseVoidKeyword() {
|
|
1307
1328
|
const pos = tokenPos();
|
|
1308
1329
|
parseExpected(Token.VoidKeyword);
|
|
@@ -1332,7 +1353,7 @@ function createParser(code, options = {}) {
|
|
|
1332
1353
|
parseExpected(Token.OpenParen);
|
|
1333
1354
|
const expr = parseExpression();
|
|
1334
1355
|
parseExpected(Token.CloseParen);
|
|
1335
|
-
return { ...expr, ...finishNode(pos) };
|
|
1356
|
+
return { parenthesized: true, ...expr, ...finishNode(pos) };
|
|
1336
1357
|
}
|
|
1337
1358
|
function parseTupleExpression() {
|
|
1338
1359
|
const pos = tokenPos();
|
|
@@ -1490,8 +1511,10 @@ function createParser(code, options = {}) {
|
|
|
1490
1511
|
}
|
|
1491
1512
|
function parseIdentifier(options) {
|
|
1492
1513
|
if (isKeyword(token())) {
|
|
1493
|
-
|
|
1494
|
-
|
|
1514
|
+
if (!(isModifier(token()) && options?.allowReservedIdentifier)) {
|
|
1515
|
+
error({ code: "reserved-identifier" });
|
|
1516
|
+
return createMissingIdentifier();
|
|
1517
|
+
}
|
|
1495
1518
|
}
|
|
1496
1519
|
else if (isReservedKeyword(token())) {
|
|
1497
1520
|
if (!options?.allowReservedIdentifier) {
|
|
@@ -1514,9 +1537,29 @@ function createParser(code, options = {}) {
|
|
|
1514
1537
|
...finishNode(pos),
|
|
1515
1538
|
};
|
|
1516
1539
|
}
|
|
1517
|
-
function parseDeclaration(pos) {
|
|
1540
|
+
function parseDeclaration(pos, decorators, docs, directives) {
|
|
1518
1541
|
const modifiers = parseModifiers();
|
|
1519
1542
|
switch (token()) {
|
|
1543
|
+
case Token.ModelKeyword:
|
|
1544
|
+
return parseModelStatement(pos, decorators, modifiers);
|
|
1545
|
+
case Token.ScalarKeyword:
|
|
1546
|
+
return parseScalarStatement(pos, decorators, modifiers);
|
|
1547
|
+
case Token.NamespaceKeyword:
|
|
1548
|
+
return parseNamespaceStatement(pos, decorators, modifiers, docs, directives);
|
|
1549
|
+
case Token.InterfaceKeyword:
|
|
1550
|
+
return parseInterfaceStatement(pos, decorators, modifiers);
|
|
1551
|
+
case Token.UnionKeyword:
|
|
1552
|
+
return parseUnionStatement(pos, decorators, modifiers);
|
|
1553
|
+
case Token.OpKeyword:
|
|
1554
|
+
return parseOperationStatement(pos, decorators, modifiers);
|
|
1555
|
+
case Token.EnumKeyword:
|
|
1556
|
+
return parseEnumStatement(pos, decorators, modifiers);
|
|
1557
|
+
case Token.AliasKeyword:
|
|
1558
|
+
reportInvalidDecorators(decorators, "alias statement");
|
|
1559
|
+
return parseAliasStatement(pos, modifiers);
|
|
1560
|
+
case Token.ConstKeyword:
|
|
1561
|
+
reportInvalidDecorators(decorators, "const statement");
|
|
1562
|
+
return parseConstStatement(pos, modifiers);
|
|
1520
1563
|
case Token.DecKeyword:
|
|
1521
1564
|
return parseDecoratorDeclarationStatement(pos, modifiers);
|
|
1522
1565
|
case Token.FnKeyword:
|
|
@@ -1536,6 +1579,8 @@ function createParser(code, options = {}) {
|
|
|
1536
1579
|
switch (token()) {
|
|
1537
1580
|
case Token.ExternKeyword:
|
|
1538
1581
|
return parseExternKeyword();
|
|
1582
|
+
case Token.InternalKeyword:
|
|
1583
|
+
return parseInternalKeyword();
|
|
1539
1584
|
default:
|
|
1540
1585
|
return undefined;
|
|
1541
1586
|
}
|
|
@@ -1578,7 +1623,7 @@ function createParser(code, options = {}) {
|
|
|
1578
1623
|
const { items: parameters } = parseFunctionParameters();
|
|
1579
1624
|
let returnType;
|
|
1580
1625
|
if (parseOptional(Token.Colon)) {
|
|
1581
|
-
returnType =
|
|
1626
|
+
returnType = parseMixedConstraint();
|
|
1582
1627
|
}
|
|
1583
1628
|
parseExpected(Token.Semicolon);
|
|
1584
1629
|
return {
|
|
@@ -1618,7 +1663,7 @@ function createParser(code, options = {}) {
|
|
|
1618
1663
|
const optional = parseOptional(Token.Question);
|
|
1619
1664
|
let type;
|
|
1620
1665
|
if (parseOptional(Token.Colon)) {
|
|
1621
|
-
type =
|
|
1666
|
+
type = parseMixedConstraint();
|
|
1622
1667
|
}
|
|
1623
1668
|
return {
|
|
1624
1669
|
kind: SyntaxKind.FunctionParameter,
|
|
@@ -1629,17 +1674,6 @@ function createParser(code, options = {}) {
|
|
|
1629
1674
|
...finishNode(pos),
|
|
1630
1675
|
};
|
|
1631
1676
|
}
|
|
1632
|
-
function modifiersToFlags(modifiers) {
|
|
1633
|
-
let flags = 0 /* ModifierFlags.None */;
|
|
1634
|
-
for (const modifier of modifiers) {
|
|
1635
|
-
switch (modifier.kind) {
|
|
1636
|
-
case SyntaxKind.ExternKeyword:
|
|
1637
|
-
flags |= 2 /* ModifierFlags.Extern */;
|
|
1638
|
-
break;
|
|
1639
|
-
}
|
|
1640
|
-
}
|
|
1641
|
-
return flags;
|
|
1642
|
-
}
|
|
1643
1677
|
function parseRange(mode, range, callback) {
|
|
1644
1678
|
const savedMode = currentMode;
|
|
1645
1679
|
const result = scanner.scanRange(range, () => {
|
|
@@ -2298,7 +2332,8 @@ export function visitChildren(node, cb) {
|
|
|
2298
2332
|
case SyntaxKind.ImportStatement:
|
|
2299
2333
|
return visitNode(cb, node.path);
|
|
2300
2334
|
case SyntaxKind.OperationStatement:
|
|
2301
|
-
return (visitEach(cb, node.
|
|
2335
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2336
|
+
visitEach(cb, node.decorators) ||
|
|
2302
2337
|
visitNode(cb, node.id) ||
|
|
2303
2338
|
visitEach(cb, node.templateParameters) ||
|
|
2304
2339
|
visitNode(cb, node.signature));
|
|
@@ -2307,11 +2342,13 @@ export function visitChildren(node, cb) {
|
|
|
2307
2342
|
case SyntaxKind.OperationSignatureReference:
|
|
2308
2343
|
return visitNode(cb, node.baseOperation);
|
|
2309
2344
|
case SyntaxKind.NamespaceStatement:
|
|
2310
|
-
return (visitEach(cb, node.
|
|
2345
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2346
|
+
visitEach(cb, node.decorators) ||
|
|
2311
2347
|
visitNode(cb, node.id) ||
|
|
2312
2348
|
(isArray(node.statements) ? visitEach(cb, node.statements) : visitNode(cb, node.statements)));
|
|
2313
2349
|
case SyntaxKind.InterfaceStatement:
|
|
2314
|
-
return (visitEach(cb, node.
|
|
2350
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2351
|
+
visitEach(cb, node.decorators) ||
|
|
2315
2352
|
visitNode(cb, node.id) ||
|
|
2316
2353
|
visitEach(cb, node.templateParameters) ||
|
|
2317
2354
|
visitEach(cb, node.extends) ||
|
|
@@ -2332,14 +2369,16 @@ export function visitChildren(node, cb) {
|
|
|
2332
2369
|
case SyntaxKind.ModelSpreadProperty:
|
|
2333
2370
|
return visitNode(cb, node.target);
|
|
2334
2371
|
case SyntaxKind.ModelStatement:
|
|
2335
|
-
return (visitEach(cb, node.
|
|
2372
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2373
|
+
visitEach(cb, node.decorators) ||
|
|
2336
2374
|
visitNode(cb, node.id) ||
|
|
2337
2375
|
visitEach(cb, node.templateParameters) ||
|
|
2338
2376
|
visitNode(cb, node.extends) ||
|
|
2339
2377
|
visitNode(cb, node.is) ||
|
|
2340
2378
|
visitEach(cb, node.properties));
|
|
2341
2379
|
case SyntaxKind.ScalarStatement:
|
|
2342
|
-
return (visitEach(cb, node.
|
|
2380
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2381
|
+
visitEach(cb, node.decorators) ||
|
|
2343
2382
|
visitNode(cb, node.id) ||
|
|
2344
2383
|
visitEach(cb, node.templateParameters) ||
|
|
2345
2384
|
visitEach(cb, node.members) ||
|
|
@@ -2347,24 +2386,32 @@ export function visitChildren(node, cb) {
|
|
|
2347
2386
|
case SyntaxKind.ScalarConstructor:
|
|
2348
2387
|
return visitNode(cb, node.id) || visitEach(cb, node.parameters);
|
|
2349
2388
|
case SyntaxKind.UnionStatement:
|
|
2350
|
-
return (visitEach(cb, node.
|
|
2389
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2390
|
+
visitEach(cb, node.decorators) ||
|
|
2351
2391
|
visitNode(cb, node.id) ||
|
|
2352
2392
|
visitEach(cb, node.templateParameters) ||
|
|
2353
2393
|
visitEach(cb, node.options));
|
|
2354
2394
|
case SyntaxKind.UnionVariant:
|
|
2355
2395
|
return visitEach(cb, node.decorators) || visitNode(cb, node.id) || visitNode(cb, node.value);
|
|
2356
2396
|
case SyntaxKind.EnumStatement:
|
|
2357
|
-
return (visitEach(cb, node.
|
|
2397
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2398
|
+
visitEach(cb, node.decorators) ||
|
|
2399
|
+
visitNode(cb, node.id) ||
|
|
2400
|
+
visitEach(cb, node.members));
|
|
2358
2401
|
case SyntaxKind.EnumMember:
|
|
2359
2402
|
return visitEach(cb, node.decorators) || visitNode(cb, node.id) || visitNode(cb, node.value);
|
|
2360
2403
|
case SyntaxKind.EnumSpreadMember:
|
|
2361
2404
|
return visitNode(cb, node.target);
|
|
2362
2405
|
case SyntaxKind.AliasStatement:
|
|
2363
|
-
return (
|
|
2406
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2407
|
+
visitNode(cb, node.id) ||
|
|
2364
2408
|
visitEach(cb, node.templateParameters) ||
|
|
2365
2409
|
visitNode(cb, node.value));
|
|
2366
2410
|
case SyntaxKind.ConstStatement:
|
|
2367
|
-
return
|
|
2411
|
+
return (visitEach(cb, node.modifiers) ||
|
|
2412
|
+
visitNode(cb, node.id) ||
|
|
2413
|
+
visitNode(cb, node.value) ||
|
|
2414
|
+
visitNode(cb, node.type));
|
|
2368
2415
|
case SyntaxKind.DecoratorDeclarationStatement:
|
|
2369
2416
|
return (visitEach(cb, node.modifiers) ||
|
|
2370
2417
|
visitNode(cb, node.id) ||
|
|
@@ -2375,6 +2422,8 @@ export function visitChildren(node, cb) {
|
|
|
2375
2422
|
visitNode(cb, node.id) ||
|
|
2376
2423
|
visitEach(cb, node.parameters) ||
|
|
2377
2424
|
visitNode(cb, node.returnType));
|
|
2425
|
+
case SyntaxKind.FunctionTypeExpression:
|
|
2426
|
+
return visitEach(cb, node.parameters) || visitNode(cb, node.returnType);
|
|
2378
2427
|
case SyntaxKind.FunctionParameter:
|
|
2379
2428
|
return visitNode(cb, node.id) || visitNode(cb, node.type);
|
|
2380
2429
|
case SyntaxKind.TypeReference:
|
|
@@ -2428,6 +2477,7 @@ export function visitChildren(node, cb) {
|
|
|
2428
2477
|
case SyntaxKind.VoidKeyword:
|
|
2429
2478
|
case SyntaxKind.NeverKeyword:
|
|
2430
2479
|
case SyntaxKind.ExternKeyword:
|
|
2480
|
+
case SyntaxKind.InternalKeyword:
|
|
2431
2481
|
case SyntaxKind.UnknownKeyword:
|
|
2432
2482
|
case SyntaxKind.JsSourceFile:
|
|
2433
2483
|
case SyntaxKind.JsNamespaceDeclaration:
|
|
@@ -2600,6 +2650,9 @@ export function getIdentifierContext(id) {
|
|
|
2600
2650
|
case SyntaxKind.DecoratorExpression:
|
|
2601
2651
|
kind = IdentifierKind.Decorator;
|
|
2602
2652
|
break;
|
|
2653
|
+
case SyntaxKind.CallExpression:
|
|
2654
|
+
kind = IdentifierKind.Function;
|
|
2655
|
+
break;
|
|
2603
2656
|
case SyntaxKind.UsingStatement:
|
|
2604
2657
|
kind = IdentifierKind.Using;
|
|
2605
2658
|
break;
|