Skip to content

Commit e38a0ce

Browse files
committed
fix missing opening brace match error
1 parent 3cb457a commit e38a0ce

6 files changed

+47
-17
lines changed

src/compiler/parser.ts

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,7 +1555,10 @@ namespace ts {
15551555
return false;
15561556
}
15571557

1558-
function parseExpectedMatchingBrackets(openKind: SyntaxKind, closeKind: SyntaxKind, openPosition: number) {
1558+
function parseExpectedMatchingBrackets(openKind: SyntaxKind, closeKind: SyntaxKind, openParsed: boolean, openPosition: number) {
1559+
if (!openParsed) {
1560+
return parseExpected(closeKind);
1561+
}
15591562
if (token() === closeKind) {
15601563
nextToken();
15611564
return;
@@ -5499,10 +5502,10 @@ namespace ts {
54995502
function parseArrayLiteralExpression(): ArrayLiteralExpression {
55005503
const pos = getNodePos();
55015504
const openBracketPosition = scanner.getTokenPos();
5502-
parseExpected(SyntaxKind.OpenBracketToken);
5505+
const openBracketParsed = parseExpected(SyntaxKind.OpenBracketToken);
55035506
const multiLine = scanner.hasPrecedingLineBreak();
55045507
const elements = parseDelimitedList(ParsingContext.ArrayLiteralMembers, parseArgumentOrArrayLiteralElement);
5505-
parseExpectedMatchingBrackets(SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken, openBracketPosition);
5508+
parseExpectedMatchingBrackets(SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken, openBracketParsed, openBracketPosition);
55065509
return finishNode(factory.createArrayLiteralExpression(elements, multiLine), pos);
55075510
}
55085511

@@ -5568,10 +5571,10 @@ namespace ts {
55685571
function parseObjectLiteralExpression(): ObjectLiteralExpression {
55695572
const pos = getNodePos();
55705573
const openBracePosition = scanner.getTokenPos();
5571-
parseExpected(SyntaxKind.OpenBraceToken);
5574+
const openBraceParsed = parseExpected(SyntaxKind.OpenBraceToken);
55725575
const multiLine = scanner.hasPrecedingLineBreak();
55735576
const properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralElement, /*considerSemicolonAsDelimiter*/ true);
5574-
parseExpectedMatchingBrackets(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken, openBracePosition);
5577+
parseExpectedMatchingBrackets(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken, openBraceParsed, openBracePosition);
55755578
return finishNode(factory.createObjectLiteralExpression(properties, multiLine), pos);
55765579
}
55775580

@@ -5654,10 +5657,11 @@ namespace ts {
56545657
const pos = getNodePos();
56555658
const hasJSDoc = hasPrecedingJSDocComment();
56565659
const openBracePosition = scanner.getTokenPos();
5657-
if (parseExpected(SyntaxKind.OpenBraceToken, diagnosticMessage) || ignoreMissingOpenBrace) {
5660+
const openBraceParsed = parseExpected(SyntaxKind.OpenBraceToken, diagnosticMessage)
5661+
if (openBraceParsed || ignoreMissingOpenBrace) {
56585662
const multiLine = scanner.hasPrecedingLineBreak();
56595663
const statements = parseList(ParsingContext.BlockStatements, parseStatement);
5660-
parseExpectedMatchingBrackets(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken, openBracePosition);
5664+
parseExpectedMatchingBrackets(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken, openBraceParsed, openBracePosition);
56615665
const result = withJSDoc(finishNode(factory.createBlock(statements, multiLine), pos), hasJSDoc);
56625666
if (token() === SyntaxKind.EqualsToken) {
56635667
parseErrorAtCurrentToken(Diagnostics.Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_destructuring_assignment_you_might_need_to_wrap_the_the_whole_assignment_in_parentheses);
@@ -5714,9 +5718,9 @@ namespace ts {
57145718
const hasJSDoc = hasPrecedingJSDocComment();
57155719
parseExpected(SyntaxKind.IfKeyword);
57165720
const openParenPosition = scanner.getTokenPos();
5717-
parseExpected(SyntaxKind.OpenParenToken);
5721+
const openParenParsed = parseExpected(SyntaxKind.OpenParenToken);
57185722
const expression = allowInAnd(parseExpression);
5719-
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenPosition);
5723+
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenParsed, openParenPosition)
57205724
const thenStatement = parseStatement();
57215725
const elseStatement = parseOptional(SyntaxKind.ElseKeyword) ? parseStatement() : undefined;
57225726
return withJSDoc(finishNode(factory.createIfStatement(expression, thenStatement, elseStatement), pos), hasJSDoc);
@@ -5729,9 +5733,9 @@ namespace ts {
57295733
const statement = parseStatement();
57305734
parseExpected(SyntaxKind.WhileKeyword);
57315735
const openParenPosition = scanner.getTokenPos();
5732-
parseExpected(SyntaxKind.OpenParenToken);
5736+
const openParenParsed = parseExpected(SyntaxKind.OpenParenToken);
57335737
const expression = allowInAnd(parseExpression);
5734-
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenPosition);
5738+
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenParsed, openParenPosition)
57355739

57365740
// From: https://mail.mozilla.org/pipermail/es-discuss/2011-August/016188.html
57375741
// 157 min --- All allen at wirfs-brock.com CONF --- "do{;}while(false)false" prohibited in
@@ -5746,9 +5750,9 @@ namespace ts {
57465750
const hasJSDoc = hasPrecedingJSDocComment();
57475751
parseExpected(SyntaxKind.WhileKeyword);
57485752
const openParenPosition = scanner.getTokenPos();
5749-
parseExpected(SyntaxKind.OpenParenToken);
5753+
const openParenParsed = parseExpected(SyntaxKind.OpenParenToken);
57505754
const expression = allowInAnd(parseExpression);
5751-
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenPosition);
5755+
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenParsed, openParenPosition);
57525756
const statement = parseStatement();
57535757
return withJSDoc(finishNode(factory.createWhileStatement(expression, statement), pos), hasJSDoc);
57545758
}
@@ -5825,9 +5829,9 @@ namespace ts {
58255829
const hasJSDoc = hasPrecedingJSDocComment();
58265830
parseExpected(SyntaxKind.WithKeyword);
58275831
const openParenPosition = scanner.getTokenPos();
5828-
parseExpected(SyntaxKind.OpenParenToken);
5832+
const openParenParsed = parseExpected(SyntaxKind.OpenParenToken);
58295833
const expression = allowInAnd(parseExpression);
5830-
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenPosition);
5834+
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenParsed, openParenPosition);
58315835
const statement = doInsideOfContext(NodeFlags.InWithStatement, parseStatement);
58325836
return withJSDoc(finishNode(factory.createWithStatement(expression, statement), pos), hasJSDoc);
58335837
}

tests/baselines/reference/reservedWords2.errors.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ tests/cases/compiler/reservedWords2.ts(12,17): error TS1138: Parameter declarati
4545
!!! error TS2580: Cannot find name 'require'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node`.
4646
~
4747
!!! error TS1005: ')' expected.
48-
!!! related TS1007 tests/cases/compiler/reservedWords2.ts:1:14: The parser expected to find a ')' to match the '(' token here.
4948
import * as while from "foo"
5049

5150
!!! error TS2300: Duplicate identifier '(Missing)'.
@@ -59,7 +58,6 @@ tests/cases/compiler/reservedWords2.ts(12,17): error TS1138: Parameter declarati
5958
!!! error TS2304: Cannot find name 'from'.
6059
~~~~~
6160
!!! error TS1005: ')' expected.
62-
!!! related TS1007 tests/cases/compiler/reservedWords2.ts:2:20: The parser expected to find a ')' to match the '(' token here.
6361

6462
var typeof = 10;
6563
~~~~~~
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
////do {/*1*/
4+
5+
goTo.marker("1");
6+
edit.insert("\n");
7+
verify.indentationIs(4);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
////if /*1*/
4+
5+
goTo.marker("1");
6+
edit.insert("\n");
7+
verify.indentationIs(4);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
////while /*1*/
4+
5+
goTo.marker("1");
6+
edit.insert("\n");
7+
verify.indentationIs(4);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/// <reference path='fourslash.ts'/>
2+
3+
////with /*1*/
4+
5+
goTo.marker("1");
6+
edit.insert("\n");
7+
verify.indentationIs(0);

0 commit comments

Comments
 (0)