LuaLS / LuaLS/lua-language-server

Feature: namespaced type definitions

Abierto
#1,167 4 comentarios 14 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

enhancement feat/LuaCats Annotations
Lenguaje dominante
Lua
Estrellas
4.4k
Forks
442
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

This is yet another feature/enhancement idea to make annotations easier to read/write. Perhaps it's come up before, but I couldn't find any issues or discussions about it.

It's wise to namespace type definitions to avoid collisions with type definitions from other code. This can lead to painfully long type names (e.g. my-project.db.entities.Foo). This idea allows defining namespaces for utility and syntactic sugar.

Here is a semi-realistic example and application of this idea:

  • file: ./my-library/db.lua
--- Namespace declaration
---
--- All types declared in this file will be prefixed with the `my-library.db` namespace 
--- identifier when used elsewhere.
---
---@namespace my-library.db

--- Database connection Handle
-- Locally, this can be referenced as `connection`. Files/modules with different namespaces can
-- reference it by it's fully-qualified name, `my-library.db.connection`
-- 
---@class connection

--- Database Connection Options
--
---@class opts
---@field host string
---@field port number
---@field user string
---@field pass string

--- Establish a new DB connection
---@param opts opts
---@return connection? conn
---@return string? error
return function(opts) end
  • file: ./my-library/db/migration.lua

--- namespaces can be re-used
---@namespace my-library.db

--- usable locally as `migration.status`, exports as `my-library.db.migration.status`
---
---@alias migration.status
---| 0 # pending
---| 1 # executing
---| 2 # complete
---| 3 # error

--- exported as `my-library.db.migration.opts`
---
---@class migration.opts
---@field name string
---@field run_in_transaction boolean

---
---@class migration
---@field status migration.status
---@field name string
local migration = {}

--- Execute the migration
---@param db connection
---@return boolean ok
---@return string? error
function migration:exec(db) end

--- Check migration status
---@param db connection
---@return migration.status
function migration:status(db) end

local _M = {}

--- Create a new DB migration
---@param opts migration.opts
function _M.new(opts) end

--- List all migrations
---@param db connection
---@return migration[]
function _M.list(db) end

return _M
  • file: ./my-library/utils.lua
---@namespace my-library

local db = require "my-library.db"
local migrations = require "my-library.db.migrations"

local _M = {}

--- Check to see if any migrations need to be executed
---@param opts db.opts # options for connecting to the database server
function _M.check_migrations(opts)
  -- the displayed type for `conn` is `db.connection`, because the current namespace is `my-library`
  local conn = db(opts)

  for _, m in ipairs(migrations.list(conn)) do
    -- displayed type for `m` is `db.migration`
    -- displayed type for `status` is `db.migration.status`
    local status = m:status(conn)
    print("migration: ", m.name, ", status: ", status)
  end
end

return _M
  • namespaces are just labels/aliases, so they can be shared and re-used between files
  • types are resolved by checking the local namespace before searching the global namespace

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

El issue proporciona archivos Lua de ejemplo en ./my-library/db.lua, ./my-library/db/migration.lua y ./my-library/utils.lua, pero no indica archivos de implementación ni tests en el repositorio. Empieza siguiendo cómo el servidor de lenguaje resuelve actualmente las definiciones de tipos y las anotaciones, y después determina cómo deberían representarse las declaraciones de namespace y los nombres locales frente a los nombres totalmente cualificados. El trabajo estará terminado cuando las clases con namespace, los alias, los campos y las referencias se resuelvan de forma coherente en todos los ejemplos.

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
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.