diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 04facba3196e7..a8a6f9cae4fc7 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6147,8 +6147,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { }, serializeReturnTypeForSignature(syntacticContext, signatureDeclaration) { const context = syntacticContext as NodeBuilderContext; - const signature = getSignatureFromDeclaration(signatureDeclaration); - const returnType = context.enclosingSymbolTypes.get(getSymbolId(getSymbolOfDeclaration(signatureDeclaration))) ?? instantiateType(getReturnTypeOfSignature(signature), context.mapper); + let signature = context.enclosingSymbolSignatures.get(getSymbolId(getSymbolOfDeclaration(signatureDeclaration))); + let returnType; + if (signature === undefined) { + signature = getSignatureFromDeclaration(signatureDeclaration); + returnType = instantiateType(getReturnTypeOfSignature(signature), context.mapper); + } + else { + returnType = getReturnTypeOfSignature(signature); + } return serializeInferredReturnTypeForSignature(context, signature, returnType); }, serializeTypeOfExpression(syntacticContext, expr) { @@ -6252,8 +6259,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (symbol.flags & SymbolFlags.Accessor) { type = node.kind === SyntaxKind.SetAccessor ? getWriteTypeOfSymbol(symbol) : getTypeOfAccessors(symbol); } - else if (isValueSignatureDeclaration(node)) { - type = getReturnTypeOfSignature(getSignatureFromDeclaration(node)); + else if (isFunctionLike(node)) { + type = getReturnTypeOfSignature(context.enclosingSymbolSignatures?.get(getSymbolId(symbol)) ?? getSignatureFromDeclaration(node)); } else { type = getTypeOfSymbol(symbol); @@ -6387,6 +6394,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { typeParameterNamesByText: undefined, typeParameterNamesByTextNextNameCount: undefined, enclosingSymbolTypes: new Map(), + enclosingSymbolSignatures: new Map(), mapper: undefined, depth: 0, couldUnfoldMore: false, @@ -6401,7 +6409,20 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } return context.encounteredError ? undefined : resultingNode; } - + function addSymbolSignatureToContext(context: NodeBuilderContext, symbol: Symbol, signature: Signature) { + const id = getSymbolId(symbol); + const oldSignature = context.enclosingSymbolTypes.get(id); + context.enclosingSymbolSignatures.set(id, signature); + return restore; + function restore() { + if (oldSignature) { + context.enclosingSymbolTypes.set(id, oldSignature); + } + else { + context.enclosingSymbolTypes.delete(id); + } + } + } function addSymbolTypeToContext(context: NodeBuilderContext, symbol: Symbol, type: Type) { const id = getSymbolId(symbol); const oldType = context.enclosingSymbolTypes.get(id); @@ -8736,7 +8757,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (!(suppressAny && isTypeAny(returnType))) { if (signature.declaration && !nodeIsSynthesized(signature.declaration)) { const declarationSymbol = getSymbolOfDeclaration(signature.declaration); - const restore = addSymbolTypeToContext(context, declarationSymbol, returnType); + const restore = addSymbolSignatureToContext(context, declarationSymbol, signature); returnTypeNode = syntacticNodeBuilder.serializeReturnTypeForSignature(signature.declaration, declarationSymbol, context); restore(); } @@ -53177,6 +53198,7 @@ interface NodeBuilderContext extends SyntacticTypeNodeBuilderContext { remappedSymbolNames: Map | undefined; remappedSymbolReferences: Map | undefined; enclosingSymbolTypes: Map; + enclosingSymbolSignatures: Map; reverseMappedStack: ReverseMappedSymbol[] | undefined; bundled: boolean; mapper: TypeMapper | undefined; diff --git a/tests/baselines/reference/declarationEmitInstantationExpressionNested.js b/tests/baselines/reference/declarationEmitInstantationExpressionNested.js new file mode 100644 index 0000000000000..fe7b854db0626 --- /dev/null +++ b/tests/baselines/reference/declarationEmitInstantationExpressionNested.js @@ -0,0 +1,147 @@ +//// [tests/cases/compiler/declarationEmitInstantationExpressionNested.ts] //// + +//// [declarationEmitInstantationExpressionNested.ts] +function outerFnExpression(n: K) { + return function (a: [T, K]): a is [T, K] { + return null! + } +} + +export let nrFnFromFnExpression = outerFnExpression(1) + + +function outerArrowFn(n: K) { + return function (a: [T, K]): a is [T, K] { + return null! + } +} + +export let nrFnFromArrowFn = outerArrowFn(1) + +function outerObjectMethod(n: K) { + return { + inner(a: [T, K]): a is [T, K] { + return null! + } + } +} + +export let nrFnFromObjectMethod = outerObjectMethod(1).inner + + +function outerStaticClassMember(n: K) { + return class { + static inner(a: [T, K]): a is [T, K] { + return null! + } + } +} + +export let nrFnFromStaticClassMember = outerStaticClassMember(1).inner + + +function outerClassMethod(n: K) { + return class { + inner(a: [T, K]): a is [T, K] { + return null! + } + } +} + +export let nrFnFromClassMethod = new (outerClassMethod(1))().inner + +function outerMethodSignature(n: K) : { + inner(a: [T, K]): a is [T, K] +} { + return null! +} + +export let nrFnFromMethodSignature = outerMethodSignature(1).inner + + + +function outerFnSignature(n: K) : { + (a: [T, K]): a is [T, K] +} { + return null! +} + +export let nrFnFromFnSignature = outerFnSignature(1) + + + +function outerFnType(n: K) : (a: [T, K]) => a is [T, K] { + return null! +} + +export let nrFnFromFnType = outerFnType(1) + +//// [declarationEmitInstantationExpressionNested.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.nrFnFromFnType = exports.nrFnFromFnSignature = exports.nrFnFromMethodSignature = exports.nrFnFromClassMethod = exports.nrFnFromStaticClassMember = exports.nrFnFromObjectMethod = exports.nrFnFromArrowFn = exports.nrFnFromFnExpression = void 0; +function outerFnExpression(n) { + return function (a) { + return null; + }; +} +exports.nrFnFromFnExpression = (outerFnExpression(1)); +function outerArrowFn(n) { + return function (a) { + return null; + }; +} +exports.nrFnFromArrowFn = (outerArrowFn(1)); +function outerObjectMethod(n) { + return { + inner: function (a) { + return null; + } + }; +} +exports.nrFnFromObjectMethod = (outerObjectMethod(1).inner); +function outerStaticClassMember(n) { + return /** @class */ (function () { + function class_1() { + } + class_1.inner = function (a) { + return null; + }; + return class_1; + }()); +} +exports.nrFnFromStaticClassMember = (outerStaticClassMember(1).inner); +function outerClassMethod(n) { + return /** @class */ (function () { + function class_2() { + } + class_2.prototype.inner = function (a) { + return null; + }; + return class_2; + }()); +} +exports.nrFnFromClassMethod = (new (outerClassMethod(1))().inner); +function outerMethodSignature(n) { + return null; +} +exports.nrFnFromMethodSignature = (outerMethodSignature(1).inner); +function outerFnSignature(n) { + return null; +} +exports.nrFnFromFnSignature = (outerFnSignature(1)); +function outerFnType(n) { + return null; +} +exports.nrFnFromFnType = (outerFnType(1)); + + +//// [declarationEmitInstantationExpressionNested.d.ts] +export declare let nrFnFromFnExpression: (a: [number, number]) => a is [number, number]; +export declare let nrFnFromArrowFn: (a: [number, number]) => a is [number, number]; +export declare let nrFnFromObjectMethod: (a: [number, number]) => a is [number, number]; +export declare let nrFnFromStaticClassMember: (a: [number, number]) => a is [number, number]; +export declare let nrFnFromClassMethod: (a: [number, number]) => a is [number, number]; +export declare let nrFnFromMethodSignature: (a: [number, number]) => a is [number, number]; +export declare let nrFnFromFnSignature: (a: [number, number]) => a is [number, number]; +export declare let nrFnFromFnType: (a: [number, number]) => a is [number, number]; diff --git a/tests/baselines/reference/declarationEmitInstantationExpressionNested.symbols b/tests/baselines/reference/declarationEmitInstantationExpressionNested.symbols new file mode 100644 index 0000000000000..5a749cf5869d2 --- /dev/null +++ b/tests/baselines/reference/declarationEmitInstantationExpressionNested.symbols @@ -0,0 +1,209 @@ +//// [tests/cases/compiler/declarationEmitInstantationExpressionNested.ts] //// + +=== declarationEmitInstantationExpressionNested.ts === +function outerFnExpression(n: K) { +>outerFnExpression : Symbol(outerFnExpression, Decl(declarationEmitInstantationExpressionNested.ts, 0, 0)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 0, 27)) +>n : Symbol(n, Decl(declarationEmitInstantationExpressionNested.ts, 0, 30)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 0, 27)) + + return function (a: [T, K]): a is [T, K] { +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 1, 21)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 1, 24)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 1, 21)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 0, 27)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 1, 24)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 1, 21)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 0, 27)) + + return null! + } +} + +export let nrFnFromFnExpression = outerFnExpression(1) +>nrFnFromFnExpression : Symbol(nrFnFromFnExpression, Decl(declarationEmitInstantationExpressionNested.ts, 6, 10)) +>outerFnExpression : Symbol(outerFnExpression, Decl(declarationEmitInstantationExpressionNested.ts, 0, 0)) + + +function outerArrowFn(n: K) { +>outerArrowFn : Symbol(outerArrowFn, Decl(declarationEmitInstantationExpressionNested.ts, 6, 62)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 9, 22)) +>n : Symbol(n, Decl(declarationEmitInstantationExpressionNested.ts, 9, 25)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 9, 22)) + + return function (a: [T, K]): a is [T, K] { +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 10, 21)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 10, 24)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 10, 21)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 9, 22)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 10, 24)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 10, 21)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 9, 22)) + + return null! + } +} + +export let nrFnFromArrowFn = outerArrowFn(1) +>nrFnFromArrowFn : Symbol(nrFnFromArrowFn, Decl(declarationEmitInstantationExpressionNested.ts, 15, 10)) +>outerArrowFn : Symbol(outerArrowFn, Decl(declarationEmitInstantationExpressionNested.ts, 6, 62)) + +function outerObjectMethod(n: K) { +>outerObjectMethod : Symbol(outerObjectMethod, Decl(declarationEmitInstantationExpressionNested.ts, 15, 52)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 17, 27)) +>n : Symbol(n, Decl(declarationEmitInstantationExpressionNested.ts, 17, 30)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 17, 27)) + + return { + inner(a: [T, K]): a is [T, K] { +>inner : Symbol(inner, Decl(declarationEmitInstantationExpressionNested.ts, 18, 12)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 19, 14)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 19, 17)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 19, 14)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 17, 27)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 19, 17)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 19, 14)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 17, 27)) + + return null! + } + } +} + +export let nrFnFromObjectMethod = outerObjectMethod(1).inner +>nrFnFromObjectMethod : Symbol(nrFnFromObjectMethod, Decl(declarationEmitInstantationExpressionNested.ts, 25, 10)) +>outerObjectMethod(1).inner : Symbol(inner, Decl(declarationEmitInstantationExpressionNested.ts, 18, 12)) +>outerObjectMethod : Symbol(outerObjectMethod, Decl(declarationEmitInstantationExpressionNested.ts, 15, 52)) +>inner : Symbol(inner, Decl(declarationEmitInstantationExpressionNested.ts, 18, 12)) + + +function outerStaticClassMember(n: K) { +>outerStaticClassMember : Symbol(outerStaticClassMember, Decl(declarationEmitInstantationExpressionNested.ts, 25, 68)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 28, 32)) +>n : Symbol(n, Decl(declarationEmitInstantationExpressionNested.ts, 28, 35)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 28, 32)) + + return class { + static inner(a: [T, K]): a is [T, K] { +>inner : Symbol((Anonymous class).inner, Decl(declarationEmitInstantationExpressionNested.ts, 29, 18)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 30, 21)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 30, 24)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 30, 21)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 28, 32)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 30, 24)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 30, 21)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 28, 32)) + + return null! + } + } +} + +export let nrFnFromStaticClassMember = outerStaticClassMember(1).inner +>nrFnFromStaticClassMember : Symbol(nrFnFromStaticClassMember, Decl(declarationEmitInstantationExpressionNested.ts, 36, 10)) +>outerStaticClassMember(1).inner : Symbol((Anonymous class).inner, Decl(declarationEmitInstantationExpressionNested.ts, 29, 18)) +>outerStaticClassMember : Symbol(outerStaticClassMember, Decl(declarationEmitInstantationExpressionNested.ts, 25, 68)) +>inner : Symbol((Anonymous class).inner, Decl(declarationEmitInstantationExpressionNested.ts, 29, 18)) + + +function outerClassMethod(n: K) { +>outerClassMethod : Symbol(outerClassMethod, Decl(declarationEmitInstantationExpressionNested.ts, 36, 78)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 39, 26)) +>n : Symbol(n, Decl(declarationEmitInstantationExpressionNested.ts, 39, 29)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 39, 26)) + + return class { + inner(a: [T, K]): a is [T, K] { +>inner : Symbol((Anonymous class).inner, Decl(declarationEmitInstantationExpressionNested.ts, 40, 18)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 41, 14)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 41, 17)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 41, 14)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 39, 26)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 41, 17)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 41, 14)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 39, 26)) + + return null! + } + } +} + +export let nrFnFromClassMethod = new (outerClassMethod(1))().inner +>nrFnFromClassMethod : Symbol(nrFnFromClassMethod, Decl(declarationEmitInstantationExpressionNested.ts, 47, 10)) +>new (outerClassMethod(1))().inner : Symbol((Anonymous class).inner, Decl(declarationEmitInstantationExpressionNested.ts, 40, 18)) +>outerClassMethod : Symbol(outerClassMethod, Decl(declarationEmitInstantationExpressionNested.ts, 36, 78)) +>inner : Symbol((Anonymous class).inner, Decl(declarationEmitInstantationExpressionNested.ts, 40, 18)) + +function outerMethodSignature(n: K) : { +>outerMethodSignature : Symbol(outerMethodSignature, Decl(declarationEmitInstantationExpressionNested.ts, 47, 74)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 49, 30)) +>n : Symbol(n, Decl(declarationEmitInstantationExpressionNested.ts, 49, 33)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 49, 30)) + + inner(a: [T, K]): a is [T, K] +>inner : Symbol(inner, Decl(declarationEmitInstantationExpressionNested.ts, 49, 42)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 50, 10)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 50, 13)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 50, 10)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 49, 30)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 50, 13)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 50, 10)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 49, 30)) + +} { + return null! +} + +export let nrFnFromMethodSignature = outerMethodSignature(1).inner +>nrFnFromMethodSignature : Symbol(nrFnFromMethodSignature, Decl(declarationEmitInstantationExpressionNested.ts, 55, 10)) +>outerMethodSignature(1).inner : Symbol(inner, Decl(declarationEmitInstantationExpressionNested.ts, 49, 42)) +>outerMethodSignature : Symbol(outerMethodSignature, Decl(declarationEmitInstantationExpressionNested.ts, 47, 74)) +>inner : Symbol(inner, Decl(declarationEmitInstantationExpressionNested.ts, 49, 42)) + + + +function outerFnSignature(n: K) : { +>outerFnSignature : Symbol(outerFnSignature, Decl(declarationEmitInstantationExpressionNested.ts, 55, 74)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 59, 26)) +>n : Symbol(n, Decl(declarationEmitInstantationExpressionNested.ts, 59, 29)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 59, 26)) + + (a: [T, K]): a is [T, K] +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 60, 5)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 60, 8)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 60, 5)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 59, 26)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 60, 8)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 60, 5)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 59, 26)) + +} { + return null! +} + +export let nrFnFromFnSignature = outerFnSignature(1) +>nrFnFromFnSignature : Symbol(nrFnFromFnSignature, Decl(declarationEmitInstantationExpressionNested.ts, 65, 10)) +>outerFnSignature : Symbol(outerFnSignature, Decl(declarationEmitInstantationExpressionNested.ts, 55, 74)) + + + +function outerFnType(n: K) : (a: [T, K]) => a is [T, K] { +>outerFnType : Symbol(outerFnType, Decl(declarationEmitInstantationExpressionNested.ts, 65, 60)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 69, 21)) +>n : Symbol(n, Decl(declarationEmitInstantationExpressionNested.ts, 69, 24)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 69, 21)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 69, 33)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 69, 36)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 69, 33)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 69, 21)) +>a : Symbol(a, Decl(declarationEmitInstantationExpressionNested.ts, 69, 36)) +>T : Symbol(T, Decl(declarationEmitInstantationExpressionNested.ts, 69, 33)) +>K : Symbol(K, Decl(declarationEmitInstantationExpressionNested.ts, 69, 21)) + + return null! +} + +export let nrFnFromFnType = outerFnType(1) +>nrFnFromFnType : Symbol(nrFnFromFnType, Decl(declarationEmitInstantationExpressionNested.ts, 73, 10)) +>outerFnType : Symbol(outerFnType, Decl(declarationEmitInstantationExpressionNested.ts, 65, 60)) + diff --git a/tests/baselines/reference/declarationEmitInstantationExpressionNested.types b/tests/baselines/reference/declarationEmitInstantationExpressionNested.types new file mode 100644 index 0000000000000..fd52f2a6e871f --- /dev/null +++ b/tests/baselines/reference/declarationEmitInstantationExpressionNested.types @@ -0,0 +1,278 @@ +//// [tests/cases/compiler/declarationEmitInstantationExpressionNested.ts] //// + +=== declarationEmitInstantationExpressionNested.ts === +function outerFnExpression(n: K) { +>outerFnExpression : (n: K) => (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^^ ^^ ^^^^^ +>n : K +> : ^ + + return function (a: [T, K]): a is [T, K] { +>function (a: [T, K]): a is [T, K] { return null! } : (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^ +>a : [T, K] +> : ^^^^^^ + + return null! +>null! : never +> : ^^^^^ + } +} + +export let nrFnFromFnExpression = outerFnExpression(1) +>nrFnFromFnExpression : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnExpression(1) : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnExpression(1) : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnExpression : (n: K) => (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^^ ^^ ^^^^^ +>1 : 1 +> : ^ + + +function outerArrowFn(n: K) { +>outerArrowFn : (n: K) => (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^^ ^^ ^^^^^ +>n : K +> : ^ + + return function (a: [T, K]): a is [T, K] { +>function (a: [T, K]): a is [T, K] { return null! } : (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^ +>a : [T, K] +> : ^^^^^^ + + return null! +>null! : never +> : ^^^^^ + } +} + +export let nrFnFromArrowFn = outerArrowFn(1) +>nrFnFromArrowFn : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerArrowFn(1) : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerArrowFn(1) : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerArrowFn : (n: K) => (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^^ ^^ ^^^^^ +>1 : 1 +> : ^ + +function outerObjectMethod(n: K) { +>outerObjectMethod : (n: K) => { inner(a: [T, K]): a is [T, K]; } +> : ^ ^^ ^^ ^^^^^^^^^^^^^ ^^ ^^ ^^^ ^^^ +>n : K +> : ^ + + return { +>{ inner(a: [T, K]): a is [T, K] { return null! } } : { inner(a: [T, K]): a is [T, K]; } +> : ^^^^^^^^ ^^ ^^ ^^^ ^^^ + + inner(a: [T, K]): a is [T, K] { +>inner : (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^ +>a : [T, K] +> : ^^^^^^ + + return null! +>null! : never +> : ^^^^^ + } + } +} + +export let nrFnFromObjectMethod = outerObjectMethod(1).inner +>nrFnFromObjectMethod : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerObjectMethod(1).inner : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerObjectMethod(1).inner : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerObjectMethod(1) : { inner(a: [T, number]): a is [T, number]; } +> : ^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerObjectMethod : (n: K) => { inner(a: [T, K]): a is [T, K]; } +> : ^ ^^ ^^ ^^^^^^^^^^^^^ ^^ ^^ ^^^ ^^^ +>1 : 1 +> : ^ +>inner : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +function outerStaticClassMember(n: K) { +>outerStaticClassMember : (n: K) => typeof (Anonymous class) +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>n : K +> : ^ + + return class { +>class { static inner(a: [T, K]): a is [T, K] { return null! } } : typeof (Anonymous class) +> : ^^^^^^^^^^^^^^^^^^^^^^^^ + + static inner(a: [T, K]): a is [T, K] { +>inner : (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^ +>a : [T, K] +> : ^^^^^^ + + return null! +>null! : never +> : ^^^^^ + } + } +} + +export let nrFnFromStaticClassMember = outerStaticClassMember(1).inner +>nrFnFromStaticClassMember : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerStaticClassMember(1).inner : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerStaticClassMember(1).inner : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerStaticClassMember(1) : typeof (Anonymous class) +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>outerStaticClassMember : (n: K) => typeof (Anonymous class) +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>1 : 1 +> : ^ +>inner : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +function outerClassMethod(n: K) { +>outerClassMethod : (n: K) => typeof (Anonymous class) +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>n : K +> : ^ + + return class { +>class { inner(a: [T, K]): a is [T, K] { return null! } } : typeof (Anonymous class) +> : ^^^^^^^^^^^^^^^^^^^^^^^^ + + inner(a: [T, K]): a is [T, K] { +>inner : (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^ +>a : [T, K] +> : ^^^^^^ + + return null! +>null! : never +> : ^^^^^ + } + } +} + +export let nrFnFromClassMethod = new (outerClassMethod(1))().inner +>nrFnFromClassMethod : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>new (outerClassMethod(1))().inner : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>new (outerClassMethod(1))().inner : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>new (outerClassMethod(1))() : outerClassMethod.(Anonymous class) +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>(outerClassMethod(1)) : typeof (Anonymous class) +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>outerClassMethod(1) : typeof (Anonymous class) +> : ^^^^^^^^^^^^^^^^^^^^^^^^ +>outerClassMethod : (n: K) => typeof (Anonymous class) +> : ^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>1 : 1 +> : ^ +>inner : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +function outerMethodSignature(n: K) : { +>outerMethodSignature : (n: K) => { inner(a: [T, K]): a is [T, K]; } +> : ^ ^^ ^^ ^^^^^ +>n : K +> : ^ + + inner(a: [T, K]): a is [T, K] +>inner : (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^ +>a : [T, K] +> : ^^^^^^ + +} { + return null! +>null! : never +> : ^^^^^ +} + +export let nrFnFromMethodSignature = outerMethodSignature(1).inner +>nrFnFromMethodSignature : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerMethodSignature(1).inner : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerMethodSignature(1).inner : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerMethodSignature(1) : { inner(a: [T, number]): a is [T, number]; } +> : ^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerMethodSignature : (n: K) => { inner(a: [T, K]): a is [T, K]; } +> : ^ ^^ ^^ ^^^^^ +>1 : 1 +> : ^ +>inner : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + + +function outerFnSignature(n: K) : { +>outerFnSignature : (n: K) => { (a: [T, K]): a is [T, K]; } +> : ^ ^^ ^^ ^^^^^ +>n : K +> : ^ + + (a: [T, K]): a is [T, K] +>a : [T, K] +> : ^^^^^^ + +} { + return null! +>null! : never +> : ^^^^^ +} + +export let nrFnFromFnSignature = outerFnSignature(1) +>nrFnFromFnSignature : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnSignature(1) : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnSignature(1) : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnSignature : (n: K) => { (a: [T, K]): a is [T, K]; } +> : ^ ^^ ^^ ^^^^^ +>1 : 1 +> : ^ + + + +function outerFnType(n: K) : (a: [T, K]) => a is [T, K] { +>outerFnType : (n: K) => (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^ +>n : K +> : ^ +>a : [T, K] +> : ^^^^^^ + + return null! +>null! : never +> : ^^^^^ +} + +export let nrFnFromFnType = outerFnType(1) +>nrFnFromFnType : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnType(1) : (a: [number, number]) => a is [number, number] +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnType(1) : (a: [T, number]) => a is [T, number] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>outerFnType : (n: K) => (a: [T, K]) => a is [T, K] +> : ^ ^^ ^^ ^^^^^ +>1 : 1 +> : ^ + diff --git a/tests/cases/compiler/declarationEmitAliasFromIndirectFile.ts b/tests/cases/compiler/declarationEmitAliasFromIndirectFile.ts index b76a058ab41e3..693fd18b05837 100644 --- a/tests/cases/compiler/declarationEmitAliasFromIndirectFile.ts +++ b/tests/cases/compiler/declarationEmitAliasFromIndirectFile.ts @@ -1,6 +1,6 @@ -// @declaration: true - -// @filename: locale.d.ts +// @declaration: true + +// @filename: locale.d.ts export type Locale = { weekdays: { shorthand: [string, string, string, string, string, string, string]; @@ -13,15 +13,15 @@ export type CustomLocale = { longhand: [string, string, string, string, string, string, string]; }; }; -export type key = "ar" | "bg"; - -// @filename: instance.d.ts +export type key = "ar" | "bg"; + +// @filename: instance.d.ts import { Locale, CustomLocale, key as LocaleKey } from "./locale"; export interface FlatpickrFn { l10ns: {[k in LocaleKey]?: CustomLocale } & { default: Locale }; -} - -// @filename: app.ts +} + +// @filename: app.ts import { FlatpickrFn } from "./instance"; const fp = { l10ns: {} } as FlatpickrFn; -export default fp.l10ns; +export default fp.l10ns; diff --git a/tests/cases/compiler/declarationEmitInstantationExpressionNested.ts b/tests/cases/compiler/declarationEmitInstantationExpressionNested.ts new file mode 100644 index 0000000000000..a15af4efa35b3 --- /dev/null +++ b/tests/cases/compiler/declarationEmitInstantationExpressionNested.ts @@ -0,0 +1,77 @@ +// @declaration: true +// @strict: true + +function outerFnExpression(n: K) { + return function (a: [T, K]): a is [T, K] { + return null! + } +} + +export let nrFnFromFnExpression = outerFnExpression(1) + + +function outerArrowFn(n: K) { + return function (a: [T, K]): a is [T, K] { + return null! + } +} + +export let nrFnFromArrowFn = outerArrowFn(1) + +function outerObjectMethod(n: K) { + return { + inner(a: [T, K]): a is [T, K] { + return null! + } + } +} + +export let nrFnFromObjectMethod = outerObjectMethod(1).inner + + +function outerStaticClassMember(n: K) { + return class { + static inner(a: [T, K]): a is [T, K] { + return null! + } + } +} + +export let nrFnFromStaticClassMember = outerStaticClassMember(1).inner + + +function outerClassMethod(n: K) { + return class { + inner(a: [T, K]): a is [T, K] { + return null! + } + } +} + +export let nrFnFromClassMethod = new (outerClassMethod(1))().inner + +function outerMethodSignature(n: K) : { + inner(a: [T, K]): a is [T, K] +} { + return null! +} + +export let nrFnFromMethodSignature = outerMethodSignature(1).inner + + + +function outerFnSignature(n: K) : { + (a: [T, K]): a is [T, K] +} { + return null! +} + +export let nrFnFromFnSignature = outerFnSignature(1) + + + +function outerFnType(n: K) : (a: [T, K]) => a is [T, K] { + return null! +} + +export let nrFnFromFnType = outerFnType(1) \ No newline at end of file