LuaLS / LuaLS/lua-language-server
Feature: namespaced type definitions
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Lua
- Estrelas
- 4.4k
- Forks
- 442
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Descrição
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
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
A issue fornece arquivos Lua de exemplo em ./my-library/db.lua, ./my-library/db/migration.lua e ./my-library/utils.lua, mas não nomeia arquivos de implementação nem testes no repositório. Comece rastreando como o servidor de linguagem resolve atualmente definições de tipos e anotações e, em seguida, determine como as declarações de namespace e os nomes locais versus totalmente qualificados devem ser representados. O trabalho estará concluído quando classes com namespace, aliases, campos e referências forem resolvidos de forma consistente em todos os exemplos.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- lua
- Domínio
- devtools
- Tipo de issue
- Funcionalidade
- Dificuldade
- 5/5
- Tempo estimado
- Mais de uma semana
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 25/100