LuaLS / LuaLS/lua-language-server

Feature: namespaced type definitions

Đang mở
#1,167 4 bình luận 14 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

enhancement feat/LuaCats Annotations
Ngôn ngữ chính
Lua
Star
4.4k
Fork
442
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Issue cung cấp các tệp Lua làm ví dụ tại ./my-library/db.lua, ./my-library/db/migration.lua và ./my-library/utils.lua, nhưng không nêu tên các tệp triển khai hoặc các bài kiểm thử trong repository. Trước tiên, hãy theo dõi cách máy chủ ngôn ngữ hiện đang phân giải các định nghĩa kiểu và chú thích, sau đó xác định cách các khai báo namespace và tên cục bộ so với tên đủ điều kiện nên được biểu diễn. Công việc được hoàn thành khi các lớp có namespace, alias, trường và tham chiếu được phân giải nhất quán trong tất cả các ví dụ.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
lua
Lĩnh vực
devtools
Loại issue
Tính năng
Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
25/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.