fix(53645): JSDoc extends doesn't work with multiple lines (#53705)

This commit is contained in:
Oleksandr T
2023-04-20 16:06:38 -07:00
committed by GitHub
parent c1693054fe
commit c74efad46e
5 changed files with 234 additions and 0 deletions
+2
View File
@@ -9244,7 +9244,9 @@ namespace Parser {
const usedBrace = parseOptional(SyntaxKind.OpenBraceToken);
const pos = getNodePos();
const expression = parsePropertyAccessEntityNameExpression();
scanner.setInJSDocType(true);
const typeArguments = tryParseTypeArguments();
scanner.setInJSDocType(false);
const node = factory.createExpressionWithTypeArguments(expression, typeArguments) as ExpressionWithTypeArguments & { expression: Identifier | PropertyAccessEntityNameExpression };
const res = finishNode(node, pos);
if (usedBrace) {
@@ -0,0 +1,65 @@
/a.js(29,16): error TS2344: Type '{ a: string; b: string; }' does not satisfy the constraint 'Foo'.
Types of property 'b' are incompatible.
Type 'string' is not assignable to type 'boolean | string[]'.
/a.js(42,16): error TS2344: Type '{ a: string; b: string; }' does not satisfy the constraint 'Foo'.
Types of property 'b' are incompatible.
Type 'string' is not assignable to type 'boolean | string[]'.
==== /a.js (2 errors) ====
/**
* @typedef {{
* a: number | string;
* b: boolean | string[];
* }} Foo
*/
/**
* @template {Foo} T
*/
class A {
/**
* @param {T} a
*/
constructor(a) {
return a
}
}
/**
* @extends {A<{
* a: string,
* b: string[]
* }>}
*/
class B extends A {}
/**
* @extends {A<{
~
* a: string,
~~~~~~~~~~~~~~~~~
* b: string
~~~~~~~~~~~~~~~~
* }>}
~~~~
!!! error TS2344: Type '{ a: string; b: string; }' does not satisfy the constraint 'Foo'.
!!! error TS2344: Types of property 'b' are incompatible.
!!! error TS2344: Type 'string' is not assignable to type 'boolean | string[]'.
*/
class C extends A {}
/**
* @extends {A<{a: string, b: string[]}>}
*/
class D extends A {}
/**
* @extends {A<{a: string, b: string}>}
~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2344: Type '{ a: string; b: string; }' does not satisfy the constraint 'Foo'.
!!! error TS2344: Types of property 'b' are incompatible.
!!! error TS2344: Type 'string' is not assignable to type 'boolean | string[]'.
*/
class E extends A {}
@@ -0,0 +1,59 @@
=== /a.js ===
/**
* @typedef {{
* a: number | string;
* b: boolean | string[];
* }} Foo
*/
/**
* @template {Foo} T
*/
class A {
>A : Symbol(A, Decl(a.js, 0, 0))
/**
* @param {T} a
*/
constructor(a) {
>a : Symbol(a, Decl(a.js, 14, 15))
return a
>a : Symbol(a, Decl(a.js, 14, 15))
}
}
/**
* @extends {A<{
* a: string,
* b: string[]
* }>}
*/
class B extends A {}
>B : Symbol(B, Decl(a.js, 17, 1))
>A : Symbol(A, Decl(a.js, 0, 0))
/**
* @extends {A<{
* a: string,
* b: string
* }>}
*/
class C extends A {}
>C : Symbol(C, Decl(a.js, 25, 20))
>A : Symbol(A, Decl(a.js, 0, 0))
/**
* @extends {A<{a: string, b: string[]}>}
*/
class D extends A {}
>D : Symbol(D, Decl(a.js, 33, 20))
>A : Symbol(A, Decl(a.js, 0, 0))
/**
* @extends {A<{a: string, b: string}>}
*/
class E extends A {}
>E : Symbol(E, Decl(a.js, 38, 20))
>A : Symbol(A, Decl(a.js, 0, 0))
@@ -0,0 +1,59 @@
=== /a.js ===
/**
* @typedef {{
* a: number | string;
* b: boolean | string[];
* }} Foo
*/
/**
* @template {Foo} T
*/
class A {
>A : A<T>
/**
* @param {T} a
*/
constructor(a) {
>a : T
return a
>a : T
}
}
/**
* @extends {A<{
* a: string,
* b: string[]
* }>}
*/
class B extends A {}
>B : B
>A : A<{ a: string; b: string[]; }>
/**
* @extends {A<{
* a: string,
* b: string
* }>}
*/
class C extends A {}
>C : C
>A : A<{ a: string; b: string; }>
/**
* @extends {A<{a: string, b: string[]}>}
*/
class D extends A {}
>D : D
>A : A<{ a: string; b: string[]; }>
/**
* @extends {A<{a: string, b: string}>}
*/
class E extends A {}
>E : E
>A : A<{ a: string; b: string; }>
@@ -0,0 +1,49 @@
// @checkJs: true
// @allowJs: true
// @noEmit: true
// @filename: /a.js
/**
* @typedef {{
* a: number | string;
* b: boolean | string[];
* }} Foo
*/
/**
* @template {Foo} T
*/
class A {
/**
* @param {T} a
*/
constructor(a) {
return a
}
}
/**
* @extends {A<{
* a: string,
* b: string[]
* }>}
*/
class B extends A {}
/**
* @extends {A<{
* a: string,
* b: string
* }>}
*/
class C extends A {}
/**
* @extends {A<{a: string, b: string[]}>}
*/
class D extends A {}
/**
* @extends {A<{a: string, b: string}>}
*/
class E extends A {}