From e76d17257a79bffda40d18a753850af3abf92d38 Mon Sep 17 00:00:00 2001 From: Song <158983297@qq.com> Date: Thu, 23 Jul 2020 00:30:21 +0800 Subject: [PATCH] Fix 38219: signature helper works for optional function condition. (#39672) * fix optional fuction condition. * Adds a test Co-authored-by: Orta --- src/services/signatureHelp.ts | 9 +++++--- .../signatureHelpForOptionalMethods.ts | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 tests/cases/fourslash/signatureHelpForOptionalMethods.ts diff --git a/src/services/signatureHelp.ts b/src/services/signatureHelp.ts index 954cd1da9e1..c8b333d0356 100644 --- a/src/services/signatureHelp.ts +++ b/src/services/signatureHelp.ts @@ -304,14 +304,17 @@ namespace ts.SignatureHelp { if (!info) return undefined; const { contextualType, argumentIndex, argumentCount, argumentsSpan } = info; - const signatures = contextualType.getCallSignatures(); + // for optional function condition. + const nonNullableContextualType = contextualType.getNonNullableType(); + + const signatures = nonNullableContextualType.getCallSignatures(); if (signatures.length !== 1) return undefined; - const invocation: ContextualInvocation = { kind: InvocationKind.Contextual, signature: first(signatures), node: startingToken, symbol: chooseBetterSymbol(contextualType.symbol) }; + const invocation: ContextualInvocation = { kind: InvocationKind.Contextual, signature: first(signatures), node: startingToken, symbol: chooseBetterSymbol(nonNullableContextualType.symbol) }; return { isTypeParameterList: false, invocation, argumentsSpan, argumentIndex, argumentCount }; } - interface ContextualSignatureLocationInfo {readonly contextualType: Type; readonly argumentIndex: number; readonly argumentCount: number; readonly argumentsSpan: TextSpan; } + interface ContextualSignatureLocationInfo { readonly contextualType: Type; readonly argumentIndex: number; readonly argumentCount: number; readonly argumentsSpan: TextSpan; } function getContextualSignatureLocationInfo(startingToken: Node, sourceFile: SourceFile, checker: TypeChecker): ContextualSignatureLocationInfo | undefined { if (startingToken.kind !== SyntaxKind.OpenParenToken && startingToken.kind !== SyntaxKind.CommaToken) return undefined; const { parent } = startingToken; diff --git a/tests/cases/fourslash/signatureHelpForOptionalMethods.ts b/tests/cases/fourslash/signatureHelpForOptionalMethods.ts new file mode 100644 index 00000000000..6e5578fa985 --- /dev/null +++ b/tests/cases/fourslash/signatureHelpForOptionalMethods.ts @@ -0,0 +1,22 @@ +// #39672 +// +// @strict: true + +//// interface Obj { +//// optionalMethod?: (current: any) => any; +//// }; +//// +//// const o: Obj = { +//// optionalMethod(/*1*/) { +//// return {}; +//// } +//// }; + +verify.signatureHelp( + { + marker: "1", + text: 'optionalMethod(current: any): any', + parameterName: "current", + parameterSpan: "current: any", + }, +);