8000 Check for lenght of declaration instead · nycdotnet/TypeScript@0784ea1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0784ea1

Browse files
author
Yui T
committed
Check for lenght of declaration instead
1 parent 58a83f1 commit 0784ea1

File tree

1 file changed

+26
-21
lines changed

1 file changed

+26
-21
lines changed

src/compiler/checker.ts

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15967,33 +15967,38 @@ namespace ts {
1596715967
if (forInOrOfStatement.initializer.kind === SyntaxKind.VariableDeclarationList) {
1596815968
const variableList = <VariableDeclarationList>forInOrOfStatement.initializer;
1596915969
if (!checkGrammarVariableDeclarationList(variableList)) {
15970-
if (variableList.declarations.length > 1) {
15971-
const diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement
15972-
? Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement
15973-
: Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement;
15974-
return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic);
15975-
}
15976-
const firstDeclaration = variableList.declarations[0];
15970+
const declarations = variableList.declarations;
1597715971

15978-
// firstDeclaration can be undefined if there is variable declaration in for-of or for-in
15972+
// declarations.length can be zero if there is an error in variable declaration in for-of or for-in
1597915973
// See http://www.ecma-international.org/ecma-262/6.0/#sec-for-in-and-for-of-statements for details
1598015974
// For example:
1598115975
// var let = 10;
1598215976
// for (let of [1,2,3]) {} // this is invalid ES6 syntax
1598315977
// for (let in [1,2,3]) {} // this is invalid ES6 syntax
15984-
if (firstDeclaration) {
15985-
if (firstDeclaration.initializer) {
15986-
const diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement
15987-
? Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer
15988-
: Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer;
15989-
return grammarErrorOnNode(firstDeclaration.name, diagnostic);
15990-
}
15991-
if (firstDeclaration.type) {
15992-
const diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement
15993-
? Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation
15994-
: Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation;
15995-
return grammarErrorOnNode(firstDeclaration, diagnostic);
15996-
}
15978+
// We will then want to skip on grammar checking on variableList declaration
15979+
if (!declarations.length) {
15980+
return false;
15981+
}
15982+
15983+
if (declarations.length > 1) {
15984+
const diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement
15985+
? Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement
15986+
: Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement;
15987+
return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic);
15988+
}
15989+
const firstDeclaration = declarations[0];
15990+
15991+
if (firstDeclaration.initializer) {
15992+
const diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement
15993+
? Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer
15994+
: Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer;
15995+
return grammarErrorOnNode(firstDeclaration.name, diagnostic);
15996+
}
15997+
if (firstDeclaration.type) {
15998+
const diagnostic = forInOrOfStatement.kind === SyntaxKind.ForInStatement
15999+
? Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation
16000+
: Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation;
16001+
return grammarErrorOnNode(firstDeclaration, diagnostic);
1599716002
}
1599816003
}
1599916004
}

0 commit comments

Comments
 (0)
0