[Feature requset] Multiple inheritance in `@class` annotation or add new `@mixin` annotation
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 30/100
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
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
- 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.
Más de EmmyLua/IntelliJ-EmmyLua
-
not compatible with clion 2026.2Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 42/100
EmmyLua/IntelliJ-EmmyLua#624 · 7 comentarios ·
-
incompatible with pycharm 2026.2Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 40/100
EmmyLua/IntelliJ-EmmyLua#622 · 1 comentario ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
EmmyLua/IntelliJ-EmmyLua#615 · 1 comentario · 2 reacciones ·
-
是否有考虑添加lua5.5的支持?Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
EmmyLua/IntelliJ-EmmyLua#614 · 3 comentarios ·
-
编译253报错Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
EmmyLua/IntelliJ-EmmyLua#613 ·
Todos los issues de EmmyLua/IntelliJ-EmmyLua
Issues similares
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 68/100
Los mantenedores suelen responder en 3 días
-
copy design-review mac P3
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
tosunlab/hisarapp-core#510 ·
-
EU multiregion is not supportedAbiertopriority: p2 type: bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
googleapis/kotlin-genai#213 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
RevenueCat/purchases-hybrid-common#2039 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
pengchujin/aerial-tv#771 · 2 comentarios ·
Los mantenedores suelen responder en 1 día