LuaLS / LuaLS/lua-language-server

Ability to mark default constructor names for resolving return type

Abierto
#2,331 0 comentarios 2 reacciones 0 asignados Ver en GitHub

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

Hi!

A request to infer return value for default returns when calling a defined constructor function. EmmyLua supports this using a setting:
image

Here it can infer that calling e.g. :new() on items marked with the ---@class annotation will be returning an instance of that class.

This is especially useful when constructing classes using metatables in a generic class system, adding interfaces or inheritance functionality but still be able to denote the return type of calling the constructor method.

Example:

#class.lua

local definitions = {}

local Class = {}
function Class.class(name)
    local definitions = {}

    local def = definitions[name]
    if not def then
		def = {}
		def.__class_name = class_name

		def.new = function(self, ...)
	    	local instance = {}

	    	if instance.construct then
                instance:construct(...)
            end

            return instance
    	end

    	setmetatable(instance, def)

    	def[class_name] = def
	end

	return class_definition
end

Example of using the class creation method

#my_class.lua

local Class = require "path/class"

local MyClass = Class("MyClass")
function MyClass:construct()
	self._member = 0
end

Example of instantiating an instance of the class and showing the issue:

#example.lua

local MyClass = require "path/my_class"
local instance = MyClass:new() -- this line cannot find the function new() or deduce the return/type of "instance"

Here the instance of class return value from the new() function cannot be inferred and I haven't found a way to annotate this using luadocs with generics, alias, overload or other methods. This issue is somewhat related to #449 but I feel this warrants a retake on the proposed solution unless I am missing something?

A different way could be to allow explicit descriptors of the @field annotation to specify return value types in class definitions e.g.

image

The return values of functions defined in fields from a set metatable cannot have it's return type defined however it seems.

image

image

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con los escenarios class.lua y example.lua del issue, centrándote en cómo se resuelven la anotación ---@class y la llamada new(). Revisa la discusión relacionada en el issue #449 y la alternativa @field descrita antes de elegir un enfoque. La implementación terminada debería incluir la disponibilidad inferida del constructor y el tipo de retorno correcto de la instancia para el ejemplo.

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
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.