From e27fb0651b5c3e3baa4f873386d32b8bd4bb0fb7 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Wed, 9 May 2018 09:25:00 -0700 Subject: [PATCH] Fix crash in recursive declared type resolution (#23950) When one type has a type parameter with a default --- src/compiler/checker.ts | 6 +++++- .../recursiveResolveDeclaredMembers.symbols | 18 ++++++++++++++++++ .../recursiveResolveDeclaredMembers.types | 18 ++++++++++++++++++ .../recursiveResolveDeclaredMembers.ts | 12 ++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/recursiveResolveDeclaredMembers.symbols create mode 100644 tests/baselines/reference/recursiveResolveDeclaredMembers.types create mode 100644 tests/cases/compiler/recursiveResolveDeclaredMembers.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a368a6a8f64..542ef7347ed 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5656,6 +5656,10 @@ namespace ts { const symbol = type.symbol; const members = getMembersOfSymbol(symbol); (type).declaredProperties = getNamedMembers(members); + // Start with signatures at empty array in case of recursive types + (type).declaredCallSignatures = emptyArray; + (type).declaredConstructSignatures = emptyArray; + (type).declaredCallSignatures = getSignaturesOfSymbol(members.get(InternalSymbolName.Call)); (type).declaredConstructSignatures = getSignaturesOfSymbol(members.get(InternalSymbolName.New)); (type).declaredStringIndexInfo = getIndexInfoOfSymbol(symbol, IndexKind.String); @@ -7048,7 +7052,7 @@ namespace ts { for (let i = numTypeArguments; i < numTypeParameters; i++) { const mapper = createTypeMapper(typeParameters, typeArguments); let defaultType = getDefaultFromTypeParameter(typeParameters[i]); - if (defaultType && isTypeIdenticalTo(defaultType, emptyObjectType) && isJavaScriptImplicitAny) { + if (isJavaScriptImplicitAny && defaultType && isTypeIdenticalTo(defaultType, emptyObjectType)) { defaultType = anyType; } typeArguments[i] = defaultType ? instantiateType(defaultType, mapper) : getDefaultTypeArgumentType(isJavaScriptImplicitAny); diff --git a/tests/baselines/reference/recursiveResolveDeclaredMembers.symbols b/tests/baselines/reference/recursiveResolveDeclaredMembers.symbols new file mode 100644 index 00000000000..b531073f705 --- /dev/null +++ b/tests/baselines/reference/recursiveResolveDeclaredMembers.symbols @@ -0,0 +1,18 @@ +=== tests/cases/compiler/types.ts === +// #23025 +export interface F { +>F : Symbol(F, Decl(types.ts, 0, 0)) + + (): E; +>E : Symbol(E, Decl(other.js, 0, 4)) +} +export interface D {} +>D : Symbol(D, Decl(types.ts, 3, 1)) +>T : Symbol(T, Decl(types.ts, 4, 19)) +>F : Symbol(F, Decl(types.ts, 0, 0)) +>F : Symbol(F, Decl(types.ts, 0, 0)) + +=== tests/cases/compiler/other.js === +/** @typedef {import("./types").D} E */ +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/recursiveResolveDeclaredMembers.types b/tests/baselines/reference/recursiveResolveDeclaredMembers.types new file mode 100644 index 00000000000..9a1aac95224 --- /dev/null +++ b/tests/baselines/reference/recursiveResolveDeclaredMembers.types @@ -0,0 +1,18 @@ +=== tests/cases/compiler/types.ts === +// #23025 +export interface F { +>F : F + + (): E; +>E : D +} +export interface D {} +>D : D +>T : T +>F : F +>F : F + +=== tests/cases/compiler/other.js === +/** @typedef {import("./types").D} E */ +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/cases/compiler/recursiveResolveDeclaredMembers.ts b/tests/cases/compiler/recursiveResolveDeclaredMembers.ts new file mode 100644 index 00000000000..39e5f05849b --- /dev/null +++ b/tests/cases/compiler/recursiveResolveDeclaredMembers.ts @@ -0,0 +1,12 @@ +// #23025 +// @noEmit: true +// @allowJs: true +// @checkJs: true +// @Filename: types.ts +export interface F { + (): E; +} +export interface D {} + +// @Filename: other.js +/** @typedef {import("./types").D} E */