From 6ed3c968d8f71807d2897732e42b572541d68e08 Mon Sep 17 00:00:00 2001 From: luo2430 Date: Thu, 3 Sep 2026 21:13:21 +0800 Subject: [PATCH 1/2] Fix completions inside tuple types suggesting value symbols --- .../tests/completionsInEmptyTupleType_test.go | 36 +++++++++++++++++++ tsc/internal/ls/completions.go | 2 ++ 2 files changed, 38 insertions(+) create mode 100644 tsc/internal/fourslash/tests/completionsInEmptyTupleType_test.go diff --git a/tsc/internal/fourslash/tests/completionsInEmptyTupleType_test.go b/tsc/internal/fourslash/tests/completionsInEmptyTupleType_test.go new file mode 100644 index 0000000000000..c3106b92a36eb --- /dev/null +++ b/tsc/internal/fourslash/tests/completionsInEmptyTupleType_test.go @@ -0,0 +1,36 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/TypeScript/tsc/internal/fourslash" + . "github.com/microsoft/TypeScript/tsc/internal/fourslash/tests/util" + "github.com/microsoft/TypeScript/tsc/internal/testutil" +) + +func TestCompletionsInEmptyTupleType(t *testing.T) { + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `type UserTuple = [["name", string], ["age", number], ["address", string]]; +type AdminTuple = [/*1*/]; +type OtherTuple = [string, /*2*/]; + +const User: UserTuple = [["name", "2333"], ["age", 2333], ["address", "2333"]];` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.VerifyCompletions(t, []string{"1", "2"}, &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + "UserTuple", + }, + Excludes: []string{ + "User", + }, + }, + }) +} diff --git a/tsc/internal/ls/completions.go b/tsc/internal/ls/completions.go index 2aef35353d1b1..1606b5e13f05a 100644 --- a/tsc/internal/ls/completions.go +++ b/tsc/internal/ls/completions.go @@ -3361,6 +3361,8 @@ func isContextTokenTypeLocation(contextToken *ast.Node) bool { return parentKind == ast.KindTypeParameter case ast.KindSatisfiesKeyword: return parentKind == ast.KindSatisfiesExpression + case ast.KindOpenBracketToken, ast.KindCommaToken: + return parentKind == ast.KindTupleType } } return false From 0ae5a8c0915036681c8e1e98f5067975e74b13d5 Mon Sep 17 00:00:00 2001 From: luo2430 Date: Fri, 4 Sep 2026 15:34:07 +0800 Subject: [PATCH 2/2] Add completions test for typeof inside a tuple type --- .../tests/completionsInEmptyTupleType_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tsc/internal/fourslash/tests/completionsInEmptyTupleType_test.go b/tsc/internal/fourslash/tests/completionsInEmptyTupleType_test.go index c3106b92a36eb..7462d911ce262 100644 --- a/tsc/internal/fourslash/tests/completionsInEmptyTupleType_test.go +++ b/tsc/internal/fourslash/tests/completionsInEmptyTupleType_test.go @@ -14,6 +14,7 @@ func TestCompletionsInEmptyTupleType(t *testing.T) { const content = `type UserTuple = [["name", string], ["age", number], ["address", string]]; type AdminTuple = [/*1*/]; type OtherTuple = [string, /*2*/]; +type QueryTuple = [typeof /*3*/]; const User: UserTuple = [["name", "2333"], ["age", 2333], ["address", "2333"]];` f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) @@ -33,4 +34,21 @@ const User: UserTuple = [["name", "2333"], ["age", 2333], ["address", "2333"]];` }, }, }) + + // After `typeof` in a tuple type we are back in a value location, so type-only symbols shouldn't be offered. + f.VerifyCompletions(t, "3", &fourslash.CompletionsExpectedList{ + IsIncomplete: false, + ItemDefaults: &fourslash.CompletionsExpectedItemDefaults{ + CommitCharacters: &DefaultCommitCharacters, + EditRange: Ignored, + }, + Items: &fourslash.CompletionsExpectedItems{ + Includes: []fourslash.CompletionsExpectedItem{ + "User", + }, + Excludes: []string{ + "UserTuple", + }, + }, + }) }