diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index af03eb260f5..9ae8dda40f8 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -198,14 +198,17 @@ namespace ts.GoToDefinition { return undefined; } - const symbol = typeChecker.getSymbolAtLocation(node); + const symbol = getSymbol(node, typeChecker); if (!symbol) return undefined; const typeAtLocation = typeChecker.getTypeOfSymbolAtLocation(symbol, node); const returnType = tryGetReturnTypeOfFunction(symbol, typeAtLocation, typeChecker); const fromReturnType = returnType && definitionFromType(returnType, typeChecker, node); // If a function returns 'void' or some other type with no definition, just return the function definition. - return fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node); + const typeDefinitions = fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node); + return typeDefinitions.length ? typeDefinitions + : !(symbol.flags & SymbolFlags.Value) && symbol.flags & SymbolFlags.Type ? getDefinitionFromSymbol(typeChecker, skipAlias(symbol, typeChecker), node) + : undefined; } function definitionFromType(type: Type, checker: TypeChecker, node: Node): readonly DefinitionInfo[] { diff --git a/tests/cases/fourslash/goToTypeDefinition3.ts b/tests/cases/fourslash/goToTypeDefinition3.ts new file mode 100644 index 00000000000..861796e0a34 --- /dev/null +++ b/tests/cases/fourslash/goToTypeDefinition3.ts @@ -0,0 +1,6 @@ +/// + +////type /*definition*/T = string; +////const x: /*reference*/T; + +verify.goToType("reference", "definition"); diff --git a/tests/cases/fourslash/goToTypeDefinition4.ts b/tests/cases/fourslash/goToTypeDefinition4.ts new file mode 100644 index 00000000000..7c00b132f89 --- /dev/null +++ b/tests/cases/fourslash/goToTypeDefinition4.ts @@ -0,0 +1,12 @@ +/// + +// @Filename: foo.ts +////export type /*def0*/T = string; +////export const /*def1*/T = ""; + +// @Filename: bar.ts +////import { T } from "./foo"; +////let x: [|/*reference*/T|]; + +verify.goToType("reference", []); +verify.goToDefinition("reference", ["def0", "def1"]); diff --git a/tests/cases/fourslash/goToTypeDefinition5.ts b/tests/cases/fourslash/goToTypeDefinition5.ts new file mode 100644 index 00000000000..8750a6697bf --- /dev/null +++ b/tests/cases/fourslash/goToTypeDefinition5.ts @@ -0,0 +1,10 @@ +/// + +// @Filename: foo.ts +////let Foo: /*definition*/unresolved; +////type Foo = { x: string }; + +/////*reference*/Foo; + + +verify.goToType("reference", []);