From 557a34e897dbabdcf567cfea343c9443112fdaea Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Thu, 19 Apr 2018 10:28:30 -0700 Subject: [PATCH] Visit typedef type expressions so they contribute to referenced-ness (#23525) --- src/compiler/checker.ts | 6 ++++ .../checkJsTypeDefNoUnusedLocalMarked.symbols | 27 ++++++++++++++++ .../checkJsTypeDefNoUnusedLocalMarked.types | 32 +++++++++++++++++++ .../checkJsTypeDefNoUnusedLocalMarked.ts | 20 ++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.symbols create mode 100644 tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.types create mode 100644 tests/cases/compiler/checkJsTypeDefNoUnusedLocalMarked.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f497ba82e4..62cff0b1ce 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21865,6 +21865,11 @@ namespace ts { // If the node had `@property` tags, `typeExpression` would have been set to the first property tag. error(node.name, Diagnostics.JSDoc_typedef_tag_should_either_have_a_type_annotation_or_be_followed_by_property_or_member_tags); } + + if (node.name) { + checkTypeNameIsReserved(node.name, Diagnostics.Type_alias_name_cannot_be_0); + } + checkSourceElement(node.typeExpression); } function checkJSDocParameterTag(node: JSDocParameterTag) { @@ -24765,6 +24770,7 @@ namespace ts { case SyntaxKind.JSDocNullableType: case SyntaxKind.JSDocAllType: case SyntaxKind.JSDocUnknownType: + case SyntaxKind.JSDocTypeLiteral: checkJSDocTypeIsInJsFile(node); forEachChild(node, checkSourceElement); return; diff --git a/tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.symbols b/tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.symbols new file mode 100644 index 0000000000..6826881b83 --- /dev/null +++ b/tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.symbols @@ -0,0 +1,27 @@ +=== tests/cases/compiler/file.ts === +class Foo { +>Foo : Symbol(Foo, Decl(file.ts, 0, 0)) + + x: number; +>x : Symbol(Foo.x, Decl(file.ts, 0, 11)) +} + +declare global { +>global : Symbol(global, Decl(file.ts, 2, 1)) + + var module: any; // Just here to remove unrelated error from test +>module : Symbol(module, Decl(file.ts, 5, 7)) +} + +export = Foo; +>Foo : Symbol(Foo, Decl(file.ts, 0, 0)) + +=== tests/cases/compiler/something.js === +/** @typedef {typeof import("./file")} Foo */ + +/** @typedef {(foo: Foo) => string} FooFun */ + +module.exports = /** @type {FooFun} */(void 0); +>module : Symbol(export=, Decl(something.js, 0, 0)) +>exports : Symbol(export=, Decl(something.js, 0, 0)) + diff --git a/tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.types b/tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.types new file mode 100644 index 0000000000..1428cce142 --- /dev/null +++ b/tests/baselines/reference/checkJsTypeDefNoUnusedLocalMarked.types @@ -0,0 +1,32 @@ +=== tests/cases/compiler/file.ts === +class Foo { +>Foo : Foo + + x: number; +>x : number +} + +declare global { +>global : typeof global + + var module: any; // Just here to remove unrelated error from test +>module : any +} + +export = Foo; +>Foo : Foo + +=== tests/cases/compiler/something.js === +/** @typedef {typeof import("./file")} Foo */ + +/** @typedef {(foo: Foo) => string} FooFun */ + +module.exports = /** @type {FooFun} */(void 0); +>module.exports = /** @type {FooFun} */(void 0) : (foo: typeof Foo) => string +>module.exports : any +>module : any +>exports : any +>(void 0) : (foo: typeof Foo) => string +>void 0 : undefined +>0 : 0 + diff --git a/tests/cases/compiler/checkJsTypeDefNoUnusedLocalMarked.ts b/tests/cases/compiler/checkJsTypeDefNoUnusedLocalMarked.ts new file mode 100644 index 0000000000..559e0ee725 --- /dev/null +++ b/tests/cases/compiler/checkJsTypeDefNoUnusedLocalMarked.ts @@ -0,0 +1,20 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @noUnusedLocals: true +// @filename: file.ts +class Foo { + x: number; +} + +declare global { + var module: any; // Just here to remove unrelated error from test +} + +export = Foo; +// @filename: something.js +/** @typedef {typeof import("./file")} Foo */ + +/** @typedef {(foo: Foo) => string} FooFun */ + +module.exports = /** @type {FooFun} */(void 0); \ No newline at end of file