From 61731eefdfaaadaffa09b80ddd1b81fd17ffb37c Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 25 Jul 2014 16:17:30 -0700 Subject: [PATCH] Remove isSemicolon (fix #200) --- src/compiler/parser.ts | 11 +++-------- .../reference/asiAmbientFunctionDeclaration.js | 4 ++++ tests/baselines/reference/asiBreak.js | 6 ++++++ tests/baselines/reference/asiContinue.js | 6 ++++++ tests/baselines/reference/asiReturn.errors.txt | 5 +++++ tests/cases/compiler/asiAmbientFunctionDeclaration.ts | 1 + tests/cases/compiler/asiBreak.ts | 1 + tests/cases/compiler/asiContinue.ts | 1 + tests/cases/compiler/asiReturn.ts | 2 ++ 9 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 tests/baselines/reference/asiAmbientFunctionDeclaration.js create mode 100644 tests/baselines/reference/asiBreak.js create mode 100644 tests/baselines/reference/asiContinue.js create mode 100644 tests/baselines/reference/asiReturn.errors.txt create mode 100644 tests/cases/compiler/asiAmbientFunctionDeclaration.ts create mode 100644 tests/cases/compiler/asiBreak.ts create mode 100644 tests/cases/compiler/asiContinue.ts create mode 100644 tests/cases/compiler/asiReturn.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index ee0fcccb239..c3308934d54 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -676,11 +676,6 @@ module ts { return token === SyntaxKind.Identifier || (isInStrictMode ? token > SyntaxKind.LastFutureReservedWord : token > SyntaxKind.LastReservedWord); } - function isSemicolon(): boolean { - // True if real or automatic semicolon - return token === SyntaxKind.SemicolonToken || token === SyntaxKind.CloseBraceToken || scanner.hasPrecedingLineBreak(); - } - function parseExpected(t: SyntaxKind): boolean { if (token === t) { nextToken(); @@ -2361,7 +2356,7 @@ module ts { var keywordStart = scanner.getTokenPos(); var keywordLength = scanner.getTextPos() - keywordStart; parseExpected(kind === SyntaxKind.BreakStatement ? SyntaxKind.BreakKeyword : SyntaxKind.ContinueKeyword); - if (!isSemicolon()) node.label = parseIdentifier(); + if (!canParseSemicolon()) node.label = parseIdentifier(); parseSemicolon(); finishNode(node); @@ -2444,7 +2439,7 @@ module ts { var returnTokenLength = scanner.getTextPos() - returnTokenStart; parseExpected(SyntaxKind.ReturnKeyword); - if (!isSemicolon()) node.expression = parseExpression(); + if (!canParseSemicolon()) node.expression = parseExpression(); parseSemicolon(); // In an ambient context, we will already give an error for having a statement. @@ -2727,7 +2722,7 @@ module ts { } return body; } - if (isSemicolon()) { + if (canParseSemicolon()) { parseSemicolon(); return undefined; } diff --git a/tests/baselines/reference/asiAmbientFunctionDeclaration.js b/tests/baselines/reference/asiAmbientFunctionDeclaration.js new file mode 100644 index 00000000000..30b7e76056a --- /dev/null +++ b/tests/baselines/reference/asiAmbientFunctionDeclaration.js @@ -0,0 +1,4 @@ +//// [asiAmbientFunctionDeclaration.ts] +declare function foo() + +//// [asiAmbientFunctionDeclaration.js] diff --git a/tests/baselines/reference/asiBreak.js b/tests/baselines/reference/asiBreak.js new file mode 100644 index 00000000000..cd890f74de7 --- /dev/null +++ b/tests/baselines/reference/asiBreak.js @@ -0,0 +1,6 @@ +//// [asiBreak.ts] +while (true) break + +//// [asiBreak.js] +while (true) + break; diff --git a/tests/baselines/reference/asiContinue.js b/tests/baselines/reference/asiContinue.js new file mode 100644 index 00000000000..b2b9bc751cc --- /dev/null +++ b/tests/baselines/reference/asiContinue.js @@ -0,0 +1,6 @@ +//// [asiContinue.ts] +while (true) continue + +//// [asiContinue.js] +while (true) + continue; diff --git a/tests/baselines/reference/asiReturn.errors.txt b/tests/baselines/reference/asiReturn.errors.txt new file mode 100644 index 00000000000..7b7b44655c2 --- /dev/null +++ b/tests/baselines/reference/asiReturn.errors.txt @@ -0,0 +1,5 @@ +==== tests/cases/compiler/asiReturn.ts (1 errors) ==== + // This should be an error for using a return outside a function, but ASI should work properly + return + ~~~~~~ +!!! A 'return' statement can only be used within a function body. \ No newline at end of file diff --git a/tests/cases/compiler/asiAmbientFunctionDeclaration.ts b/tests/cases/compiler/asiAmbientFunctionDeclaration.ts new file mode 100644 index 00000000000..c29d38a8990 --- /dev/null +++ b/tests/cases/compiler/asiAmbientFunctionDeclaration.ts @@ -0,0 +1 @@ +declare function foo() \ No newline at end of file diff --git a/tests/cases/compiler/asiBreak.ts b/tests/cases/compiler/asiBreak.ts new file mode 100644 index 00000000000..ee846ec1018 --- /dev/null +++ b/tests/cases/compiler/asiBreak.ts @@ -0,0 +1 @@ +while (true) break \ No newline at end of file diff --git a/tests/cases/compiler/asiContinue.ts b/tests/cases/compiler/asiContinue.ts new file mode 100644 index 00000000000..6c0ddd398ba --- /dev/null +++ b/tests/cases/compiler/asiContinue.ts @@ -0,0 +1 @@ +while (true) continue \ No newline at end of file diff --git a/tests/cases/compiler/asiReturn.ts b/tests/cases/compiler/asiReturn.ts new file mode 100644 index 00000000000..4e3f11d8375 --- /dev/null +++ b/tests/cases/compiler/asiReturn.ts @@ -0,0 +1,2 @@ +// This should be an error for using a return outside a function, but ASI should work properly +return \ No newline at end of file