fix(parser): parse class implements with implements as the class name (#22801)

This commit is contained in:
Boshen committed 2026-05-28 14:55:00 +00:00
1 parent 9c71f2ebe6
commit 842ed1c981
3 files changed
+82 -7

No files matched your search

+4 -1
View File
@@ -73,7 +73,10 @@ impl<'a, C: Config> ParserImpl<'a, C> {
start_span = d.span.start;
}
let id = if self.cur_kind().is_binding_identifier() && !self.at(Kind::Implements) {
let id = if self.cur_kind().is_binding_identifier()
&& !(self.at(Kind::Implements)
&& self.lexer.peek_token().kind().is_identifier_or_keyword())
{
Some(self.parse_binding_identifier())
} else {
None
@@ -1,7 +1,7 @@
commit: e5509e21
parser_typescript Summary:
AST Parsed : 9829/9832 (99.97%)
AST Parsed : 9830/9832 (99.98%)
Positive Passed: 9818/9832 (99.86%)
Negative Passed: 1532/2587 (59.22%)
Expect Syntax Error: tasks/coverage/typescript/tests/cases/compiler/FunctionDeclaration3.ts
@@ -2306,7 +2306,7 @@ Expect to Parse: tasks/coverage/typescript/tests/cases/compiler/constDeclaration
19 │ const c5 = 0;
╰────
Panicked: tasks/coverage/typescript/tests/cases/compiler/convertKeywordsYes.ts
Expect to Parse: tasks/coverage/typescript/tests/cases/compiler/convertKeywordsYes.ts
× Classes can't have a field named 'constructor'
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:175:12]
@@ -2316,14 +2316,78 @@ Panicked: tasks/coverage/typescript/tests/cases/compiler/convertKeywordsYes.ts
176 │ public any = 0;
╰────
× Unexpected token
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:292:22]
× The keyword 'implements' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:292:11]
291 │ class constructor { }
292 │ class implements { }
· ─
· ──────────
293 │ class interface { }
╰────
× The keyword 'interface' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:293:11]
292 │ class implements { }
293 │ class interface { }
· ─────────
294 │ class let { }
╰────
× The keyword 'let' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:294:11]
293 │ class interface { }
294 │ class let { }
· ───
295 │ class module { }
╰────
× The keyword 'package' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:296:11]
295 │ class module { }
296 │ class package { }
· ───────
297 │ class private { }
╰────
× The keyword 'private' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:297:11]
296 │ class package { }
297 │ class private { }
· ───────
298 │ class protected { }
╰────
× The keyword 'protected' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:298:11]
297 │ class private { }
298 │ class protected { }
· ─────────
299 │ class public { }
╰────
× The keyword 'public' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:299:11]
298 │ class protected { }
299 │ class public { }
· ──────
300 │ class set { }
╰────
× The keyword 'static' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:301:11]
300 │ class set { }
301 │ class static { }
· ──────
302 │ class get { }
╰────
× The keyword 'yield' is reserved
╭─[typescript/tests/cases/compiler/convertKeywordsYes.ts:303:11]
302 │ class get { }
303 │ class yield { }
· ─────
304 │ class declare { }
╰────
Expect to Parse: tasks/coverage/typescript/tests/cases/compiler/es5-asyncFunctionWithStatements.ts
× 'with' statements are not allowed
@@ -4008,7 +4008,15 @@ rebuilt : ["cond"]
semantic Error: tasks/coverage/typescript/tests/cases/compiler/convertKeywordsYes.ts
Classes can't have a field named 'constructor'
Unexpected token
The keyword 'implements' is reserved
The keyword 'interface' is reserved
The keyword 'let' is reserved
The keyword 'package' is reserved
The keyword 'private' is reserved
The keyword 'protected' is reserved
The keyword 'public' is reserved
The keyword 'static' is reserved
The keyword 'yield' is reserved
semantic Error: tasks/coverage/typescript/tests/cases/compiler/correlatedUnions.ts
Bindings mismatch: