@@ -2419,6 +2419,13 @@ namespace Parser {
2419
2419
}
2420
2420
}
2421
2421
2422
+ function parseErrorForDeclarationNamedUndefined(name: Identifier) {
2423
+ if (name.escapedText === "undefined") {
2424
+ const pos = skipTrivia(sourceText, name.pos);
2425
+ parseErrorAt(pos, name.end, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "undefined");
2426
+ }
2427
+ }
2428
+
2422
2429
function getSpaceSuggestion(expressionText: string) {
2423
2430
for (const keyword of viableKeywordSuggestions) {
2424
2431
if (expressionText.length > keyword.length + 2 && startsWith(expressionText, keyword)) {
@@ -3923,6 +3930,9 @@ namespace Parser {
3923
3930
const pos = getNodePos();
3924
3931
const modifiers = parseModifiers(/*allowDecorators*/ false, /*permitConstAsModifier*/ true);
3925
3932
const name = parseIdentifier();
3933
+ if (name.escapedText === "undefined") {
3934
+ parseErrorForDeclarationNamedUndefined(name);
3935
+ }
3926
3936
let constraint: TypeNode | undefined;
3927
3937
let expression: Expression | undefined;
3928
3938
if (parseOptional(SyntaxKind.ExtendsKeyword)) {
@@ -4369,6 +4379,9 @@ namespace Parser {
4369
4379
function parseMappedTypeParameter() {
4370
4380
const pos = getNodePos();
4371
4381
const name = parseIdentifierName();
4382
+ if (name.escapedText === "undefined") {
4383
+ parseErrorForDeclarationNamedUndefined(name);
4384
+ }
4372
4385
parseExpected(SyntaxKind.InKeyword);
4373
4386
const type = parseType();
4374
4387
return finishNode(factory.createTypeParameterDeclaration(/*modifiers*/ undefined, name, type, /*defaultType*/ undefined), pos);
@@ -4733,6 +4746,9 @@ namespace Parser {
4733
4746
function parseTypeParameterOfInferType(): TypeParameterDeclaration {
4734
4747
const pos = getNodePos();
4735
4748
const name = parseIdentifier();
4749
+ if (name.escapedText === "undefined") {
4750
+ parseErrorForDeclarationNamedUndefined(name);
4751
+ }
4736
4752
const constraint = tryParse(tryParseConstraintOfInferType);
4737
4753
const node = factory.createTypeParameterDeclaration(/*modifiers*/ undefined, name, constraint);
4738
4754
return finishNode(node, pos);
@@ -8097,6 +8113,9 @@ namespace Parser {
8097
8113
8098
8114
// We don't parse the name here in await context, instead we will report a grammar error in the checker.
8099
8115
const name = parseNameOfClassDeclarationOrExpression();
8116
+ if (name?.escapedText === "undefined") {
8117
+ parseErrorForDeclarationNamedUndefined(name);
8118
+ }
8100
8119
const typeParameters = parseTypeParameters();
8101
8120
if (some(modifiers, isExportModifier)) setAwaitContext(/*value*/ true);
8102
8121
const heritageClauses = parseHeritageClauses();
@@ -8179,6 +8198,9 @@ namespace Parser {
8179
8198
function parseInterfaceDeclaration(pos: number, hasJSDoc: boolean, modifiers: NodeArray<ModifierLike> | undefined): InterfaceDeclaration {
8180
8199
parseExpected(SyntaxKind.InterfaceKeyword);
8181
8200
const name = parseIdentifier();
8201
+ if (name.escapedText === "undefined") {
8202
+ parseErrorForDeclarationNamedUndefined(name);
8203
+ }
8182
8204
const typeParameters = parseTypeParameters();
8183
8205
const heritageClauses = parseHeritageClauses();
8184
8206
const members = parseObjectTypeMembers();
@@ -8192,6 +8214,9 @@ namespace Parser {
8192
8214
parseErrorAtCurrentToken(Diagnostics.Line_break_not_permitted_here);
8193
8215
}
8194
8216
const name = parseIdentifier();
8217
+ if (name.escapedText === "undefined") {
8218
+ parseErrorForDeclarationNamedUndefined(name);
8219
+ }
8195
8220
const typeParameters = parseTypeParameters();
8196
8221
parseExpected(SyntaxKind.EqualsToken);
8197
8222
const type = token() === SyntaxKind.IntrinsicKeyword && tryParse(parseKeywordAndNoDot) || parseType();
@@ -8215,6 +8240,9 @@ namespace Parser {
8215
8240
function parseEnumDeclaration(pos: number, hasJSDoc: boolean, modifiers: NodeArray<ModifierLike> | undefined): EnumDeclaration {
8216
8241
parseExpected(SyntaxKind.EnumKeyword);
8217
8242
const name = parseIdentifier();
8243
+ if (name.escapedText === "undefined") {
8244
+ parseErrorForDeclarationNamedUndefined(name);
8245
+ }
8218
8246
let members;
8219
8247
if (parseExpected(SyntaxKind.OpenBraceToken)) {
8220
8248
members = doOutsideOfYieldAndAwaitContext(() => parseDelimitedList(ParsingContext.EnumMembers, parseEnumMember));
@@ -8245,6 +8273,9 @@ namespace Parser {
8245
8273
// propagate the 'Namespace' flag across the names if set.
8246
8274
const namespaceFlag = flags & NodeFlags.Namespace;
8247
8275
const name = flags & NodeFlags.NestedNamespace ? parseIdentifierName() : parseIdentifier();
8276
+ if (name.escapedText === "undefined") {
8277
+ parseErrorForDeclarationNamedUndefined(name);
8278
+ }
8248
8279
const body = parseOptional(SyntaxKind.DotToken)
8249
8280
? parseModuleOrNamespaceDeclaration(getNodePos(), /*hasJSDoc*/ false, /*modifiers*/ undefined, NodeFlags.NestedNamespace | namespaceFlag) as NamespaceDeclaration
8250
8281
: parseModuleBlock();
0 commit comments