diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts
index e5fbe7f3bb10b..5bc4ff8104480 100644
--- a/src/services/goToDefinition.ts
+++ b/src/services/goToDefinition.ts
@@ -131,6 +131,18 @@ export function getDefinitionAtPosition(program: Program, sourceFile: SourceFile
return functionDeclaration ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : undefined;
}
+ if (node.kind === SyntaxKind.AwaitKeyword) {
+ const functionDeclaration = findAncestor(node, n => isFunctionLikeDeclaration(n)) as FunctionLikeDeclaration | undefined;
+ const isAsyncFunction = functionDeclaration && some(functionDeclaration.modifiers, (node) => node.kind === SyntaxKind.AsyncKeyword);
+ return isAsyncFunction ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : undefined;
+ }
+
+ if (node.kind === SyntaxKind.YieldKeyword) {
+ const functionDeclaration = findAncestor(node, n => isFunctionLikeDeclaration(n)) as FunctionLikeDeclaration | undefined;
+ const isGeneratorFunction = functionDeclaration && functionDeclaration.asteriskToken;
+ return isGeneratorFunction ? [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/goToDefinitionAwait1.ts b/tests/cases/fourslash/goToDefinitionAwait1.ts
new file mode 100644
index 0000000000000..4d321b0069027
--- /dev/null
+++ b/tests/cases/fourslash/goToDefinitionAwait1.ts
@@ -0,0 +1,12 @@
+///
+
+//// async function /*end1*/foo() {
+//// [|/*start1*/await|] Promise.resolve(0);
+//// }
+
+//// function notAsync() {
+//// [|/*start2*/await|] Promise.resolve(0);
+//// }
+
+verify.goToDefinition("start1", "end1");
+verify.goToDefinition("start2", []);
diff --git a/tests/cases/fourslash/goToDefinitionAwait2.ts b/tests/cases/fourslash/goToDefinitionAwait2.ts
new file mode 100644
index 0000000000000..1af7de5c060a5
--- /dev/null
+++ b/tests/cases/fourslash/goToDefinitionAwait2.ts
@@ -0,0 +1,5 @@
+///
+
+//// [|/*start*/await|] Promise.resolve(0);
+
+verify.goToDefinition("start", []);
diff --git a/tests/cases/fourslash/goToDefinitionAwait3.ts b/tests/cases/fourslash/goToDefinitionAwait3.ts
new file mode 100644
index 0000000000000..42edfc3fe06fa
--- /dev/null
+++ b/tests/cases/fourslash/goToDefinitionAwait3.ts
@@ -0,0 +1,14 @@
+///
+
+//// class C {
+//// notAsync() {
+//// [|/*start1*/await|] Promise.resolve(0);
+//// }
+////
+//// async /*end2*/foo() {
+//// [|/*start2*/await|] Promise.resolve(0);
+//// }
+//// }
+
+verify.goToDefinition("start1", []);
+verify.goToDefinition("start2", "end2");
diff --git a/tests/cases/fourslash/goToDefinitionAwait4.ts b/tests/cases/fourslash/goToDefinitionAwait4.ts
new file mode 100644
index 0000000000000..75bc3cfb98679
--- /dev/null
+++ b/tests/cases/fourslash/goToDefinitionAwait4.ts
@@ -0,0 +1,9 @@
+///
+
+//// async function outerAsyncFun() {
+//// let /*end*/af = async () => {
+//// [|/*start*/await|] Promise.resolve(0);
+//// }
+//// }
+
+verify.goToDefinition("start", "end");
diff --git a/tests/cases/fourslash/goToDefinitionYield1.ts b/tests/cases/fourslash/goToDefinitionYield1.ts
new file mode 100644
index 0000000000000..c2e781b31ef81
--- /dev/null
+++ b/tests/cases/fourslash/goToDefinitionYield1.ts
@@ -0,0 +1,12 @@
+///
+
+//// function* /*end1*/gen() {
+//// [|/*start1*/yield|] 0;
+//// }
+////
+//// const /*end2*/genFunction = function*() {
+//// [|/*start2*/yield|] 0;
+//// }
+
+verify.goToDefinition("start1", "end1");
+verify.goToDefinition("start2", "end2");
diff --git a/tests/cases/fourslash/goToDefinitionYield2.ts b/tests/cases/fourslash/goToDefinitionYield2.ts
new file mode 100644
index 0000000000000..c8bf3d596316e
--- /dev/null
+++ b/tests/cases/fourslash/goToDefinitionYield2.ts
@@ -0,0 +1,10 @@
+///
+
+//// function* outerGen() {
+//// function* /*end*/gen() {
+//// [|/*start*/yield|] 0;
+//// }
+//// return gen
+//// }
+
+verify.goToDefinition("start", "end");
diff --git a/tests/cases/fourslash/goToDefinitionYield3.ts b/tests/cases/fourslash/goToDefinitionYield3.ts
new file mode 100644
index 0000000000000..06eaa111e0ccd
--- /dev/null
+++ b/tests/cases/fourslash/goToDefinitionYield3.ts
@@ -0,0 +1,14 @@
+///
+
+//// class C {
+//// notAGenerator() {
+//// [|/*start1*/yield|] 0;
+//// }
+////
+//// foo*/*end2*/() {
+//// [|/*start2*/yield|] 0;
+//// }
+//// }
+
+verify.goToDefinition("start1", []);
+verify.goToDefinition("start2", "end2");
diff --git a/tests/cases/fourslash/goToDefinitionYield4.ts b/tests/cases/fourslash/goToDefinitionYield4.ts
new file mode 100644
index 0000000000000..0de3aa30247f9
--- /dev/null
+++ b/tests/cases/fourslash/goToDefinitionYield4.ts
@@ -0,0 +1,7 @@
+///
+
+//// function* gen() {
+//// class C { [/*start*/yield 10]() {} }
+//// }
+
+verify.goToDefinition("start", []);