@@ -2792,20 +2792,36 @@ namespace ts {
27922792 return node && node . parent && node . parent . kind === SyntaxKind . PropertyAccessExpression && ( < PropertyAccessExpression > node . parent ) . name === node ;
27932793 }
27942794
2795+ function climbPastPropertyAccess ( node : Node ) {
2796+ return isRightSideOfPropertyAccess ( node ) ? node . parent : node ;
2797+ }
2798+
2799+ function climbPastManyPropertyAccesses ( node : Node ) : Node {
2800+ return isRightSideOfPropertyAccess ( node ) ? climbPastManyPropertyAccesses ( node . parent ) : node ;
2801+ }
2802+
27952803 function isCallExpressionTarget ( node : Node ) : boolean {
2796- if ( isRightSideOfPropertyAccess ( node ) ) {
2797- node = node . parent ;
2798- }
2804+ node = climbPastPropertyAccess ( node ) ;
27992805 return node && node . parent && node . parent . kind === SyntaxKind . CallExpression && ( < CallExpression > node . parent ) . expression === node ;
28002806 }
28012807
28022808 function isNewExpressionTarget ( node : Node ) : boolean {
2803- if ( isRightSideOfPropertyAccess ( node ) ) {
2804- node = node . parent ;
2805- }
2809+ node = climbPastPropertyAccess ( node ) ;
28062810 return node && node . parent && node . parent . kind === SyntaxKind . NewExpression && ( < CallExpression > node . parent ) . expression === node ;
28072811 }
28082812
2813+ /** Returns a CallLikeExpression where `node` is the target being invoked. */
2814+ function getAncestorCallLikeExpression ( node : Node ) : CallLikeExpression | undefined {
2815+ const target = climbPastManyPropertyAccesses ( node ) ;
2816+ const callLike = target . parent ;
2817+ return callLike && isCallLikeExpression ( callLike ) && getInvokedExpression ( callLike ) === target && callLike ;
2818+ }
2819+
2820+ function tryGetSignatureDeclaration ( typeChecker : TypeChecker , node : Node ) : SignatureDeclaration | undefined {
2821+ const callLike = getAncestorCallLikeExpression ( node ) ;
2822+ return callLike && typeChecker . getResolvedSignature ( callLike ) . declaration ;
2823+ }
2824+
28092825 function isNameOfModuleDeclaration ( node : Node ) {
28102826 return node . parent . kind === SyntaxKind . ModuleDeclaration && ( < ModuleDeclaration > node . parent ) . name === node ;
28112827 }
@@ -5072,14 +5088,25 @@ namespace ts {
50725088 } ;
50735089 }
50745090
5091+ function getSymbolInfo ( typeChecker : TypeChecker , symbol : Symbol , node : Node ) {
5092+ return {
5093+ symbolName : typeChecker . symbolToString ( symbol ) , // Do not get scoped name, just the name of the symbol
5094+ symbolKind : getSymbolKind ( symbol , node ) ,
5095+ containerName : symbol . parent ? typeChecker . symbolToString ( symbol . parent , node ) : ""
5096+ } ;
5097+ }
5098+
5099+ function createDefinitionFromSignatureDeclaration ( decl : SignatureDeclaration ) : DefinitionInfo {
5100+ const typeChecker = program . getTypeChecker ( ) ;
5101+ const { symbolName, symbolKind, containerName } = getSymbolInfo ( typeChecker , decl . symbol , decl ) ;
5102+ return createDefinitionInfo ( decl , symbolKind , symbolName , containerName ) ;
5103+ }
5104+
50755105 function getDefinitionFromSymbol ( symbol : Symbol , node : Node ) : DefinitionInfo [ ] {
50765106 const typeChecker = program . getTypeChecker ( ) ;
50775107 const result : DefinitionInfo [ ] = [ ] ;
50785108 const declarations = symbol . getDeclarations ( ) ;
5079- const symbolName = typeChecker . symbolToString ( symbol ) ; // Do not get scoped name, just the name of the symbol
5080- const symbolKind = getSymbolKind ( symbol , node ) ;
5081- const containerSymbol = symbol . parent ;
5082- const containerName = containerSymbol ? typeChecker . symbolToString ( containerSymbol , node ) : "" ;
5109+ const { symbolName, symbolKind, containerName } = getSymbolInfo ( typeChecker , symbol , node ) ;
50835110
50845111 if ( ! tryAddConstructSignature ( symbol , node , symbolKind , symbolName , containerName , result ) &&
50855112 ! tryAddCallSignature ( symbol , node , symbolKind , symbolName , containerName , result ) ) {
@@ -5205,6 +5232,12 @@ namespace ts {
52055232 }
52065233
52075234 const typeChecker = program . getTypeChecker ( ) ;
5235+
5236+ const calledDeclaration = tryGetSignatureDeclaration ( typeChecker , node ) ;
5237+ if ( calledDeclaration ) {
5238+ return [ createDefinitionFromSignatureDeclaration ( calledDeclaration ) ] ;
5239+ }
5240+
52085241 let symbol = typeChecker . getSymbolAtLocation ( node ) ;
52095242
52105243 // Could not find a symbol e.g. node is string or number keyword,
0 commit comments