Skip to content

Commit

Permalink
fix(60563): treat JSDoc implements tag as identifier in non-emitting …
Browse files Browse the repository at this point in the history
…heritage clause
  • Loading branch information
a-tarasyuk committed Nov 23, 2024
1 parent d85767a commit 6586021
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/compiler/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10483,6 +10483,7 @@ function isIdentifierInNonEmittingHeritageClause(node: Node): boolean {
if (node.kind !== SyntaxKind.Identifier) return false;
const heritageClause = findAncestor(node.parent, parent => {
switch (parent.kind) {
case SyntaxKind.JSDocImplementsTag:
case SyntaxKind.HeritageClause:
return true;
case SyntaxKind.PropertyAccessExpression:
Expand All @@ -10492,7 +10493,8 @@ function isIdentifierInNonEmittingHeritageClause(node: Node): boolean {
return "quit";
}
}) as HeritageClause | undefined;
return heritageClause?.token === SyntaxKind.ImplementsKeyword || heritageClause?.parent.kind === SyntaxKind.InterfaceDeclaration;
if (heritageClause === undefined) return false;
return isJSDocImplementsTag(heritageClause) || heritageClause.token === SyntaxKind.ImplementsKeyword || heritageClause.parent.kind === SyntaxKind.InterfaceDeclaration;
}

/** @internal */
Expand Down
21 changes: 21 additions & 0 deletions tests/baselines/reference/importTag23.errors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/b.js(6,14): error TS2420: Class 'C' incorrectly implements interface 'I'.
Property 'foo' is missing in type 'C' but required in type 'I'.


==== /a.ts (0 errors) ====
export interface I {
foo(): void;
}

==== /b.js (1 errors) ====
/**
* @import * as NS from './a'
*/

/** @implements {NS.I} */
export class C {}
~
!!! error TS2420: Class 'C' incorrectly implements interface 'I'.
!!! error TS2420: Property 'foo' is missing in type 'C' but required in type 'I'.
!!! related TS2728 /a.ts:2:5: 'foo' is declared here.

19 changes: 19 additions & 0 deletions tests/baselines/reference/importTag23.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//// [tests/cases/conformance/jsdoc/importTag23.ts] ////

=== /a.ts ===
export interface I {
>I : Symbol(I, Decl(a.ts, 0, 0))

foo(): void;
>foo : Symbol(I.foo, Decl(a.ts, 0, 20))
}

=== /b.js ===
/**
* @import * as NS from './a'
*/

/** @implements {NS.I} */
export class C {}
>C : Symbol(C, Decl(b.js, 0, 0))

19 changes: 19 additions & 0 deletions tests/baselines/reference/importTag23.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//// [tests/cases/conformance/jsdoc/importTag23.ts] ////

=== /a.ts ===
export interface I {
foo(): void;
>foo : () => void
> : ^^^^^^
}

=== /b.js ===
/**
* @import * as NS from './a'
*/

/** @implements {NS.I} */
export class C {}
>C : C
> : ^

16 changes: 16 additions & 0 deletions tests/cases/conformance/jsdoc/importTag23.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// @checkJs: true
// @allowJs: true
// @noEmit: true

// @filename: /a.ts
export interface I {
foo(): void;
}

// @filename: /b.js
/**
* @import * as NS from './a'
*/

/** @implements {NS.I} */
export class C {}

0 comments on commit 6586021

Please sign in to comment.