diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index 866588c51b993..285c9e51c592e 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -26,6 +26,12 @@ namespace ts.GoToDefinition { return label ? [createDefinitionInfoFromName(typeChecker, label, ScriptElementKind.label, node.text, /*containerName*/ undefined!)] : undefined; // TODO: GH#18217 } + if (node.kind === SyntaxKind.ReturnKeyword) { + const functionDeclaration = findAncestor(node.parent, n => + isClassStaticBlockDeclaration(n) ? "quit" : isFunctionLikeDeclaration(n)) as FunctionLikeDeclaration; + return functionDeclaration ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : undefined; + } + if (isStaticModifier(node) && isClassStaticBlockDeclaration(node.parent)) { const classDecl = node.parent.parent; const { symbol, failedAliasResolution } = getSymbol(classDecl, typeChecker, stopAtAlias); diff --git a/tests/cases/fourslash/goToDefinitionReturn1.ts b/tests/cases/fourslash/goToDefinitionReturn1.ts new file mode 100644 index 0000000000000..6c8c1550c3167 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn1.ts @@ -0,0 +1,7 @@ +/// + +////function /*end*/foo() { +//// [|/*start*/return|] 10; +////} + +verify.goToDefinition("start", "end"); diff --git a/tests/cases/fourslash/goToDefinitionReturn2.ts b/tests/cases/fourslash/goToDefinitionReturn2.ts new file mode 100644 index 0000000000000..a101880397aef --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn2.ts @@ -0,0 +1,9 @@ +/// + +////function foo() { +//// return /*end*/() => { +//// [|/*start*/return|] 10; +//// } +////} + +verify.goToDefinition("start", "end"); diff --git a/tests/cases/fourslash/goToDefinitionReturn3.ts b/tests/cases/fourslash/goToDefinitionReturn3.ts new file mode 100644 index 0000000000000..e3f1f952fa2fb --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn3.ts @@ -0,0 +1,9 @@ +/// + +////class C { +//// /*end*/m() { +//// [|/*start*/return|] 1; +//// } +////} + +verify.goToDefinition("start", "end"); diff --git a/tests/cases/fourslash/goToDefinitionReturn4.ts b/tests/cases/fourslash/goToDefinitionReturn4.ts new file mode 100644 index 0000000000000..d86f8227e8d15 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn4.ts @@ -0,0 +1,5 @@ +/// + +////[|/*start*/return|]; + +verify.goToDefinition("start", []); diff --git a/tests/cases/fourslash/goToDefinitionReturn5.ts b/tests/cases/fourslash/goToDefinitionReturn5.ts new file mode 100644 index 0000000000000..12dd4302063c0 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn5.ts @@ -0,0 +1,9 @@ +/// + +////function foo() { +//// class Foo { +//// static { [|/*start*/return|]; } +//// } +////} + +verify.goToDefinition("start", []); diff --git a/tests/cases/fourslash/goToDefinitionReturn6.ts b/tests/cases/fourslash/goToDefinitionReturn6.ts new file mode 100644 index 0000000000000..500e2043fdf03 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn6.ts @@ -0,0 +1,9 @@ +/// + +////function foo() { +//// return /*end*/function () { +//// [|/*start*/return|] 10; +//// } +////} + +verify.goToDefinition("start", "end"); diff --git a/tests/cases/fourslash/goToDefinitionReturn7.ts b/tests/cases/fourslash/goToDefinitionReturn7.ts new file mode 100644 index 0000000000000..b2a2c70b5c98f --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn7.ts @@ -0,0 +1,9 @@ +/// + +////function foo(a: string, b: string): string; +////function foo(a: number, b: number): number; +////function /*end*/foo(a: any, b: any): any { +//// [|/*start*/return|] a + b; +////} + +verify.goToDefinition("start", "end");