From 168be30fe15215fade86eb67ad630feb6cf9308a Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 1 May 2020 16:29:30 -0700 Subject: [PATCH] Fix incorrect line text computation to stop comment directive searching Fixes #38289 --- src/compiler/program.ts | 2 +- .../reference/ts-expect-error.errors.txt | 19 ++++++- tests/baselines/reference/ts-expect-error.js | 13 ++++- .../reference/ts-expect-error.symbols | 21 ++++++++ .../baselines/reference/ts-expect-error.types | 49 +++++++++++++++++++ .../conformance/directives/ts-expect-error.ts | 7 +++ 6 files changed, 107 insertions(+), 4 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index d06ee2cd0205a..437ec09e8b8ce 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1803,7 +1803,7 @@ namespace ts { } // Stop searching if the line is not empty and not a comment - const lineText = file.text.slice(lineStarts[line - 1], lineStarts[line]).trim(); + const lineText = file.text.slice(lineStarts[line], lineStarts[line + 1]).trim(); if (lineText !== "" && !/^(\s*)\/\/(.*)$/.test(lineText)) { return -1; } diff --git a/tests/baselines/reference/ts-expect-error.errors.txt b/tests/baselines/reference/ts-expect-error.errors.txt index 7ffda9dbf1f9e..24e7ddd0d6edb 100644 --- a/tests/baselines/reference/ts-expect-error.errors.txt +++ b/tests/baselines/reference/ts-expect-error.errors.txt @@ -1,9 +1,12 @@ tests/cases/conformance/directives/ts-expect-error.ts(4,1): error TS2578: Unused '@ts-expect-error' directive. tests/cases/conformance/directives/ts-expect-error.ts(10,1): error TS2578: Unused '@ts-expect-error' directive. tests/cases/conformance/directives/ts-expect-error.ts(13,5): error TS2322: Type '"nope"' is not assignable to type 'number'. +tests/cases/conformance/directives/ts-expect-error.ts(19,2): error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap. +tests/cases/conformance/directives/ts-expect-error.ts(21,2): error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap. +tests/cases/conformance/directives/ts-expect-error.ts(22,2): error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap. -==== tests/cases/conformance/directives/ts-expect-error.ts (3 errors) ==== +==== tests/cases/conformance/directives/ts-expect-error.ts (6 errors) ==== // @ts-expect-error additional commenting var invalidCommentedFancy: number = 'nope'; @@ -25,4 +28,16 @@ tests/cases/conformance/directives/ts-expect-error.ts(13,5): error TS2322: Type !!! error TS2322: Type '"nope"' is not assignable to type 'number'. var validPlain: string = 'nope'; - \ No newline at end of file + + // @ts-expect-error + (({ a: true } as const).a === false); // <-- compiles (as expected via comment) + (({ a: true } as const).a === false); // Should error + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap. + + (({ a: true } as const).a === false); // error + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap. + (({ a: true } as const).a === false); // error + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap. \ No newline at end of file diff --git a/tests/baselines/reference/ts-expect-error.js b/tests/baselines/reference/ts-expect-error.js index f37316d92b73c..88dc6ba3aa6ea 100644 --- a/tests/baselines/reference/ts-expect-error.js +++ b/tests/baselines/reference/ts-expect-error.js @@ -14,7 +14,13 @@ var validCommentedPlain: string = 'nope'; var invalidPlain: number = 'nope'; var validPlain: string = 'nope'; - + +// @ts-expect-error +(({ a: true } as const).a === false); // <-- compiles (as expected via comment) +(({ a: true } as const).a === false); // Should error + +(({ a: true } as const).a === false); // error +(({ a: true } as const).a === false); // error //// [ts-expect-error.js] // @ts-expect-error additional commenting @@ -27,3 +33,8 @@ var invalidCommentedPlain = 'nope'; var validCommentedPlain = 'nope'; var invalidPlain = 'nope'; var validPlain = 'nope'; +// @ts-expect-error +({ a: true }.a === false); // <-- compiles (as expected via comment) +({ a: true }.a === false); // Should error +({ a: true }.a === false); // error +({ a: true }.a === false); // error diff --git a/tests/baselines/reference/ts-expect-error.symbols b/tests/baselines/reference/ts-expect-error.symbols index fec43e1eb2e01..434287cace708 100644 --- a/tests/baselines/reference/ts-expect-error.symbols +++ b/tests/baselines/reference/ts-expect-error.symbols @@ -21,3 +21,24 @@ var invalidPlain: number = 'nope'; var validPlain: string = 'nope'; >validPlain : Symbol(validPlain, Decl(ts-expect-error.ts, 14, 3)) +// @ts-expect-error +(({ a: true } as const).a === false); // <-- compiles (as expected via comment) +>({ a: true } as const).a : Symbol(a, Decl(ts-expect-error.ts, 17, 3)) +>a : Symbol(a, Decl(ts-expect-error.ts, 17, 3)) +>a : Symbol(a, Decl(ts-expect-error.ts, 17, 3)) + +(({ a: true } as const).a === false); // Should error +>({ a: true } as const).a : Symbol(a, Decl(ts-expect-error.ts, 18, 3)) +>a : Symbol(a, Decl(ts-expect-error.ts, 18, 3)) +>a : Symbol(a, Decl(ts-expect-error.ts, 18, 3)) + +(({ a: true } as const).a === false); // error +>({ a: true } as const).a : Symbol(a, Decl(ts-expect-error.ts, 20, 3)) +>a : Symbol(a, Decl(ts-expect-error.ts, 20, 3)) +>a : Symbol(a, Decl(ts-expect-error.ts, 20, 3)) + +(({ a: true } as const).a === false); // error +>({ a: true } as const).a : Symbol(a, Decl(ts-expect-error.ts, 21, 3)) +>a : Symbol(a, Decl(ts-expect-error.ts, 21, 3)) +>a : Symbol(a, Decl(ts-expect-error.ts, 21, 3)) + diff --git a/tests/baselines/reference/ts-expect-error.types b/tests/baselines/reference/ts-expect-error.types index e338b276b7c5c..c010046d36fbe 100644 --- a/tests/baselines/reference/ts-expect-error.types +++ b/tests/baselines/reference/ts-expect-error.types @@ -27,3 +27,52 @@ var validPlain: string = 'nope'; >validPlain : string >'nope' : "nope" +// @ts-expect-error +(({ a: true } as const).a === false); // <-- compiles (as expected via comment) +>(({ a: true } as const).a === false) : boolean +>({ a: true } as const).a === false : boolean +>({ a: true } as const).a : true +>({ a: true } as const) : { readonly a: true; } +>{ a: true } as const : { readonly a: true; } +>{ a: true } : { readonly a: true; } +>a : true +>true : true +>a : true +>false : false + +(({ a: true } as const).a === false); // Should error +>(({ a: true } as const).a === false) : boolean +>({ a: true } as const).a === false : boolean +>({ a: true } as const).a : true +>({ a: true } as const) : { readonly a: true; } +>{ a: true } as const : { readonly a: true; } +>{ a: true } : { readonly a: true; } +>a : true +>true : true +>a : true +>false : false + +(({ a: true } as const).a === false); // error +>(({ a: true } as const).a === false) : boolean +>({ a: true } as const).a === false : boolean +>({ a: true } as const).a : true +>({ a: true } as const) : { readonly a: true; } +>{ a: true } as const : { readonly a: true; } +>{ a: true } : { readonly a: true; } +>a : true +>true : true +>a : true +>false : false + +(({ a: true } as const).a === false); // error +>(({ a: true } as const).a === false) : boolean +>({ a: true } as const).a === false : boolean +>({ a: true } as const).a : true +>({ a: true } as const) : { readonly a: true; } +>{ a: true } as const : { readonly a: true; } +>{ a: true } : { readonly a: true; } +>a : true +>true : true +>a : true +>false : false + diff --git a/tests/cases/conformance/directives/ts-expect-error.ts b/tests/cases/conformance/directives/ts-expect-error.ts index 5baea77dc51e4..78c25dc4591f4 100644 --- a/tests/cases/conformance/directives/ts-expect-error.ts +++ b/tests/cases/conformance/directives/ts-expect-error.ts @@ -13,3 +13,10 @@ var validCommentedPlain: string = 'nope'; var invalidPlain: number = 'nope'; var validPlain: string = 'nope'; + +// @ts-expect-error +(({ a: true } as const).a === false); // <-- compiles (as expected via comment) +(({ a: true } as const).a === false); // Should error + +(({ a: true } as const).a === false); // error +(({ a: true } as const).a === false); // error \ No newline at end of file