Skip to content

Commit 18f93b8

Browse files
authored
Fix JSDoc @extends mismatch diagnostics for property access bases (#3671)
1 parent 1e58c84 commit 18f93b8

5 files changed

Lines changed: 121 additions & 4 deletions

File tree

internal/checker/grammarchecks.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ func (c *Checker) grammarErrorOnNodeSkippedOnNoEmit(node *ast.Node, message *dia
5454
return false
5555
}
5656

57+
func getIdentifierFromEntityNameExpression(node *ast.Node) *ast.Node {
58+
switch node.Kind {
59+
case ast.KindIdentifier:
60+
return node
61+
case ast.KindPropertyAccessExpression:
62+
return node.AsPropertyAccessExpression().Name()
63+
default:
64+
return nil
65+
}
66+
}
67+
5768
func (c *Checker) checkGrammarRegularExpressionLiteral(node *ast.RegularExpressionLiteral) bool {
5869
sourceFile := ast.GetSourceFileOfNode(node.AsNode())
5970
if !c.hasParseDiagnostics(sourceFile) {
@@ -919,10 +930,10 @@ func (c *Checker) checkGrammarClassDeclarationHeritageClauses(node *ast.ClassLik
919930
if tag.Kind == ast.KindJSDocAugmentsTag {
920931
target := typeNodes[0].AsExpressionWithTypeArguments()
921932
source := tag.ClassName().AsExpressionWithTypeArguments()
922-
if !ast.HasSamePropertyAccessName(target.Expression, source.Expression) &&
923-
target.Expression.Kind == ast.KindIdentifier &&
924-
source.Expression.Kind == ast.KindIdentifier {
925-
return c.grammarErrorOnNode(tag.ClassName(), diagnostics.JSDoc_0_1_does_not_match_the_extends_2_clause, tag.TagName().Text(), source.Expression.Text(), target.Expression.Text())
933+
targetName := getIdentifierFromEntityNameExpression(target.Expression)
934+
sourceName := getIdentifierFromEntityNameExpression(source.Expression)
935+
if targetName != nil && sourceName != nil && targetName.Text() != sourceName.Text() {
936+
return c.grammarErrorOnNode(sourceName, diagnostics.JSDoc_0_1_does_not_match_the_extends_2_clause, tag.TagName().Text(), sourceName.Text(), targetName.Text())
926937
}
927938
}
928939
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
main.js(2,20): error TS8023: JSDoc '@extends Component' does not match the 'extends PureComponent' clause.
2+
3+
4+
==== react.d.ts (0 errors) ====
5+
declare namespace React {
6+
class Component {}
7+
class PureComponent {}
8+
}
9+
10+
==== main.js (1 errors) ====
11+
/**
12+
* @extends {React.Component}
13+
~~~~~~~~~
14+
!!! error TS8023: JSDoc '@extends Component' does not match the 'extends PureComponent' clause.
15+
*/
16+
class C extends React.PureComponent {}
17+
18+
/**
19+
* @extends {React.Component}
20+
*/
21+
class D extends React.Component {}
22+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//// [tests/cases/compiler/jsdocExtendsClauseMismatch.ts] ////
2+
3+
=== react.d.ts ===
4+
declare namespace React {
5+
>React : Symbol(React, Decl(react.d.ts, 0, 0))
6+
7+
class Component {}
8+
>Component : Symbol(Component, Decl(react.d.ts, 0, 25))
9+
10+
class PureComponent {}
11+
>PureComponent : Symbol(PureComponent, Decl(react.d.ts, 1, 22))
12+
}
13+
14+
=== main.js ===
15+
/**
16+
* @extends {React.Component}
17+
*/
18+
class C extends React.PureComponent {}
19+
>C : Symbol(C, Decl(main.js, 0, 0))
20+
>React.PureComponent : Symbol(React.PureComponent, Decl(react.d.ts, 1, 22))
21+
>React : Symbol(React, Decl(react.d.ts, 0, 0))
22+
>PureComponent : Symbol(React.PureComponent, Decl(react.d.ts, 1, 22))
23+
24+
/**
25+
* @extends {React.Component}
26+
*/
27+
class D extends React.Component {}
28+
>D : Symbol(D, Decl(main.js, 3, 38))
29+
>React.Component : Symbol(React.Component, Decl(react.d.ts, 0, 25))
30+
>React : Symbol(React, Decl(react.d.ts, 0, 0))
31+
>Component : Symbol(React.Component, Decl(react.d.ts, 0, 25))
32+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//// [tests/cases/compiler/jsdocExtendsClauseMismatch.ts] ////
2+
3+
=== react.d.ts ===
4+
declare namespace React {
5+
>React : typeof React
6+
7+
class Component {}
8+
>Component : Component
9+
10+
class PureComponent {}
11+
>PureComponent : PureComponent
12+
}
13+
14+
=== main.js ===
15+
/**
16+
* @extends {React.Component}
17+
*/
18+
class C extends React.PureComponent {}
19+
>C : C
20+
>React.PureComponent : React.PureComponent
21+
>React : typeof React
22+
>PureComponent : typeof React.PureComponent
23+
24+
/**
25+
* @extends {React.Component}
26+
*/
27+
class D extends React.Component {}
28+
>D : D
29+
>React.Component : React.Component
30+
>React : typeof React
31+
>Component : typeof React.Component
32+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @noEmit: true
4+
5+
// @filename: react.d.ts
6+
declare namespace React {
7+
class Component {}
8+
class PureComponent {}
9+
}
10+
11+
// @filename: main.js
12+
/**
13+
* @extends {React.Component}
14+
*/
15+
class C extends React.PureComponent {}
16+
17+
/**
18+
* @extends {React.Component}
19+
*/
20+
class D extends React.Component {}

0 commit comments

Comments
 (0)