@@ -3923,6 +3923,9 @@ namespace Parser {
3923
3923
const pos = getNodePos();
3924
3924
const modifiers = parseModifiers(/*allowDecorators*/ false, /*permitConstAsModifier*/ true);
3925
3925
const name = parseIdentifier();
3926
+ if (name.escapedText === "undefined") {
3927
+ parseErrorAtRange(name, Diagnostics.Type_parameter_name_cannot_be_0, "undefined");
3928
+ }
3926
3929
let constraint: TypeNode | undefined;
3927
3930
let expression: Expression | undefined;
3928
3931
if (parseOptional(SyntaxKind.ExtendsKeyword)) {
@@ -4369,6 +4372,9 @@ namespace Parser {
4369
4372
function parseMappedTypeParameter() {
4370
4373
const pos = getNodePos();
4371
4374
const name = parseIdentifierName();
4375
+ if (name.escapedText === "undefined") {
4376
+ parseErrorAtRange(name, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "undefined");
4377
+ }
4372
4378
parseExpected(SyntaxKind.InKeyword);
4373
4379
const type = parseType();
4374
4380
return finishNode(factory.createTypeParameterDeclaration(/*modifiers*/ undefined, name, type, /*defaultType*/ undefined), pos);
@@ -4733,6 +4739,9 @@ namespace Parser {
4733
4739
function parseTypeParameterOfInferType(): TypeParameterDeclaration {
4734
4740
const pos = getNodePos();
4735
4741
const name = parseIdentifier();
4742
+ if (name.escapedText === "undefined") {
4743
+ parseErrorAtRange(name, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "undefined");
4744
+ }
4736
4745
const constraint = tryParse(tryParseConstraintOfInferType);
4737
4746
const node = factory.createTypeParameterDeclaration(/*modifiers*/ undefined, name, constraint);
4738
4747
return finishNode(node, pos);
@@ -8097,6 +8106,9 @@ namespace Parser {
8097
8106
8098
8107
// We don't parse the name here in await context, instead we will report a grammar error in the checker.
8099
8108
const name = parseNameOfClassDeclarationOrExpression();
8109
+ if (name?.escapedText === "undefined") {
8110
+ parseErrorAtRange(name, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "undefined");
8111
+ }
8100
8112
const typeParameters = parseTypeParameters();
8101
8113
if (some(modifiers, isExportModifier)) setAwaitContext(/*value*/ true);
8102
8114
const heritageClauses = parseHeritageClauses();
@@ -8179,6 +8191,9 @@ namespace Parser {
8179
8191
function parseInterfaceDeclaration(pos: number, hasJSDoc: boolean, modifiers: NodeArray<ModifierLike> | undefined): InterfaceDeclaration {
8180
8192
parseExpected(SyntaxKind.InterfaceKeyword);
8181
8193
const name = parseIdentifier();
8194
+ if (name.escapedText === "undefined") {
8195
+ parseErrorAtRange(name, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "undefined");
8196
+ }
8182
8197
const typeParameters = parseTypeParameters();
8183
8198
const heritageClauses = parseHeritageClauses();
8184
8199
const members = parseObjectTypeMembers();
@@ -8192,6 +8207,9 @@ namespace Parser {
8192
8207
parseErrorAtCurrentToken(Diagnostics.Line_break_not_permitted_here);
8193
8208
}
8194
8209
const name = parseIdentifier();
8210
+ if (name.escapedText === "undefined") {
8211
+ parseErrorAtRange(name, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "undefined");
8212
+ }
8195
8213
const typeParameters = parseTypeParameters();
8196
8214
parseExpected(SyntaxKind.EqualsToken);
8197
8215
const type = token() === SyntaxKind.IntrinsicKeyword && tryParse(parseKeywordAndNoDot) || parseType();
@@ -8215,6 +8233,9 @@ namespace Parser {
8215
8233
function parseEnumDeclaration(pos: number, hasJSDoc: boolean, modifiers: NodeArray<ModifierLike> | undefined): EnumDeclaration {
8216
8234
parseExpected(SyntaxKind.EnumKeyword);
8217
8235
const name = parseIdentifier();
8236
+ if (name.escapedText === "undefined") {
8237
+ parseErrorAtRange(name, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "undefined");
8238
+ }
8218
8239
let members;
8219
8240
if (parseExpected(SyntaxKind.OpenBraceToken)) {
8220
8241
members = doOutsideOfYieldAndAwaitContext(() => parseDelimitedList(ParsingContext.EnumMembers, parseEnumMember));
@@ -8245,6 +8266,9 @@ namespace Parser {
8245
8266
// propagate the 'Namespace' flag across the names if set.
8246
8267
const namespaceFlag = flags & NodeFlags.Namespace;
8247
8268
const name = flags & NodeFlags.NestedNamespace ? parseIdentifierName() : parseIdentifier();
8269
+ if (name.escapedText === "undefined") {
8270
+ parseErrorAtRange(name, Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "undefined");
8271
+ }
8248
8272
const body = parseOptional(SyntaxKind.DotToken)
8249
8273
? parseModuleOrNamespaceDeclaration(getNodePos(), /*hasJSDoc*/ false, /*modifiers*/ undefined, NodeFlags.NestedNamespace | namespaceFlag) as NamespaceDeclaration
8250
8274
: parseModuleBlock();
0 commit comments