LuaLS / LuaLS/lua-language-server

Over-zealous 'Field `_field` is protected' warning in class-created closure functions

Ouverte
#2,931 0 commentaires 3 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Lua
Étoiles
4.4k
Forks
442
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire l’exemple DynamicDude fourni dans l’extension Visual Studio Code et examinez comment les diagnostics classifient les closures créées dans les méthodes de classe. C’est terminé lorsque ces closures peuvent accéder aux protected ou private members de la classe sans l’avertissement invisible, tandis que les accès sans rapport continuent d’être signalés.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
lua
Domaine
devtools
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.