LuaLS / LuaLS/lua-language-server
Request: Limit "Fields cannot be injected" to exact classes
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Lua
- Estrellas
- 4.4k
- Forks
- 442
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
How are you using the lua-language-server?
NeoVim
Which OS are you using?
Windows
What is the issue affecting?
Annotations
Expected Behaviour
The docs say:
Marking the class as (exact) means fields cannot be injected after the definition.
So when I use @class, I expect to not get any injection warnings unless I use (exact). I see this came up before in #2710, so I'd add: I should be able to get a warning for injections in exact classes while silencing warnings in non-exact classes.
Actual Behaviour
Any time I add a field outside of the constructor (and sometimes even ones that are defined in my class constructor), I get this warning:
Fields cannot be injected into the reference of
ClassXforfield_y. To do so, use---@classforinstance_z.
The @class annotation makes lua too strict. I'm using lua because I want to be able to inject fields.
Using annotations has multiple effects:
- It improves completion.
- It improves symbol lookups like goto definition.
- It does type checking.
But it's not great that adding annotations to get 1+2 results in tons of warnings from 3.
I understand that people may not want to add (exact) all over their codebase, but I don't want to add ---@field [any] any to all of mine.
I'd propose a change to diagnostic flags to allow independently controlling these two cases:
inject-field: suppress inject field diagnostic for non-exact classes.inject-field-exact: suppress inject field diagnostic for exact classes.
Reproduction steps
Using neovim and installed luals with Mason. Version: pkg:github/luals/lua-language-server@3.17.1
-- Stripped-down version of https://github.com/rxi/classic/blob/master/classic.lua with an annotation added to be close to real-world class usage.
--
-- classic
--
-- Copyright (c) 2014, rxi
--
-- This module is free software; you can redistribute it and/or modify it under
-- the terms of the MIT license. See LICENSE for details.
--- @class Object
local Object = {}
Object.__index = Object
function Object:new()
end
function Object:extend()
local cls = {}
for k, v in pairs(self) do
if k:find("__") == 1 then
cls[k] = v
end
end
cls.__index = cls
cls.super = self
setmetatable(cls, self)
return cls
end
function Object:__call(...)
local obj = setmetatable({}, self)
obj:new(...)
return obj
end
-- /end classic
--- @class Item : Object
local Item = Object:extend()
function Item:new(id, category)
self.id = id
self.category = category
self.count = 0
end
function Item:Print()
print("Item", self.id, self.category, self.count)
end
--- @param item Item
function FlagDebugItem(item)
item:Print() -- with the annotation, this completes. Yay!
item.is_cheater = true -- Warning :( "Fields cannot be injected into the reference of `Item` for `is_cheater`."
end
If I configure luals to add inject-field to the Lua.diagnostics.disable list, then the warning goes away. But the warning doesn't come back when I make Item an exact class with this annotation: --- @class (exact) Item : Object
Workaround: Add a fake field of any type:
--- @class Item : Object
--- @field [any] any
local Item = Object:extend()
Additional Notes
No response
Log File
[WARN][2026-02-23 11:41:41] ...lsp/handlers.lua:564 "More than 100000 files have been scanned. The current scanned directory is `D:\\code\\project\\br`. Please see the [FAQ](https://luals.github.io/wiki/faq/#how-can-i-improve-startup-speeds) to see how you can include fewer files. It is also possible that your [configuration is incorrect](https://luals.github.io/wiki/faq#why-is-the-server-scanning-the-wrong-folder)."
[WARN][2026-02-23 14:32:31] .../lua/vim/lsp.lua:52 "method textDocument/typeDefinition is not supported by any of the servers registered for the current buffer"
[START][2026-02-23 15:29:24] LSP logging initiated
[ERROR][2026-02-23 15:29:24] ...m/lsp/client.lua:620 "LSP[lua_ls]" "Cannot find request with id 125 whilst attempting to cancel"
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza ejecutando la reproducción de NeoVim proporcionada con LuaLS 3.17.1 y compara @class con @class (exact). Después, sigue cómo se aplica el diagnóstico inject-field; se considera terminado cuando las clases no exactas y exactas se pueden controlar de forma independiente como se propone, mientras el comportamiento documentado de autocompletado y búsqueda sigue estando disponible.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- lua
- Área
- devtools
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 38/100