Skip to content

Completion/Type checking arrays of union types #1928

Description

@firas-assaad

How are you using the lua-language-server?

Visual Studio Code Extension (sumneko.lua)

Which OS are you using?

Windows

What is the issue affecting?

Annotations, Type Checking, Completion

Expected Behaviour

In the following example:

---@class A
---@field x integer

---@alias W string|A

---@type W[]
local arr1 = {
    'hello',
    {
        x = 'string', -- assign-type-mismatch
    },
    3, -- assign-type-mismatch
}

---@type (string|A)[]
local arr2 = {
    'hello',
    {
        x = 'string' -- no warnings
    },
    3, -- no warnings
}

I'm wondering why arr1 (using alias) and arr2 (using parenthesis) work differently. I expected to have completion and error checking for A array elements in arr2 the same way I get them in arr1. In other words, I should get assign-type-mismatch diagnostic when trying to set x to 'string' in arr2, and also for trying to have a number element (3) in an array of string|A.

Actual Behaviour

I don't get any completion suggestions or diagnostics while setting the value for the arr2 case (union of multiple types).

However, if I use arr2 later I do get type checking and completion:

for k, v in ipairs(arr2) do
    v.x = 1 -- v is correctly inferred as string|A
end

local v = arr2[2] -- v is correctly inferred as string|A

arr2[3].x = 'hi' -- assign-type-mismatch

so the language server does understand (string|A)[] syntax in certain cases.

Reproduction steps

Try the code sample I posted.

Additional Notes

I can just use aliases, but sometimes I only need these union types for a parameter or a single location, and an alias introduces a new name globally.

Log File

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions