LuaLS / LuaLS/lua-language-server

[Annotations] false positive param-type-mismatch on a class member function

Ouverte
#2,787 5 commentaires 0 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?

NeoVim

Which OS are you using?

Linux

What is the issue affecting?

Annotations

Expected Behaviour

I believe there should be no param-type-mismatch error or such cases should have better documentation if there's a workaround available.

Actual Behaviour

I have a following class structure:

  1. base class BaseWidget
  2. BaseContainer which inherits from BaseWidget
  3. DialogWindow which inherits from BaseContainer

Creating a member function in DialogWindow and calling it results in an param-type-mismatch error.

Reproduction steps

Issue can be reproduced with the following simplified code snippet:

---@class BaseWidget
---@field _config table
---@field uiObject table
---@field build fun(BaseWidget, boolean)
local BaseWidget = {}
BaseWidget.__index = BaseWidget

---@return BaseWidget
function BaseWidget.new()
    local instance = setmetatable({}, BaseWidget)
    instance._config = {}
    instance.uiObject = nil
    instance:setAnchor(0, 0)
    return instance
end

function BaseWidget:setAnchor(left, top, right, bottom)
    print("Base setAnchor")
    return self
end

---@class BaseContainer: BaseWidget
local BaseContainer = BaseWidget.new()
BaseContainer.__index = BaseContainer

---@return BaseContainer|BaseWidget
function BaseContainer.new()
    ---@type BaseContainer|BaseWidget
    local instance = setmetatable(BaseWidget.new(), BaseContainer)
    instance.uiObject = nil
    return instance
end

function BaseWidget:addRow()
    print("BaseContainer addRow")
    return self
end

---@class Button: BaseWidget
---@field uiObject table
---@field parent table
local Button = BaseWidget.new()
Button.__index = Button

function Button.new(label, icon)
    local button = setmetatable(BaseWidget.new(), Button)
    return button
end

function Button:build(parent)
    print("btn build")
end

---@class DialogWindow: BaseContainer
---@field baseInput table
---@field frame table
local DialogWindow = BaseContainer.new()
DialogWindow.__index = DialogWindow

function DialogWindow.new(dialogWidth)
    local window = setmetatable(BaseContainer.new(), DialogWindow)

    window:append(Button.new("Test00", nil):setAnchor(0, 0)) -- param-type-mismatch error shows up here

    return window
end

---@param uiObj BaseWidget
function DialogWindow:append(uiObj)
    uiObj:build(self.frame)
end

image

Additional Notes

No response

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 la reproduction Lua simplifiée et examinez la manière dont les annotations et le diagnostic param-type-mismatch sont traités pour les fonctions membres de classe héritées. Confirmez le diagnostic lors de l’appel Button.new(...):setAnchor(...), puis vérifiez que le comportement corrigé couvre ce modèle d’héritage sans introduire de nouveaux mismatches.

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

Évaluation

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

Recevez les nouvelles issues par e-mail

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