Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wrong behavior in new diagnostic missing-fields with union types #2214

Closed
TwIStOy opened this issue Jul 23, 2023 · 16 comments
Closed

Wrong behavior in new diagnostic missing-fields with union types #2214

TwIStOy opened this issue Jul 23, 2023 · 16 comments
Labels
bug Something isn't working

Comments

@TwIStOy
Copy link

TwIStOy commented Jul 23, 2023

How are you using the lua-language-server?

NeoVim

Which OS are you using?

MacOS

What is the issue affecting?

Annotations, Type Checking, Diagnostics/Syntax Checking

Expected Behaviour

The given code:

---@class Foo
---@field a number
---@field b number
---@field c number

---@type Foo|Foo[]
local a = {
  {
    a = 1,
    b = 2,
    c = 3,
  }
}

Should not report nothing. Because a matches Foo[].

Actual Behaviour

Report missing-field diagnostic.

Reproduction steps

Code above...

Additional Notes

No response

Log File

No response

@TwIStOy
Copy link
Author

TwIStOy commented Jul 23, 2023

---@class Foo
---@field a number
---@field b number
---@field c number

---@class Bar
---@field ba number
---@field bb number
---@field bc number

---@type Foo|Bar
local b = {
  a = 1,
  b = 2,
  c = 3,
}

This case report missing-field too.

@GiuseppeIII
Copy link

The unions actually create an intersection. Does doing:

local b = {
  a = 1,
  b = 2,
  c = 3,
  ba = 1,
  bb = 2,
  bc = 3,
}

work?

@TwIStOy
Copy link
Author

TwIStOy commented Jul 24, 2023

This works.
But in my understanding, the union TYPE_A | TYPE_B means that the value's type is TYPE_A or TYPE_B, not the value is both TYPE_A and TYPE_B. So the diagnostic missing-field behaves wrong.

@GiuseppeIII
Copy link

This is a known issue, see: #2102
I agree though, I also prefer the type narrowing approach 👍

@firas-assaad
Copy link
Contributor

I'm getting a lot of false positives because of this issue. For example:

---@class A
---@field required boolean

---@alias A_or_string A|string

---@type A_or_string|A_or_string[]
local x = { 'hi' } -- Missing field `required`

@9mm
Copy link

9mm commented Aug 10, 2023

Is the fix from 2 weeks ago what fixes this? I'm trying to figure out why this showed up today in all my neovim configs

image

@tummetott
Copy link

I have the same problem. Could you find a fix @9mm ?

@9mm
Copy link

9mm commented Aug 15, 2023

@tummetott no I havent found it yet .. I wasnt even sure if this was the problem but given my problem just showed up at the exact time this issue was made I thought it might be

@davelongdev
Copy link

davelongdev commented Aug 16, 2023

i'm seeing a bunch of missing fields warnings all of a sudden in my init.lua. not sure why. looks like it's only happening in tables passed to .setup.

@Deshdeepak1
Copy link

I have the same problem as @9mm .

@thatnerdjosh
Copy link

thatnerdjosh commented Aug 20, 2023

As a workaround - adding this before that table seems to work for me @9mm:

    ---@diagnostic disable-next-line missing-fields      

@9mm
Copy link

9mm commented Aug 20, 2023

As a workaround - adding this before that table seems to work for me @9mm:

    ---@diagnostic disable-next-line missing-fields      

Interesting, thanks. I wish I knew the proper way to handle it... am I initializing plugins wrong? I feel like I shouldnt need to disable lines if using plugins, especially big ones like cmp and treesitter. @sumneko do you have any insight?

@Deshdeepak1
Copy link

@thatnerdjosh thanks, but why it is not working using the server options?

@sumneko
Copy link
Collaborator

sumneko commented Aug 21, 2023

As a workaround - adding this before that table seems to work for me @9mm:

    ---@diagnostic disable-next-line missing-fields      

Interesting, thanks. I wish I knew the proper way to handle it... am I initializing plugins wrong? I feel like I shouldnt need to disable lines if using plugins, especially big ones like cmp and treesitter. @sumneko do you have any insight?

You can disable this by setting diagnostics.disable

@firas-assaad
Copy link
Contributor

If I had to guess the issue is that the annotations for cmp have to be updated to mark fields as optional. Check the definition of cmp.ConfigSchema here: https://github.com/hrsh7th/nvim-cmp/blob/51f1e11a89ec701221877532ee1a23557d291dd5/lua/cmp/types/cmp.lua#L85

If you open an issue in the nvim-cmp repo or make a pull request to mark fields as optional (e.g. ---@field private revision integer becomes ---@field private revision? integer with a question mark) then the issue would be resolved.

@diegoulloao
Copy link

Solution here: https://www.reddit.com/r/neovim/comments/15onr5j/comment/k8wlbl0/?utm_source=share&utm_medium=web2x&context=3

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this issue May 1, 2024
Changelog:

## 3.8.3
`2024-4-23`
* `FIX` server may crash when the workspace is using a non-English path.

## 3.8.2
`2024-4-23`
* This is a fake version only for the new version of VSCode, with a core of 3.8.0.

## 3.8.1
`2024-4-23`
* This is a fake version only for the old version of VSCode, with a core of `3.7.4`. Starting from the next minor version, the version requirement for VSCode will be raised to prevent users still using the old version of VSCode from updating to the new version and experiencing compatibility issues.

## 3.8.0
`2024-4-22`
* `NEW` supports tuple type (@[lizho])
  ```lua
  ---@type [string, number, boolean]
  local t

  local x = t[1] --> x is `string`
  local y = t[2] --> y is `number`
  local z = t[3] --> z is `boolean`
  ```
* `NEW` generic pattern (@[fesily])
  ```lua
  ---@Generic T
  ---@param t Cat.`T`
  ---@return T
  local function f(t) end

  local t = f('Smile') --> t is `Cat.Smile`
  ```
* `NEW` alias and enums supports attribute `partial`
  ```lua
  ---@alias Animal Cat

  ---@alias(partial) Animal Dog

  ---@type Animal
  local animal --> animal is `Cat|Dog` here
  ```

  ```lua
  ---@enum(key) ErrorCodes
  local codes1 = {
      OK = 0,
      ERROR = 1,
      FATAL = 2,
  }

  ---@enum(key, partial) ErrorCodes
  local codes2 = {
      WARN = 3,
      INFO = 4,
  }

  ---@type ErrorCodes
  local code

  code = 'ERROR' --> OK
  code = 'WARN'  --> OK

  ```
* `NEW` plugin: add `OnTransFormAst` interface (@[fesily])
* `NEW` plugin: add `OnNodeCompileFunctionParam` interface (@[fesily])
* `NEW` plugin: add `ResolveRequire` interface (@[Artem Dzhemesiuk])
* `NEW` plugin: support multi plugins (@[fesily])
  + setting: `Lua.runtime.plugin` can be `string|string[]`
  + setting: `Lua.runtime.pluginArgs` can be `string[]|table<string, string>`
* `NEW` CLI: `--doc` add option `--doc_out_path <PATH>` (@[Andreas Matthias])
* `NEW` CLI: `--doc_update`, update an existing `doc.json` without using `--doc` again (@[Andreas Matthias])
* `NEW` CLI: `--trust_all_plugins`, this is potentially unsafe for normal use and meant for usage in CI environments only (@[Paul Emmerich])
* `CHG` CLI: `--check` will run plugins (@[Daniel Farrell])
* `FIX` diagnostic: `discard-returns` not works in some blocks (@clay-golem)
* `FIX` rename in library files

## 3.7.4
`2024-1-5`
* `FIX` rename to unicode with `Lua.runtime.unicodeName = true`

## 3.7.3
`2023-11-14`
* `FIX` can not infer arg type in some cases.

## 3.7.2
`2023-11-9`
* `FIX` [#2407]

[#2407]: LuaLS/lua-language-server#2407

## 3.7.1
`2023-11-7`
* `FIX` [#2299]
* `FIX` [#2335]

[#2299]: LuaLS/lua-language-server#2299
[#2335]: LuaLS/lua-language-server#2335

## 3.7.0
`2023-8-24`
* `NEW` support `---@type` and `--[[@as]]` for return statement
* `NEW` commandline parameter `--force-accept-workspace`: allowing the use of the root directory or home directory as the workspace
* `NEW` diagnostic: `inject-field`
* `NEW` `---@enum` supports attribute `key`
  ```lua
  ---@enum (key) AnimalType
  local enum = {
    Cat = 1,
    Dog = 2,
  }

  ---@param animal userdata
  ---@param atp AnimalType
  ---@return boolean
  local function isAnimalType(animal, atp)
    return API.isAnimalType(animal, enum[atp])
  end

  assert(isAnimalType(animal, 'Cat'))
  ```
* `NEW` `---@class` supports attribute `exact`
  ```lua
  ---@Class (exact) Point
  ---@field x number
  ---@field y number
  local m = {}
  m.x = 1 -- OK
  m.y = 2 -- OK
  m.z = 3 -- Warning
  ```

* `FIX` wrong hover and signature for method with varargs and overloads
* `FIX` [#2155]
* `FIX` [#2224]
* `FIX` [#2252]
* `FIX` [#2267]

[#2155]: LuaLS/lua-language-server#2155
[#2224]: LuaLS/lua-language-server#2224
[#2252]: LuaLS/lua-language-server#2252
[#2267]: LuaLS/lua-language-server#2267

## 3.6.25
`2023-7-26`
* `FIX` [#2214]

[#2214]: LuaLS/lua-language-server#2214

## 3.6.24
`2023-7-21`
* `NEW` diagnostic: `missing-fields`
* `FIX` shake of `codeLens`
* `FIX` [#2145]

[#2145]: LuaLS/lua-language-server#2145

## 3.6.23
`2023-7-7`
* `CHG` signature: narrow by inputed literal

## 3.6.22
`2023-6-14`
* `FIX` [#2038]
* `FIX` [#2042]
* `FIX` [#2062]
* `FIX` [#2083]
* `FIX` [#2088]
* `FIX` [#2110]
* `FIX` [#2129]

[#2038]: LuaLS/lua-language-server#2038
[#2042]: LuaLS/lua-language-server#2042
[#2062]: LuaLS/lua-language-server#2062
[#2083]: LuaLS/lua-language-server#2083
[#2088]: LuaLS/lua-language-server#2088
[#2110]: LuaLS/lua-language-server#2110
[#2129]: LuaLS/lua-language-server#2129
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

10 participants