diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index e6d60eda89..79ee3f6da6 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1807,7 +1807,7 @@ module ts { // the code would be implicitly: "name.keyword; identifierNameOrKeyword". // In the first case though, ASI will not take effect because there is not a // line terminator after the keyword. - if (scanner.hasPrecedingLineBreak() && scanner.isReservedWord()) { + if (scanner.hasPrecedingLineBreak() && isIdentifierOrKeyword()) { let matchesPattern = lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine); if (matchesPattern) { diff --git a/tests/baselines/reference/errorRecoveryWithDotFollowedByNamespaceKeyword.errors.txt b/tests/baselines/reference/errorRecoveryWithDotFollowedByNamespaceKeyword.errors.txt new file mode 100644 index 0000000000..f22c018e9e --- /dev/null +++ b/tests/baselines/reference/errorRecoveryWithDotFollowedByNamespaceKeyword.errors.txt @@ -0,0 +1,18 @@ +tests/cases/compiler/errorRecoveryWithDotFollowedByNamespaceKeyword.ts(4,15): error TS1003: Identifier expected. +tests/cases/compiler/errorRecoveryWithDotFollowedByNamespaceKeyword.ts(9,2): error TS1005: '}' expected. + + +==== tests/cases/compiler/errorRecoveryWithDotFollowedByNamespaceKeyword.ts (2 errors) ==== + namespace A { + function foo() { + if (true) { + B. + +!!! error TS1003: Identifier expected. + + + namespace B { + export function baz() { } + } + +!!! error TS1005: '}' expected. \ No newline at end of file diff --git a/tests/baselines/reference/errorRecoveryWithDotFollowedByNamespaceKeyword.js b/tests/baselines/reference/errorRecoveryWithDotFollowedByNamespaceKeyword.js new file mode 100644 index 0000000000..7eccb5c25e --- /dev/null +++ b/tests/baselines/reference/errorRecoveryWithDotFollowedByNamespaceKeyword.js @@ -0,0 +1,26 @@ +//// [errorRecoveryWithDotFollowedByNamespaceKeyword.ts] +namespace A { + function foo() { + if (true) { + B. + + + namespace B { + export function baz() { } +} + +//// [errorRecoveryWithDotFollowedByNamespaceKeyword.js] +var A; +(function (A) { + function foo() { + if (true) { + B. + ; + var B; + (function (B) { + function baz() { } + B.baz = baz; + })(B || (B = {})); + } + } +})(A || (A = {})); diff --git a/tests/cases/compiler/errorRecoveryWithDotFollowedByNamespaceKeyword.ts b/tests/cases/compiler/errorRecoveryWithDotFollowedByNamespaceKeyword.ts new file mode 100644 index 0000000000..00d3c1cb60 --- /dev/null +++ b/tests/cases/compiler/errorRecoveryWithDotFollowedByNamespaceKeyword.ts @@ -0,0 +1,9 @@ +namespace A { + function foo() { + if (true) { + B. + + + namespace B { + export function baz() { } +} \ No newline at end of file diff --git a/tests/cases/fourslash/completionWithDotFollowedByNamespaceKeyword.ts b/tests/cases/fourslash/completionWithDotFollowedByNamespaceKeyword.ts new file mode 100644 index 0000000000..1526224eb2 --- /dev/null +++ b/tests/cases/fourslash/completionWithDotFollowedByNamespaceKeyword.ts @@ -0,0 +1,12 @@ +/// + +////namespace A { +//// function foo() { +//// if (true) { +//// B./**/ +//// namespace B { +//// export function baz() { } +////} + +goTo.marker(); +verify.completionListContains("baz", "function B.baz(): void"); \ No newline at end of file