diff --git a/internal/fourslash/tests/completionsInJsxTagDifferentSpreadElementTypes_test.go b/internal/fourslash/tests/completionsInJsxTagDifferentSpreadElementTypes_test.go new file mode 100644 index 0000000000..adf2889929 --- /dev/null +++ b/internal/fourslash/tests/completionsInJsxTagDifferentSpreadElementTypes_test.go @@ -0,0 +1,64 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestCompletionsInJsxTagDifferentSpreadElementTypes(t *testing.T) { + t.Parallel() + + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = ` +// @Filename: /completionsWithDifferentSpreadTypes.tsx +// @strict: true + +// A reasonable type to spread. +export function ComponentObjectX(props: { x: string }) { + return ; +} + +// A questionable but valid type to spread. +export function ComponentObjectXOrY(props: { x: string } | { y: string }) { + return ; +} + +// A very unexpected type to spread (a union containing a primitive). +export function ComponentNumberOrObjectX(props: number | { x: string }) { + return ; +} + +// Very unexpected, but still structured (union) types. +// 'boolean' is 'true | false' and an optional 'null' is really 'null | undefined'. +export function ComponentBoolean(props: boolean) { + return ; +} +export function ComponentOptionalNull(props?: null) { + return ; +} + +// Primitive types (non-structured). +export function ComponentAny(props: any) { + return ; +} +export function ComponentUnknown(props: unknown) { + return ; +} +export function ComponentNever(props: never) { + return ; +} +export function ComponentUndefined(props: undefined) { + return ; +} +export function ComponentNumber(props: number) { + return ; +} +` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.GoToEachMarker(t, nil, func(marker *fourslash.Marker, index int) { + f.VerifyCompletions(t, marker, nil) + }) +} diff --git a/internal/ls/completions.go b/internal/ls/completions.go index 07cc863e55..bdf7deae13 100644 --- a/internal/ls/completions.go +++ b/internal/ls/completions.go @@ -4079,7 +4079,7 @@ func setMemberDeclaredBySpreadAssignment(declaration *ast.Node, members *collect t = typeChecker.GetTypeOfSymbolAtLocation(symbol, expression) } var properties []*ast.Symbol - if t != nil { + if t != nil && t.Flags()&checker.TypeFlagsStructuredType != 0 { properties = t.AsStructuredType().Properties() } for _, property := range properties {