Fix 38219: signature helper works for optional function condition. (#39672)

* fix optional fuction condition.

* Adds a test

Co-authored-by: Orta <git@orta.io>
This commit is contained in:
Song
2020-07-22 12:30:21 -04:00
committed by GitHub
co-authored by Orta
parent 8a05707559
commit e76d17257a
2 changed files with 28 additions and 3 deletions
+6 -3
View File
@@ -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;
@@ -0,0 +1,22 @@
// #39672
// <reference path='fourslash.ts'/>
// @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",
},
);