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", []);