Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

[Feature requset] Multiple inheritance in `@class` annotation or add new `@mixin` annotation

Abierto
#588 8 comentarios 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
30/100
Tipo de issue
Nueva funcionalidad
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
kotlin, lua
Área
devtools, tooling

Línea de trabajo

Comienza con los ejemplos de @class y @mixin en /some_module/src/SomeForm.lua y revisa las issues relacionadas #11, #247 y #402. Decide qué sintaxis de anotación y comportamiento de herencia están dentro del alcance; se considera terminado cuando el plugin entiende la sintaxis seleccionada y expone los miembros del mixin para la clase de ejemplo, con las pruebas correspondientes añadidas.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

feature request

Lua is very flexible and allows you to do anything.

Sometimes we need something like multiple inheritance or rather mixins.
When several functionality is mixed into the resulting class/table when “designing” the class programmatically.

Example

For example, something like:
We have some base "mixer", that can mix different mixins to itself

-- /base_classes/Form/Base.lua

--- @class base_classes.Form.Mixin      @just interface for mixins
--- @field mix_to fun(base_class:base_classes.Form.Base)

--- @class base_classes.Form.Base
local BaseForm  = {
  -- ...
}

--- @param mixin base_classes.Form.Mixin
function BaseForm:mix(mixin)
	mixin.mix_to(self)
end

Then we have some Factory for “designing” the new class programmatically:

-- /base_classes/Form.lua
require('base_classes.Form.Base')

--- Form Class Factory class.
--- This class constructs for you a base form class.
---
--- @class base_classes.Form
--- @field for_node    fun(self:self):self  mixes `base_classes.Form.Mixin.ForNode` into your class
--- @field for_entity  fun(self:self):self  mixes `base_classes.Form.Mixin.ForEntity` into your class
--- @field ...
--- @field ...
local Form = {
	--- @param self  self
	--- @param mixin string
	__index = function(self, mixin)
		if not table.has_key(self.mixins) then
			return self[mixin]
		end

		return function()
			self.now_constructing = self.now_constructing or setmetatable({}, { __index = BaseForm })
			if not self.now_constructing then
				self.now_constructing:mix(ForNode)
			end
		end
	end
}

And we have several mixins for different purposes:

-- /base_classes/Form/Mixin/ForNode.lua

--- @class base_classes.Form.Mixin.ForNode: base_classes.Form.Mixin
--- @field for_node_any_var string
--- @field for_node_any_fun fun(self:base_classes.Form.Base)
--- @field for_node_...
--- @field for_node_...
local ForNode = {}

--- @static
--- @param base_class base_classes.Form.Base
function ForNode.mix_to(base_class)
	base_class.for_node_any_var = 'any_value'
	base_class.for_node_any_fun = function(self, some_var)
		-- ....
	end
	-- ...
end
-- /base_classes/Form/Mixin/ForEntity.lua

--- @class base_classes.Form.Mixin.ForEntity: base_classes.Form.Mixin
--- @field for_entity_...
--- @field for_entity_...
--- @field for_entity_...
local ForEntity = {}
-- ...
-- /base_classes/Form/Mixin/Personal.lua
-- ...
-- /base_classes/Form/Mixin/Shared.lua
-- ...
-- /base_classes/Form/Mixin/WithTabs.lua
-- ...
-- /base_classes/Form/Mixin/WithPlayerInventory.lua
-- ...

and so on....


So, then we can "construct"/design our own class like this:

-- /some_module/src/SomeForm.lua

local SomeForm = base_classes.Form:personal():for_node():with_tabs()

-- ...

Feature request

So.... It would be very useful, if we could specify from which mixins the class consists of.
For example like this:

-- /some_module/src/SomeForm.lua

--- @class some_module.src.SomeForm: base_classes.Form.Base
--- @mixin base_classes.Form.Mixin.Personal
--- @mixin base_classes.Form.Mixin.ForNode
--- @mixin base_classes.Form.Mixin.WithTabs
local SomeForm = base_classes.Form :personal() :for_node() :with_tabs()

-- ...

or just like multiple inheritance:

-- /some_module/src/SomeForm.lua

--- @class some_module.src.SomeForm: base_classes.Form.Base, base_classes.Form.Mixin.Personal, base_classes.Form.Mixin.ForNode, base_classes.Form.Mixin.WithTabs
local SomeForm = base_classes.Form :personal() :for_node() :with_tabs()

-- ...

Related issues
  • #11
  • #247
  • #402
Lenguaje dominante
Kotlin
Estrellas
1.8k
Forks
338
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

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.

Más de EmmyLua/IntelliJ-EmmyLua

Todos los issues de EmmyLua/IntelliJ-EmmyLua

Issues similares

Más issues de Kotlin

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.