diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6293e9096a1..8556832569b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4913,6 +4913,13 @@ namespace ts { } function typeToTypeNodeHelper(type: Type, context: NodeBuilderContext): TypeNode { + const savedFlags = context.flags; + const typeNode = typeToTypeNodeWorker(type, context); + context.flags = savedFlags; + return typeNode; + } + + function typeToTypeNodeWorker(type: Type, context: NodeBuilderContext): TypeNode { if (cancellationToken && cancellationToken.throwIfCancellationRequested) { cancellationToken.throwIfCancellationRequested(); } diff --git a/tests/baselines/reference/jsDeclarationsTypedefFunction.js b/tests/baselines/reference/jsDeclarationsTypedefFunction.js new file mode 100644 index 00000000000..9a64e37327f --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsTypedefFunction.js @@ -0,0 +1,48 @@ +//// [foo.js] +/** + * @typedef {{ + * [id: string]: [Function, Function]; + * }} ResolveRejectMap + */ + +let id = 0 + +/** + * @param {ResolveRejectMap} handlers + * @returns {Promise} + */ +const send = handlers => new Promise((resolve, reject) => { + handlers[++id] = [resolve, reject] +}) + +//// [foo.js] +/** + * @typedef {{ + * [id: string]: [Function, Function]; + * }} ResolveRejectMap + */ +let id = 0; +/** + * @param {ResolveRejectMap} handlers + * @returns {Promise} + */ +const send = handlers => new Promise((resolve, reject) => { + handlers[++id] = [resolve, reject]; +}); + + +//// [foo.d.ts] +/** + * @typedef {{ + * [id: string]: [Function, Function]; + * }} ResolveRejectMap + */ +declare let id: number; +/** + * @param {ResolveRejectMap} handlers + * @returns {Promise} + */ +declare function send(handlers: ResolveRejectMap): Promise; +type ResolveRejectMap = { + [id: string]: [Function, Function]; +}; diff --git a/tests/baselines/reference/jsDeclarationsTypedefFunction.symbols b/tests/baselines/reference/jsDeclarationsTypedefFunction.symbols new file mode 100644 index 00000000000..16ccfbae554 --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsTypedefFunction.symbols @@ -0,0 +1,28 @@ +=== tests/cases/conformance/jsdoc/declarations/foo.js === +/** + * @typedef {{ + * [id: string]: [Function, Function]; + * }} ResolveRejectMap + */ + +let id = 0 +>id : Symbol(id, Decl(foo.js, 6, 3)) + +/** + * @param {ResolveRejectMap} handlers + * @returns {Promise} + */ +const send = handlers => new Promise((resolve, reject) => { +>send : Symbol(send, Decl(foo.js, 12, 5)) +>handlers : Symbol(handlers, Decl(foo.js, 12, 12)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>resolve : Symbol(resolve, Decl(foo.js, 12, 38)) +>reject : Symbol(reject, Decl(foo.js, 12, 46)) + + handlers[++id] = [resolve, reject] +>handlers : Symbol(handlers, Decl(foo.js, 12, 12)) +>id : Symbol(id, Decl(foo.js, 6, 3)) +>resolve : Symbol(resolve, Decl(foo.js, 12, 38)) +>reject : Symbol(reject, Decl(foo.js, 12, 46)) + +}) diff --git a/tests/baselines/reference/jsDeclarationsTypedefFunction.types b/tests/baselines/reference/jsDeclarationsTypedefFunction.types new file mode 100644 index 00000000000..a3cc3aa0e48 --- /dev/null +++ b/tests/baselines/reference/jsDeclarationsTypedefFunction.types @@ -0,0 +1,36 @@ +=== tests/cases/conformance/jsdoc/declarations/foo.js === +/** + * @typedef {{ + * [id: string]: [Function, Function]; + * }} ResolveRejectMap + */ + +let id = 0 +>id : number +>0 : 0 + +/** + * @param {ResolveRejectMap} handlers + * @returns {Promise} + */ +const send = handlers => new Promise((resolve, reject) => { +>send : (handlers: ResolveRejectMap) => Promise +>handlers => new Promise((resolve, reject) => { handlers[++id] = [resolve, reject]}) : (handlers: ResolveRejectMap) => Promise +>handlers : ResolveRejectMap +>new Promise((resolve, reject) => { handlers[++id] = [resolve, reject]}) : Promise +>Promise : PromiseConstructor +>(resolve, reject) => { handlers[++id] = [resolve, reject]} : (resolve: (value: any) => void, reject: (reason?: any) => void) => void +>resolve : (value: any) => void +>reject : (reason?: any) => void + + handlers[++id] = [resolve, reject] +>handlers[++id] = [resolve, reject] : [(value: any) => void, (reason?: any) => void] +>handlers[++id] : [Function, Function] +>handlers : ResolveRejectMap +>++id : number +>id : number +>[resolve, reject] : [(value: any) => void, (reason?: any) => void] +>resolve : (value: any) => void +>reject : (reason?: any) => void + +}) diff --git a/tests/cases/conformance/jsdoc/declarations/jsDeclarationsTypedefFunction.ts b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsTypedefFunction.ts new file mode 100644 index 00000000000..fed366525c7 --- /dev/null +++ b/tests/cases/conformance/jsdoc/declarations/jsDeclarationsTypedefFunction.ts @@ -0,0 +1,21 @@ +// @allowJs: true +// @checkJs: true +// @target: esnext +// @outDir: ./out +// @declaration: true +// @filename: foo.js +/** + * @typedef {{ + * [id: string]: [Function, Function]; + * }} ResolveRejectMap + */ + +let id = 0 + +/** + * @param {ResolveRejectMap} handlers + * @returns {Promise} + */ +const send = handlers => new Promise((resolve, reject) => { + handlers[++id] = [resolve, reject] +}) \ No newline at end of file