Skip to content

Commit 67ca514

Browse files
TypeScript Botsheetalkamat
TypeScript Bot
andauthored
Cherry-pick PR #38296 into release-3.9 (#38297)
Component commits: 168be30 Fix incorrect line text computation to stop comment directive searching Fixes #38289 Co-authored-by: Sheetal Nandi <[email protected]>
1 parent 53ee194 commit 67ca514

File tree

6 files changed

+107
-4
lines changed

6 files changed

+107
-4
lines changed

src/compiler/program.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1803,7 +1803,7 @@ namespace ts {
18031803
}
18041804

18051805
// Stop searching if the line is not empty and not a comment
1806-
const lineText = file.text.slice(lineStarts[line - 1], lineStarts[line]).trim();
1806+
const lineText = file.text.slice(lineStarts[line], lineStarts[line + 1]).trim();
18071807
if (lineText !== "" && !/^(\s*)\/\/(.*)$/.test(lineText)) {
18081808
return -1;
18091809
}

tests/baselines/reference/ts-expect-error.errors.txt

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
tests/cases/conformance/directives/ts-expect-error.ts(4,1): error TS2578: Unused '@ts-expect-error' directive.
22
tests/cases/conformance/directives/ts-expect-error.ts(10,1): error TS2578: Unused '@ts-expect-error' directive.
33
tests/cases/conformance/directives/ts-expect-error.ts(13,5): error TS2322: Type '"nope"' is not assignable to type 'number'.
4+
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.
5+
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.
6+
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.
47

58

6-
==== tests/cases/conformance/directives/ts-expect-error.ts (3 errors) ====
9+
==== tests/cases/conformance/directives/ts-expect-error.ts (6 errors) ====
710
// @ts-expect-error additional commenting
811
var invalidCommentedFancy: number = 'nope';
912

@@ -25,4 +28,16 @@ tests/cases/conformance/directives/ts-expect-error.ts(13,5): error TS2322: Type
2528
!!! error TS2322: Type '"nope"' is not assignable to type 'number'.
2629

2730
var validPlain: string = 'nope';
28-
31+
32+
// @ts-expect-error
33+
(({ a: true } as const).a === false); // <-- compiles (as expected via comment)
34+
(({ a: true } as const).a === false); // Should error
35+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
36+
!!! error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap.
37+
38+
(({ a: true } as const).a === false); // error
39+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
40+
!!! error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap.
41+
(({ a: true } as const).a === false); // error
42+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
43+
!!! error TS2367: This condition will always return 'false' since the types 'true' and 'false' have no overlap.

tests/baselines/reference/ts-expect-error.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ var validCommentedPlain: string = 'nope';
1414
var invalidPlain: number = 'nope';
1515

1616
var validPlain: string = 'nope';
17-
17+
18+
// @ts-expect-error
19+
(({ a: true } as const).a === false); // <-- compiles (as expected via comment)
20+
(({ a: true } as const).a === false); // Should error
21+
22+
(({ a: true } as const).a === false); // error
23+
(({ a: true } as const).a === false); // error
1824

1925
//// [ts-expect-error.js]
2026
// @ts-expect-error additional commenting
@@ -27,3 +33,8 @@ var invalidCommentedPlain = 'nope';
2733
var validCommentedPlain = 'nope';
2834
var invalidPlain = 'nope';
2935
var validPlain = 'nope';
36+
// @ts-expect-error
37+
({ a: true }.a === false); // <-- compiles (as expected via comment)
38+
({ a: true }.a === false); // Should error
39+
({ a: true }.a === false); // error
40+
({ a: true }.a === false); // error

tests/baselines/reference/ts-expect-error.symbols

+21
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,24 @@ var invalidPlain: number = 'nope';
2121
var validPlain: string = 'nope';
2222
>validPlain : Symbol(validPlain, Decl(ts-expect-error.ts, 14, 3))
2323

24+
// @ts-expect-error
25+
(({ a: true } as const).a === false); // <-- compiles (as expected via comment)
26+
>({ a: true } as const).a : Symbol(a, Decl(ts-expect-error.ts, 17, 3))
27+
>a : Symbol(a, Decl(ts-expect-error.ts, 17, 3))
28+
>a : Symbol(a, Decl(ts-expect-error.ts, 17, 3))
29+
30+
(({ a: true } as const).a === false); // Should error
31+
>({ a: true } as const).a : Symbol(a, Decl(ts-expect-error.ts, 18, 3))
32+
>a : Symbol(a, Decl(ts-expect-error.ts, 18, 3))
33+
>a : Symbol(a, Decl(ts-expect-error.ts, 18, 3))
34+
35+
(({ a: true } as const).a === false); // error
36+
>({ a: true } as const).a : Symbol(a, Decl(ts-expect-error.ts, 20, 3))
37+
>a : Symbol(a, Decl(ts-expect-error.ts, 20, 3))
38+
>a : Symbol(a, Decl(ts-expect-error.ts, 20, 3))
39+
40+
(({ a: true } as const).a === false); // error
41+
>({ a: true } as const).a : Symbol(a, Decl(ts-expect-error.ts, 21, 3))
42+
>a : Symbol(a, Decl(ts-expect-error.ts, 21, 3))
43+
>a : Symbol(a, Decl(ts-expect-error.ts, 21, 3))
44+

tests/baselines/reference/ts-expect-error.types

+49
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,52 @@ var validPlain: string = 'nope';
2727
>validPlain : string
2828
>'nope' : "nope"
2929

30+
// @ts-expect-error
31+
(({ a: true } as const).a === false); // <-- compiles (as expected via comment)
32+
>(({ a: true } as const).a === false) : boolean
33+
>({ a: true } as const).a === false : boolean
34+
>({ a: true } as const).a : true
35+
>({ a: true } as const) : { readonly a: true; }
36+
>{ a: true } as const : { readonly a: true; }
37+
>{ a: true } : { readonly a: true; }
38+
>a : true
39+
>true : true
40+
>a : true
41+
>false : false
42+
43+
(({ a: true } as const).a === false); // Should error
44+
>(({ a: true } as const).a === false) : boolean
45+
>({ a: true } as const).a === false : boolean
46+
>({ a: true } as const).a : true
47+
>({ a: true } as const) : { readonly a: true; }
48+
>{ a: true } as const : { readonly a: true; }
49+
>{ a: true } : { readonly a: true; }
50+
>a : true
51+
>true : true
52+
>a : true
53+
>false : false
54+
55+
(({ a: true } as const).a === false); // error
56+
>(({ a: true } as const).a === false) : boolean
57+
>({ a: true } as const).a === false : boolean
58+
>({ a: true } as const).a : true
59+
>({ a: true } as const) : { readonly a: true; }
60+
>{ a: true } as const : { readonly a: true; }
61+
>{ a: true } : { readonly a: true; }
62+
>a : true
63+
>true : true
64+
>a : true
65+
>false : false
66+
67+
(({ a: true } as const).a === false); // error
68+
>(({ a: true } as const).a === false) : boolean
69+
>({ a: true } as const).a === false : boolean
70+
>({ a: true } as const).a : true
71+
>({ a: true } as const) : { readonly a: true; }
72+
>{ a: true } as const : { readonly a: true; }
73+
>{ a: true } : { readonly a: true; }
74+
>a : true
75+
>true : true
76+
>a : true
77+
>false : false
78+

tests/cases/conformance/directives/ts-expect-error.ts

+7
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,10 @@ var validCommentedPlain: string = 'nope';
1313
var invalidPlain: number = 'nope';
1414

1515
var validPlain: string = 'nope';
16+
17+
// @ts-expect-error
18+
(({ a: true } as const).a === false); // <-- compiles (as expected via comment)
19+
(({ a: true } as const).a === false); // Should error
20+
21+
(({ a: true } as const).a === false); // error
22+
(({ a: true } as const).a === false); // error

0 commit comments

Comments
 (0)