Skip to content

Commit e6ecfa4

Browse files
authored
Merge pull request #15229 from Microsoft/Fix15220
Fix #15220: Check for file on diagnostics before getting line map
2 parents 2ca1de5 + 4546b0d commit e6ecfa4

File tree

4 files changed

+65
-14
lines changed

4 files changed

+65
-14
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20487,7 +20487,7 @@ namespace ts {
2048720487
errorMessage = Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function;
2048820488
}
2048920489

20490-
error(derived.valueDeclaration.name, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type));
20490+
error(derived.valueDeclaration.name || derived.valueDeclaration, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type));
2049120491
}
2049220492
}
2049320493
}

src/compiler/program.ts

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -930,20 +930,22 @@ namespace ts {
930930
*/
931931
function shouldReportDiagnostic(diagnostic: Diagnostic) {
932932
const { file, start } = diagnostic;
933-
const lineStarts = getLineStarts(file);
934-
let { line } = computeLineAndCharacterOfPosition(lineStarts, start);
935-
while (line > 0) {
936-
const previousLineText = file.text.slice(lineStarts[line - 1], lineStarts[line]);
937-
const result = ignoreDiagnosticCommentRegEx.exec(previousLineText);
938-
if (!result) {
939-
// non-empty line
940-
return true;
941-
}
942-
if (result[3]) {
943-
// @ts-ignore
944-
return false;
933+
if (file) {
934+
const lineStarts = getLineStarts(file);
935+
let { line } = computeLineAndCharacterOfPosition(lineStarts, start);
936+
while (line > 0) {
937+
const previousLineText = file.text.slice(lineStarts[line - 1], lineStarts[line]);
938+
const result = ignoreDiagnosticCommentRegEx.exec(previousLineText);
939+
if (!result) {
940+
// non-empty line
941+
return true;
942+
}
943+
if (result[3]) {
944+
// @ts-ignore
945+
return false;
946+
}
947+
line--;
945948
}
946-
line--;
947949
}
948950
return true;
949951
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
tests/cases/compiler/a.js(14,5): error TS2424: Class 'A' defines instance member function 'foo', but extended class 'B' defines it as instance member property.
2+
3+
4+
==== tests/cases/compiler/a.js (1 errors) ====
5+
// @ts-check
6+
class A {
7+
constructor() {
8+
9+
}
10+
foo() {
11+
return 4;
12+
}
13+
}
14+
15+
class B extends A {
16+
constructor() {
17+
super();
18+
this.foo = () => 3;
19+
~~~~~~~~~~~~~~~~~~
20+
!!! error TS2424: Class 'A' defines instance member function 'foo', but extended class 'B' defines it as instance member property.
21+
}
22+
}
23+
24+
const i = new B();
25+
i.foo();
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @noEmit: true
4+
5+
// @fileName: a.js
6+
// @ts-check
7+
class A {
8+
constructor() {
9+
10+
}
11+
foo() {
12+
return 4;
13+
}
14+
}
15+
16+
class B extends A {
17+
constructor() {
18+
super();
19+
this.foo = () => 3;
20+
}
21+
}
22+
23+
const i = new B();
24+
i.foo();

0 commit comments

Comments
 (0)