diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index 0cac627bbac45..7282903299f4d 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -221,7 +221,7 @@ export function getDefinitionAtPosition(program: Program, sourceFile: SourceFile if (node.parent.kind === SyntaxKind.ShorthandPropertyAssignment) { const shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); const definitions = shorthandSymbol?.declarations ? shorthandSymbol.declarations.map(decl => createDefinitionInfo(decl, typeChecker, shorthandSymbol, node, /*unverified*/ false, failedAliasResolution)) : emptyArray; - return concatenate(definitions, getDefinitionFromObjectLiteralElement(typeChecker, node) || emptyArray); + return concatenate(definitions, getDefinitionFromObjectLiteralElement(typeChecker, node)); } // If the node is the name of a BindingElement within an ObjectBindingPattern instead of just returning the @@ -245,7 +245,8 @@ export function getDefinitionAtPosition(program: Program, sourceFile: SourceFile }); } - return concatenate(fileReferenceDefinition, getDefinitionFromObjectLiteralElement(typeChecker, node) || getDefinitionFromSymbol(typeChecker, symbol, node, failedAliasResolution)); + const objectLiteralElementDefinition = getDefinitionFromObjectLiteralElement(typeChecker, node); + return concatenate(fileReferenceDefinition, objectLiteralElementDefinition.length ? objectLiteralElementDefinition : getDefinitionFromSymbol(typeChecker, symbol, node, failedAliasResolution)); } /** @@ -278,6 +279,7 @@ function getDefinitionFromObjectLiteralElement(typeChecker: TypeChecker, node: N getDefinitionFromSymbol(typeChecker, propertySymbol, node)); } } + return emptyArray; } function getDefinitionFromOverriddenMember(typeChecker: TypeChecker, node: Node) { @@ -366,7 +368,7 @@ export function getTypeDefinitionAtPosition(typeChecker: TypeChecker, sourceFile const typeDefinitions = fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node, failedAliasResolution); return typeDefinitions.length ? typeDefinitions : !(symbol.flags & SymbolFlags.Value) && symbol.flags & SymbolFlags.Type ? getDefinitionFromSymbol(typeChecker, skipAlias(symbol, typeChecker), node, failedAliasResolution) - : undefined; + : undefined; } function definitionFromType(type: Type, checker: TypeChecker, node: Node, failedAliasResolution: boolean | undefined): readonly DefinitionInfo[] { diff --git a/tests/baselines/reference/goToDefinitionSatisfiesExpression1.baseline.jsonc b/tests/baselines/reference/goToDefinitionSatisfiesExpression1.baseline.jsonc new file mode 100644 index 0000000000000..49068ab4be7f5 --- /dev/null +++ b/tests/baselines/reference/goToDefinitionSatisfiesExpression1.baseline.jsonc @@ -0,0 +1,45 @@ +// === goToDefinition === +// === /tests/cases/fourslash/goToDefinitionSatisfiesExpression1.ts === +// const STRINGS = { +// /*GOTO DEF*/<|[|{| textSpan: true |}title|]: 'A Title'|>, +// } satisfies Record; +// +// //somewhere in app +// STRINGS.title + + // === Details === + [ + { + "kind": "property", + "name": "title", + "containerName": "__object", + "isLocal": false, + "isAmbient": false, + "unverified": false, + "failedAliasResolution": false + } + ] + + + +// === goToDefinition === +// === /tests/cases/fourslash/goToDefinitionSatisfiesExpression1.ts === +// const STRINGS = { +// <|[|title|]: 'A Title'|>, +// } satisfies Record; +// +// //somewhere in app +// STRINGS./*GOTO DEF*/title + + // === Details === + [ + { + "kind": "property", + "name": "title", + "containerName": "__object", + "isLocal": false, + "isAmbient": false, + "unverified": false, + "failedAliasResolution": false + } + ] \ No newline at end of file diff --git a/tests/cases/fourslash/goToDefinitionSatisfiesExpression1.ts b/tests/cases/fourslash/goToDefinitionSatisfiesExpression1.ts new file mode 100644 index 0000000000000..a81fbc849aa11 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionSatisfiesExpression1.ts @@ -0,0 +1,10 @@ +/// + +////const STRINGS = { +//// [|/*definition*/title|]: 'A Title', +////} satisfies Record; +//// +//////somewhere in app +////STRINGS.[|/*usage*/title|] + +verify.baselineGoToDefinition("definition", "usage")