From 369832e33d559faeefd9e34e0f85c20516035d82 Mon Sep 17 00:00:00 2001 From: Oleksandr Tarasiuk Date: Thu, 13 Nov 2025 16:13:20 +0200 Subject: [PATCH] fix(2074): use the parent node for symbol lookup --- internal/checker/checker.go | 2 +- internal/checker/nodebuilderimpl.go | 3 ++ .../fourslash/tests/quickInfoFunction_test.go | 17 +++++++ .../documentHighlights_40082.baseline.jsonc | 2 +- ...portDefaultClassConstructor.baseline.jsonc | 2 +- ...ndAllRefsForDefaultExport04.baseline.jsonc | 14 +++++- ...sForDefaultExport_anonymous.baseline.jsonc | 5 +- ...RefsForFunctionExpression01.baseline.jsonc | 4 +- ...WithLeadingUnderscoreNames8.baseline.jsonc | 2 +- ...WithLeadingUnderscoreNames9.baseline.jsonc | 2 +- .../referencesForModifiers.baseline.jsonc | 2 +- .../goToDefinitionSwitchCase5.baseline.jsonc | 2 +- .../goToDefinitionSwitchCase7.baseline.jsonc | 2 +- .../quickInfo/jsDocAliasQuickInfo.baseline | 24 +++++++-- ...DisplayPartsClassDefaultAnonymous.baseline | 48 +++++++++++++++--- ...InfoDisplayPartsClassDefaultNamed.baseline | 48 +++++++++++++++--- ...ckInfoDisplayPartsClassIncomplete.baseline | 24 +++++++-- ...nfoDisplayPartsFunctionIncomplete.baseline | 50 ++++++++++++++++--- ...nfoNestedExportEqualExportDefault.baseline | 24 +++++++-- 19 files changed, 238 insertions(+), 39 deletions(-) create mode 100644 internal/fourslash/tests/quickInfoFunction_test.go diff --git a/internal/checker/checker.go b/internal/checker/checker.go index f9017a92a0..ccade6b56f 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -30518,7 +30518,7 @@ func (c *Checker) getSymbolAtLocation(node *ast.Node, ignoreErrors bool) *ast.Sy } return nil case ast.KindDefaultKeyword, ast.KindFunctionKeyword, ast.KindEqualsGreaterThanToken, ast.KindClassKeyword: - return c.getSymbolOfNode(node) + return c.getSymbolOfNode(node.Parent) case ast.KindImportType: if ast.IsLiteralImportTypeNode(node) { return c.getSymbolAtLocation(node.AsImportTypeNode().Argument.AsLiteralTypeNode().Literal, ignoreErrors) diff --git a/internal/checker/nodebuilderimpl.go b/internal/checker/nodebuilderimpl.go index f1f4c7ad2a..7cf152edfe 100644 --- a/internal/checker/nodebuilderimpl.go +++ b/internal/checker/nodebuilderimpl.go @@ -886,6 +886,9 @@ func (b *NodeBuilderImpl) getNameOfSymbolAsWritten(symbol *ast.Symbol) string { if len(name) > 0 { return name } + if symbol.Name == ast.InternalSymbolNameMissing { + return "__missing" + } return symbol.Name } diff --git a/internal/fourslash/tests/quickInfoFunction_test.go b/internal/fourslash/tests/quickInfoFunction_test.go new file mode 100644 index 0000000000..29548269e4 --- /dev/null +++ b/internal/fourslash/tests/quickInfoFunction_test.go @@ -0,0 +1,17 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestQuickInfoFunction(t *testing.T) { + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `/**/function foo() { return "hi"; }` + + f := fourslash.NewFourslash(t, nil /*capabilities*/, content) + f.VerifyQuickInfoAt(t, "", "function foo(): string", "") +} diff --git a/testdata/baselines/reference/fourslash/documentHighlights/documentHighlights_40082.baseline.jsonc b/testdata/baselines/reference/fourslash/documentHighlights/documentHighlights_40082.baseline.jsonc index 9a74597f6d..5d0cc5cbf7 100644 --- a/testdata/baselines/reference/fourslash/documentHighlights/documentHighlights_40082.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/documentHighlights/documentHighlights_40082.baseline.jsonc @@ -1,6 +1,6 @@ // === documentHighlights === // === /documentHighlights_40082.ts === // export = (state, messages) => { -// export /*HIGHLIGHTS*/default { +// export /*HIGHLIGHTS*/[|default|] { // } // } \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsExportDefaultClassConstructor.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsExportDefaultClassConstructor.baseline.jsonc index af95e7e1a7..4bedb5b167 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsExportDefaultClassConstructor.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsExportDefaultClassConstructor.baseline.jsonc @@ -1,5 +1,5 @@ // === findAllReferences === // === /findAllRefsExportDefaultClassConstructor.ts === // export default class { -// /*FIND ALL REFS*/constructor() {} +// /*FIND ALL REFS*/[|constructor|]() {} // } \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForDefaultExport04.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForDefaultExport04.baseline.jsonc index a5fd072cef..d1fe7e8668 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForDefaultExport04.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForDefaultExport04.baseline.jsonc @@ -23,11 +23,19 @@ // === findAllReferences === // === /a.ts === // const a = 0; -// export /*FIND ALL REFS*/default a; +// export /*FIND ALL REFS*/[|default|] a; + +// === /b.ts === +// import [|a|] from "./a"; +// [|a|]; // === findAllReferences === +// === /a.ts === +// const a = 0; +// export [|default|] a; + // === /b.ts === // import /*FIND ALL REFS*/[|a|] from "./a"; // [|a|]; @@ -35,6 +43,10 @@ // === findAllReferences === +// === /a.ts === +// const a = 0; +// export [|default|] a; + // === /b.ts === // import [|a|] from "./a"; // /*FIND ALL REFS*/[|a|]; \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForDefaultExport_anonymous.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForDefaultExport_anonymous.baseline.jsonc index 5f0ee63378..8fe9cad9a2 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForDefaultExport_anonymous.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForDefaultExport_anonymous.baseline.jsonc @@ -1,3 +1,6 @@ // === findAllReferences === // === /a.ts === -// export /*FIND ALL REFS*/default 1; \ No newline at end of file +// export /*FIND ALL REFS*/[|default|] 1; + +// === /b.ts === +// import [|a|] from "./a"; \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForFunctionExpression01.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForFunctionExpression01.baseline.jsonc index f02db6604a..ae707a8518 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForFunctionExpression01.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsForFunctionExpression01.baseline.jsonc @@ -1,7 +1,7 @@ // === findAllReferences === // === /file1.ts === -// var foo = /*FIND ALL REFS*/function foo(a = foo(), b = () => foo) { -// foo(foo, foo); +// var foo = /*FIND ALL REFS*/function [|foo|](a = [|foo|](), b = () => [|foo|]) { +// [|foo|]([|foo|], [|foo|]); // } diff --git a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsWithLeadingUnderscoreNames8.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsWithLeadingUnderscoreNames8.baseline.jsonc index 16510e0f5b..4e30c5fd6e 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsWithLeadingUnderscoreNames8.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsWithLeadingUnderscoreNames8.baseline.jsonc @@ -1,7 +1,7 @@ // === findAllReferences === // === /findAllRefsWithLeadingUnderscoreNames8.ts === // (/*FIND ALL REFS*/function __foo() { -// __foo(); +// [|__foo|](); // }) diff --git a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsWithLeadingUnderscoreNames9.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsWithLeadingUnderscoreNames9.baseline.jsonc index 099cdfee54..c139980070 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsWithLeadingUnderscoreNames9.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/findAllRefsWithLeadingUnderscoreNames9.baseline.jsonc @@ -1,7 +1,7 @@ // === findAllReferences === // === /findAllRefsWithLeadingUnderscoreNames9.ts === // (/*FIND ALL REFS*/function ___foo() { -// ___foo(); +// [|___foo|](); // }) diff --git a/testdata/baselines/reference/fourslash/findAllReferences/referencesForModifiers.baseline.jsonc b/testdata/baselines/reference/fourslash/findAllReferences/referencesForModifiers.baseline.jsonc index 5edfd5392f..564c05add5 100644 --- a/testdata/baselines/reference/fourslash/findAllReferences/referencesForModifiers.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/findAllReferences/referencesForModifiers.baseline.jsonc @@ -124,4 +124,4 @@ // const enum E { // } // async function fn() {} -// export /*FIND ALL REFS*/default class C2 {} \ No newline at end of file +// export /*FIND ALL REFS*/[|default|] class C2 {} \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/goToDefinition/goToDefinitionSwitchCase5.baseline.jsonc b/testdata/baselines/reference/fourslash/goToDefinition/goToDefinitionSwitchCase5.baseline.jsonc index 656f1d3f24..236b9c5978 100644 --- a/testdata/baselines/reference/fourslash/goToDefinition/goToDefinitionSwitchCase5.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/goToDefinition/goToDefinitionSwitchCase5.baseline.jsonc @@ -1,3 +1,3 @@ // === goToDefinition === // === /goToDefinitionSwitchCase5.ts === -// export /*GOTO DEF*/default {} \ No newline at end of file +// [|export /*GOTO DEF*/default {}|] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/goToDefinition/goToDefinitionSwitchCase7.baseline.jsonc b/testdata/baselines/reference/fourslash/goToDefinition/goToDefinitionSwitchCase7.baseline.jsonc index 14f21d4768..0d74ed5ba9 100644 --- a/testdata/baselines/reference/fourslash/goToDefinition/goToDefinitionSwitchCase7.baseline.jsonc +++ b/testdata/baselines/reference/fourslash/goToDefinition/goToDefinitionSwitchCase7.baseline.jsonc @@ -2,4 +2,4 @@ // === /goToDefinitionSwitchCase7.ts === // switch (null) { // case null: -// export /*GOTO DEF*/default 123; \ No newline at end of file +// [|export /*GOTO DEF*/default 123;|] \ No newline at end of file diff --git a/testdata/baselines/reference/fourslash/quickInfo/jsDocAliasQuickInfo.baseline b/testdata/baselines/reference/fourslash/quickInfo/jsDocAliasQuickInfo.baseline index 9ab690fbec..52ea31202e 100644 --- a/testdata/baselines/reference/fourslash/quickInfo/jsDocAliasQuickInfo.baseline +++ b/testdata/baselines/reference/fourslash/quickInfo/jsDocAliasQuickInfo.baseline @@ -5,9 +5,12 @@ // * @type {number} // */ // export default 10; -// ^ +// ^^^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*1*/. +// | ```tsx +// | (property) default: 10 +// | ``` +// | Comment // | ---------------------------------------------------------------------- === /test.ts === // export { default as test } from "./jsDocAliasQuickInfo"; @@ -32,7 +35,22 @@ "Name": "1", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\n(property) default: 10\n```\nComment" + }, + "range": { + "start": { + "line": 4, + "character": 7 + }, + "end": { + "line": 4, + "character": 14 + } + } + } }, { "marker": { diff --git a/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassDefaultAnonymous.baseline b/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassDefaultAnonymous.baseline index 748eae06e8..f683142ed5 100644 --- a/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassDefaultAnonymous.baseline +++ b/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassDefaultAnonymous.baseline @@ -5,13 +5,19 @@ // | ---------------------------------------------------------------------- // | No quickinfo at /*1*/. // | ---------------------------------------------------------------------- -// ^ +// ^^^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*2*/. +// | ```tsx +// | class default +// | ``` +// | // | ---------------------------------------------------------------------- -// ^ +// ^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*3*/. +// | ```tsx +// | class default +// | ``` +// | // | ---------------------------------------------------------------------- // ^ // | ---------------------------------------------------------------------- @@ -41,7 +47,22 @@ "Name": "2", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\nclass default\n```\n" + }, + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 14 + } + } + } }, { "marker": { @@ -53,7 +74,22 @@ "Name": "3", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\nclass default\n```\n" + }, + "range": { + "start": { + "line": 0, + "character": 15 + }, + "end": { + "line": 0, + "character": 20 + } + } + } }, { "marker": { diff --git a/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassDefaultNamed.baseline b/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassDefaultNamed.baseline index 2c560a24b2..25d7225304 100644 --- a/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassDefaultNamed.baseline +++ b/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassDefaultNamed.baseline @@ -5,13 +5,19 @@ // | ---------------------------------------------------------------------- // | No quickinfo at /*1*/. // | ---------------------------------------------------------------------- -// ^ +// ^^^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*2*/. +// | ```tsx +// | class C +// | ``` +// | // | ---------------------------------------------------------------------- -// ^ +// ^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*3*/. +// | ```tsx +// | class C +// | ``` +// | // | ---------------------------------------------------------------------- // ^ // | ---------------------------------------------------------------------- @@ -48,7 +54,22 @@ "Name": "2", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\nclass C\n```\n" + }, + "range": { + "start": { + "line": 0, + "character": 7 + }, + "end": { + "line": 0, + "character": 14 + } + } + } }, { "marker": { @@ -60,7 +81,22 @@ "Name": "3", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\nclass C\n```\n" + }, + "range": { + "start": { + "line": 0, + "character": 15 + }, + "end": { + "line": 0, + "character": 20 + } + } + } }, { "marker": { diff --git a/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassIncomplete.baseline b/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassIncomplete.baseline index c864ef9b5e..7ff456ccd2 100644 --- a/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassIncomplete.baseline +++ b/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsClassIncomplete.baseline @@ -1,9 +1,12 @@ // === QuickInfo === === /quickInfoDisplayPartsClassIncomplete.ts === // class { -// ^ +// ^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*1*/. +// | ```tsx +// | class __missing +// | ``` +// | // | ---------------------------------------------------------------------- // ^ // | ---------------------------------------------------------------------- @@ -21,7 +24,22 @@ "Name": "1", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\nclass __missing\n```\n" + }, + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 5 + } + } + } }, { "marker": { diff --git a/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsFunctionIncomplete.baseline b/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsFunctionIncomplete.baseline index 4fdac11c6d..65e84951fa 100644 --- a/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsFunctionIncomplete.baseline +++ b/testdata/baselines/reference/fourslash/quickInfo/quickInfoDisplayPartsFunctionIncomplete.baseline @@ -1,9 +1,13 @@ // === QuickInfo === === /quickInfoDisplayPartsFunctionIncomplete.ts === // function (param: string) { -// ^ +// ^^^^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*1*/. +// | ```tsx +// | function (Missing)(param: string): void +// | function (Missing)(): void +// | ``` +// | // | ---------------------------------------------------------------------- // ^ // | ---------------------------------------------------------------------- @@ -11,9 +15,13 @@ // | ---------------------------------------------------------------------- // }\ // function { -// ^ +// ^^^^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*3*/. +// | ```tsx +// | function (Missing)(param: string): void +// | function (Missing)(): void +// | ``` +// | // | ---------------------------------------------------------------------- // ^ // | ---------------------------------------------------------------------- @@ -31,7 +39,22 @@ "Name": "1", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\nfunction (Missing)(param: string): void\nfunction (Missing)(): void\n```\n" + }, + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 8 + } + } + } }, { "marker": { @@ -55,7 +78,22 @@ "Name": "3", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\nfunction (Missing)(param: string): void\nfunction (Missing)(): void\n```\n" + }, + "range": { + "start": { + "line": 2, + "character": 0 + }, + "end": { + "line": 2, + "character": 8 + } + } + } }, { "marker": { diff --git a/testdata/baselines/reference/fourslash/quickInfo/quickInfoNestedExportEqualExportDefault.baseline b/testdata/baselines/reference/fourslash/quickInfo/quickInfoNestedExportEqualExportDefault.baseline index 9be707f098..ae5f4f86d3 100644 --- a/testdata/baselines/reference/fourslash/quickInfo/quickInfoNestedExportEqualExportDefault.baseline +++ b/testdata/baselines/reference/fourslash/quickInfo/quickInfoNestedExportEqualExportDefault.baseline @@ -9,9 +9,12 @@ // | ``` // | // | ---------------------------------------------------------------------- -// ^ +// ^^^^^^^ // | ---------------------------------------------------------------------- -// | No quickinfo at /*2*/. +// | ```tsx +// | (property) (Anonymous function).default: {} +// | ``` +// | // | ---------------------------------------------------------------------- // } // } @@ -53,6 +56,21 @@ "Name": "2", "Data": {} }, - "item": null + "item": { + "contents": { + "kind": "markdown", + "value": "```tsx\n(property) (Anonymous function).default: {}\n```\n" + }, + "range": { + "start": { + "line": 1, + "character": 10 + }, + "end": { + "line": 1, + "character": 17 + } + } + } } ] \ No newline at end of file