Skip to content

Commit

Permalink
Js/check type tags (#24967)
Browse files Browse the repository at this point in the history
* Check the type expression of `@type` tags

* Update existing tests and baselines
  • Loading branch information
sandersn authored Jun 14, 2018
1 parent 34b9c4d commit 57e652d
Show file tree
Hide file tree
Showing 10 changed files with 96 additions and 9 deletions.
6 changes: 6 additions & 0 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22601,6 +22601,10 @@ namespace ts {
checkSourceElement(node.typeExpression);
}

function checkJSDocTypeTag(node: JSDocTypeTag) {
checkSourceElement(node.typeExpression);
}

function checkJSDocParameterTag(node: JSDocParameterTag) {
checkSourceElement(node.typeExpression);
if (!getParameterSymbolFromJSDoc(node)) {
Expand Down Expand Up @@ -25562,6 +25566,8 @@ namespace ts {
case SyntaxKind.JSDocTypedefTag:
case SyntaxKind.JSDocCallbackTag:
return checkJSDocTypeAliasTag(node as JSDocTypedefTag);
case SyntaxKind.JSDocTypeTag:
return checkJSDocTypeTag(node as JSDocTypeTag);
case SyntaxKind.JSDocParameterTag:
return checkJSDocParameterTag(node as JSDocParameterTag);
case SyntaxKind.JSDocFunctionType:
Expand Down
21 changes: 21 additions & 0 deletions tests/baselines/reference/checkJsdocTypeTag4.errors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
tests/cases/conformance/jsdoc/test.js(5,14): error TS2344: Type 'number' does not satisfy the constraint 'string'.
tests/cases/conformance/jsdoc/test.js(7,14): error TS2344: Type 'number' does not satisfy the constraint 'string'.


==== tests/cases/conformance/jsdoc/t.d.ts (0 errors) ====
type A<T extends string> = { a: T }

==== tests/cases/conformance/jsdoc/test.js (2 errors) ====
/** Also should error for jsdoc typedefs
* @template {string} U
* @typedef {{ b: U }} B
*/
/** @type {A<number>} */
~~~~~~
!!! error TS2344: Type 'number' does not satisfy the constraint 'string'.
var a;
/** @type {B<number>} */
~~~~~~
!!! error TS2344: Type 'number' does not satisfy the constraint 'string'.
var b;

20 changes: 20 additions & 0 deletions tests/baselines/reference/checkJsdocTypeTag4.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
=== tests/cases/conformance/jsdoc/t.d.ts ===
type A<T extends string> = { a: T }
>A : Symbol(A, Decl(t.d.ts, 0, 0))
>T : Symbol(T, Decl(t.d.ts, 0, 7))
>a : Symbol(a, Decl(t.d.ts, 0, 28))
>T : Symbol(T, Decl(t.d.ts, 0, 7))

=== tests/cases/conformance/jsdoc/test.js ===
/** Also should error for jsdoc typedefs
* @template {string} U
* @typedef {{ b: U }} B
*/
/** @type {A<number>} */
var a;
>a : Symbol(a, Decl(test.js, 5, 3))

/** @type {B<number>} */
var b;
>b : Symbol(b, Decl(test.js, 7, 3))

20 changes: 20 additions & 0 deletions tests/baselines/reference/checkJsdocTypeTag4.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
=== tests/cases/conformance/jsdoc/t.d.ts ===
type A<T extends string> = { a: T }
>A : A<T>
>T : T
>a : T
>T : T

=== tests/cases/conformance/jsdoc/test.js ===
/** Also should error for jsdoc typedefs
* @template {string} U
* @typedef {{ b: U }} B
*/
/** @type {A<number>} */
var a;
>a : A<number>

/** @type {B<number>} */
var b;
>b : { b: number; }

Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
tests/cases/compiler/example.js(3,20): error TS1110: Type expected.
tests/cases/compiler/example.js(3,21): error TS2304: Cannot find name 'foo'.


==== tests/cases/compiler/example.js (1 errors) ====
==== tests/cases/compiler/example.js (2 errors) ====
// @ts-check
/**
* @type {function(@foo)}
~
!!! error TS1110: Type expected.
~~~
!!! error TS2304: Cannot find name 'foo'.
*/
let x;
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
tests/cases/conformance/jsdoc/a.js(16,12): error TS2314: Generic type 'Everything' requires 5 type argument(s).
tests/cases/conformance/jsdoc/a.js(12,23): error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'.
Property 'b' is missing in type '{ a: number; }'.
tests/cases/conformance/jsdoc/a.js(15,12): error TS2314: Generic type 'Everything' requires 5 type argument(s).
tests/cases/conformance/jsdoc/test.ts(1,34): error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'.
Property 'b' is missing in type '{ a: number; }'.


==== tests/cases/conformance/jsdoc/a.js (1 errors) ====
==== tests/cases/conformance/jsdoc/a.js (2 errors) ====
/**
* @template {{ a: number, b: string }} T,U A Comment
* @template {{ c: boolean }} V uh ... are comments even supported??
Expand All @@ -15,8 +17,10 @@ tests/cases/conformance/jsdoc/test.ts(1,34): error TS2344: Type '{ a: number; }'
/** @type {Everything<{ a: number, b: 'hi', c: never }, undefined, { c: true, d: 1 }, number, string>} */
var tuvwx;

// TODO: will error when #24592 is fixed
/** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */
~~~~~~~~~~~~~~
!!! error TS2344: Type '{ a: number; }' does not satisfy the constraint '{ a: number; b: string; }'.
!!! error TS2344: Property 'b' is missing in type '{ a: number; }'.
var wrong;

/** @type {Everything<{ a: number }>} */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,13 @@
var tuvwx;
>tuvwx : Symbol(tuvwx, Decl(a.js, 9, 3))

// TODO: will error when #24592 is fixed
/** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */
var wrong;
>wrong : Symbol(wrong, Decl(a.js, 13, 3))
>wrong : Symbol(wrong, Decl(a.js, 12, 3))

/** @type {Everything<{ a: number }>} */
var insufficient;
>insufficient : Symbol(insufficient, Decl(a.js, 16, 3))
>insufficient : Symbol(insufficient, Decl(a.js, 15, 3))

=== tests/cases/conformance/jsdoc/test.ts ===
declare var actually: Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
var tuvwx;
>tuvwx : { t: { a: number; b: "hi"; c: never; }; u: undefined; v: { c: true; d: 1; }; w: number; x: string; }

// TODO: will error when #24592 is fixed
/** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */
var wrong;
>wrong : { t: { a: number; }; u: undefined; v: { c: 1; d: 1; }; w: number; x: string; }
Expand Down
16 changes: 16 additions & 0 deletions tests/cases/conformance/jsdoc/checkJsdocTypeTag4.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// @checkJs: true
// @allowJs: true
// @noEmit: true

// @Filename: t.d.ts
type A<T extends string> = { a: T }

// @Filename: test.js
/** Also should error for jsdoc typedefs
* @template {string} U
* @typedef {{ b: U }} B
*/
/** @type {A<number>} */
var a;
/** @type {B<number>} */
var b;
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
/** @type {Everything<{ a: number, b: 'hi', c: never }, undefined, { c: true, d: 1 }, number, string>} */
var tuvwx;

// TODO: will error when #24592 is fixed
/** @type {Everything<{ a: number }, undefined, { c: 1, d: 1 }, number, string>} */
var wrong;

Expand Down

0 comments on commit 57e652d

Please sign in to comment.