diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 89a9f699792..f79abf73437 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -216,7 +216,32 @@ namespace ts.FindAllReferences { export function getImplementationsAtPosition(program: Program, cancellationToken: CancellationToken, sourceFiles: readonly SourceFile[], sourceFile: SourceFile, position: number): ImplementationLocation[] | undefined { const node = getTouchingPropertyName(sourceFile, position); - const referenceEntries = getImplementationReferenceEntries(program, cancellationToken, sourceFiles, node, position); + let referenceEntries: Entry[] | undefined; + const entries = getImplementationReferenceEntries(program, cancellationToken, sourceFiles, node, position); + + if ( + node.parent.kind === SyntaxKind.PropertyAccessExpression + || node.parent.kind === SyntaxKind.BindingElement + || node.parent.kind === SyntaxKind.ElementAccessExpression + || node.kind === SyntaxKind.SuperKeyword + ) { + referenceEntries = entries && [...entries]; + } + else { + const queue = entries && [...entries]; + const seenNodes = createMap(); + while (queue && queue.length) { + const entry = queue.shift() as NodeEntry; + if (!addToSeen(seenNodes, getNodeId(entry.node))) { + continue; + } + referenceEntries = append(referenceEntries, entry); + const entries = getImplementationReferenceEntries(program, cancellationToken, sourceFiles, entry.node, entry.node.pos); + if (entries) { + queue.push(...entries); + } + } + } const checker = program.getTypeChecker(); return map(referenceEntries, entry => toImplementationLocation(entry, checker)); } diff --git a/tests/cases/fourslash/goToImplementationInterface_01.ts b/tests/cases/fourslash/goToImplementationInterface_01.ts index 9f76e9db5cd..a797fca37bc 100644 --- a/tests/cases/fourslash/goToImplementationInterface_01.ts +++ b/tests/cases/fourslash/goToImplementationInterface_01.ts @@ -10,10 +10,10 @@ //// abstract hello (): void; //// } //// -//// class Bar extends SuperBar { +//// class [|Bar|] extends SuperBar { //// } //// -//// class NotAbstractBar extends AbstractBar { +//// class [|NotAbstractBar|] extends AbstractBar { //// hello () {} //// } ////