Fix incorrect line text computation to stop comment directive searching

Fixes #38289
This commit is contained in:
Sheetal Nandi
2020-05-01 16:29:30 -07:00
parent b57dd52afa
commit 168be30fe1
6 changed files with 107 additions and 4 deletions
+1 -1
View File
@@ -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;
}
@@ -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';
// @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.
+12 -1
View File
@@ -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
@@ -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))
@@ -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
@@ -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