LuaLS / LuaLS/lua-language-server
Over-zealous 'Field `_field` is protected' warning in class-created closure functions
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?
Visual Studio Code Extension (sumneko.lua)
### Which OS are you using?
Windows
### What is the issue affecting?
Diagnostics/Syntax Checking
### Expected Behaviour
Functions created from within class methods should be allowed to access protected (and private) members of that class.
Essentially, any functions inside a class method should inheret that method's access- this is a simple pattern that maintains encapsulation of exactly those private/protected fields, as the code is still clearly "owned" by the encapsulating class.
### Actual Behaviour
In some scenarios, functions within class methods that access protected members of that class are being marked with the 'Field `_field` is protected' warning. See Repro Steps for code sample.
### Reproduction steps
```
---@class DynamicDude
---@field _field string?
local DynamicDude = {}
function DynamicDude:demo()
self:setup(function(self)
-- This disable shouldn't be necessary
---@diagnostic disable-next-line: invisible
self._field = 'test'
end)
---@param self DynamicDude
local function closure(self)
-- This disable shouldn't be necessary
---@diagnostic disable-next-line: invisible
self._field = 'test'
end
self.dynamic_fn = function(self)
self._field = 'test'
end
end
---@param fn fun(self:DynamicDude)
function DynamicDude:setup(fn)
self.dynamic_fn = fn
end
```
### Additional Notes
FEATURE REQUEST: I'd actually love to have a setting that just said "all variables named `self` are assumed to indicate valid access to private/protected members", to cover all my bases. Happy to dig up some examples / explain myself more if that's useful.
### Log File
_No response_
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 reproduciendo el ejemplo proporcionado de DynamicDude en la extensión de Visual Studio Code e inspecciona cómo diagnostics clasifican las closures creadas dentro de métodos de clase. La tarea está terminada cuando esas closures pueden acceder a los protected o private members de la clase sin la advertencia invisible, mientras que los accesos no relacionados siguen siendo diagnosticados.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- lua
- Área
- devtools
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 45/100