LuaLS / LuaLS/lua-language-server

Feature: namespaced type definitions

Aperta
#1,167 4 commenti 14 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

enhancement feat/LuaCats Annotations
Lingua principale
Lua
Stelle
4.4k
Fork
442
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

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`

```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`
```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`
```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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

La issue fornisce file Lua di esempio in ./my-library/db.lua, ./my-library/db/migration.lua e ./my-library/utils.lua, ma non indica file di implementazione né test nel repository. Inizia tracciando il modo in cui il server linguistico risolve attualmente le definizioni dei tipi e le annotazioni, quindi determina come debbano essere rappresentate le dichiarazioni di namespace e i nomi locali rispetto a quelli completamente qualificati. Il lavoro è completo quando classi con namespace, alias, campi e riferimenti vengono risolti in modo coerente in tutti gli esempi.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
lua
Ambito
devtools
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
25/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.