From 171a5f8098831990e8829f5ced2b3cc8827cbea0 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 12 Mar 2015 10:58:16 -0700 Subject: [PATCH 1/2] correctly parse destructuring in let outside of strict mode --- src/compiler/parser.ts | 9 +++++++-- tests/baselines/reference/letInNonStrictMode.js | 11 +++++++++++ tests/baselines/reference/letInNonStrictMode.types | 11 +++++++++++ tests/cases/compiler/letInNonStrictMode.ts | 2 ++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/letInNonStrictMode.js create mode 100644 tests/baselines/reference/letInNonStrictMode.types create mode 100644 tests/cases/compiler/letInNonStrictMode.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 6e444eb23c7f5..7656e2eb2c9eb 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2975,6 +2975,11 @@ module ts { return !scanner.hasPrecedingLineBreak() && isIdentifier() } + function netTokenIsIdentifierOrStartOfDestructuringOnTheSameLine() { + nextToken(); + return !scanner.hasPrecedingLineBreak() && (isIdentifier() || token === SyntaxKind.OpenBraceToken || token === SyntaxKind.OpenBracketToken) + } + function parseYieldExpression(): YieldExpression { var node = createNode(SyntaxKind.YieldExpression); @@ -4873,9 +4878,9 @@ module ts { } function isLetDeclaration() { - // It is let declaration if in strict mode or next token is identifier on same line. + // It is let declaration if in strict mode or next token is identifier\open brace\open curly on same line. // otherwise it needs to be treated like identifier - return inStrictModeContext() || lookAhead(nextTokenIsIdentifierOnSameLine); + return inStrictModeContext() || lookAhead(netTokenIsIdentifierOrStartOfDestructuringOnTheSameLine); } function isDeclarationStart(): boolean { diff --git a/tests/baselines/reference/letInNonStrictMode.js b/tests/baselines/reference/letInNonStrictMode.js new file mode 100644 index 0000000000000..af21ce3281c39 --- /dev/null +++ b/tests/baselines/reference/letInNonStrictMode.js @@ -0,0 +1,11 @@ +//// [letInNonStrictMode.ts] +let [x] = [1]; +let {a: y} = {a: 1}; + +//// [letInNonStrictMode.js] +var x = ([ + 1 +])[0]; +var y = ({ + a: 1 +}).a; diff --git a/tests/baselines/reference/letInNonStrictMode.types b/tests/baselines/reference/letInNonStrictMode.types new file mode 100644 index 0000000000000..4f2cbe4a70386 --- /dev/null +++ b/tests/baselines/reference/letInNonStrictMode.types @@ -0,0 +1,11 @@ +=== tests/cases/compiler/letInNonStrictMode.ts === +let [x] = [1]; +>x : number +>[1] : [number] + +let {a: y} = {a: 1}; +>a : unknown +>y : number +>{a: 1} : { a: number; } +>a : number + diff --git a/tests/cases/compiler/letInNonStrictMode.ts b/tests/cases/compiler/letInNonStrictMode.ts new file mode 100644 index 0000000000000..576246e76a1b5 --- /dev/null +++ b/tests/cases/compiler/letInNonStrictMode.ts @@ -0,0 +1,2 @@ +let [x] = [1]; +let {a: y} = {a: 1}; \ No newline at end of file From e46442f45f99f3277d6e2fc222402c5051379c6f Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 13 Mar 2015 12:08:58 -0700 Subject: [PATCH 2/2] addressed PR feedback: fixed typo in function name --- src/compiler/parser.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 7656e2eb2c9eb..2620c23398bec 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2975,9 +2975,10 @@ module ts { return !scanner.hasPrecedingLineBreak() && isIdentifier() } - function netTokenIsIdentifierOrStartOfDestructuringOnTheSameLine() { + function nextTokenIsIdentifierOrStartOfDestructuringOnTheSameLine() { nextToken(); - return !scanner.hasPrecedingLineBreak() && (isIdentifier() || token === SyntaxKind.OpenBraceToken || token === SyntaxKind.OpenBracketToken) + return !scanner.hasPrecedingLineBreak() && + (isIdentifier() || token === SyntaxKind.OpenBraceToken || token === SyntaxKind.OpenBracketToken); } function parseYieldExpression(): YieldExpression { @@ -4878,9 +4879,9 @@ module ts { } function isLetDeclaration() { - // It is let declaration if in strict mode or next token is identifier\open brace\open curly on same line. + // It is let declaration if in strict mode or next token is identifier\open bracket\open curly on same line. // otherwise it needs to be treated like identifier - return inStrictModeContext() || lookAhead(netTokenIsIdentifierOrStartOfDestructuringOnTheSameLine); + return inStrictModeContext() || lookAhead(nextTokenIsIdentifierOrStartOfDestructuringOnTheSameLine); } function isDeclarationStart(): boolean {