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");