#luau #incremental #parser

luau-ast-rs-grammar

tree-sitter 解析库的 Luau 语法

2 个版本

0.0.2 2023 年 6 月 24 日
0.0.1 2023 年 6 月 20 日

文本编辑器 中排名 #269


用于 luau-ast-rs

MIT 许可协议

715KB
29K SLoC

C 29K SLoC // 0.0% comments JavaScript 321 SLoC // 0.1% comments Rust 34 SLoC // 0.1% comments

tree-sitter-luau

tree-sitter 的 Luau 语法

helix 编辑器 中部署
  1. 如果不存在,创建 languages.toml 文件(文档
  2. languages.toml 中添加两个条目
[[language]]
name = "luau"
scope = "source.luau"
injection-regex = "^luau$"
file-types = ["luau", "server.lua", "client.lua"]
comment-token = "--"
indent = { tab-width = 2, unit = "  "}
# language-server = { command = "luau-lsp", args = ["lsp", "--definitions=<path-to-robloxTypes.d.lua>"] }
roots = [ "aftman.toml", "default.project.json", "wally.toml" ]

[[grammar]]
name = "luau"
source = { git = "https://github.com/polychromatist/tree-sitter-luau" }
  1. 运行 .\scripts\clone_helix_queries.ps1(或手动从 .\helix-queries\ 克隆到 <helix-config>\runtime\queries\luau
  2. 运行 hx --grammar fetch && hx --grammar build

关于 Neovim 的情况说明

nvim-treesitter 包含了一个 Luau 解析器,如果直接覆盖可能会引起冲突。请参见相关问题。因此,脚本 scripts/clone_queries.ps1 现在是错误的,已被移除。截至 2023 年 5 月 13 日,nvim-treesitter 包含的解析器还算不错,但并非完全正确。这不是我的解析器。以下是我用来覆盖它的方法。

在 neovim 中部署,v2
  1. 需要有 C/C++ 编译器和 Node.js
  2. 安装 nvim-treesitter,并确保其配置正确
  3. 将此仓库克隆或下载到某处
  4. 在 init.lua 文件(或等效文件)中使用以下代码片段注册解析器
    
    local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
    

    local myhome = os.getenv "USERPROFILE" or os.getenv "HOME" -- user profile path, if needed

    local mypath = "CHANGE_THIS"

    -- Example: -- local mypath = myhome .. "/techstuff/hunter2/cloned_repos"

    parser_config.luau = { install_info = { url = mypath .. "/tree-sitter-luau", files = {"src/parser.c", "src/scanner.c"}, -- generate_requires_npm = false, -- requires_generate_from_grammar = false }, }

  5. 在 Neovim 配置目录中执行 Ex 命令 :TSInstall luau
  6. 例如,在 Neovim 配置目录(例如:%LOCALAPPDATA%\nvim)
    • 添加一个名为 `ftdetect\luau.vim` 的文件,内容如下
      
      au BufRead,BufNewFile *.luau        set filetype=luau
      
  7. 通过在 nvim init.lua 文件中添加第二个代码段来覆盖查询
    
    -- set queries for luau. parser_config segment should be above
    do
      for i, v in pairs{"highlights", "indents", "folds", "injections", "locals"} do
        local fd = io.open(mypath .. "/tree-sitter-luau/nvim-queries/" .. v .. ".scm")
        local txt = fd:read"*a"
        fd:close()
        vim.treesitter.query.set("luau", v, txt)
      end
    end
    
部署 luau-lsp 以提供高质量的代码检查
  1. 下载或编译 luau-lsp:https://github.com/JohnnyMorganz/luau-lsp/releases
  2. 确保项目根目录中有一个 `aftman.toml`、`wally.toml` 或 `default.project.json` 文件
  3. 修改此 lsp 配置模板并将其放入 init.lua 文件
  4. 
    local MY_LUAU_LSP_PATH = "C:\\bin\\luau-lsp.exe"
    local MY_DIAGNOSTIC_KEY = "" -- ctrl N
    local MY_LOOKUP_KEY = "K" -- shift K
    

    -- LSP Diagnostics Options Setup local sign = function(opts) vim.fn.sign_define(opts.name, { texthl = opts.name, text = opts.text, numhl = '' }) end

    sign({name = 'DiagnosticSignError', text = ''}) sign({name = 'DiagnosticSignWarn', text = ''}) sign({name = 'DiagnosticSignHint', text = ''}) sign({name = 'DiagnosticSignInfo', text = ''})

    vim.diagnostic.config({ virtual_text = false, signs = true, update_in_insert = true, underline = true, severity_sort = false, float = { border = 'rounded', source = 'always', header = '', prefix = '', }, })

    -- overwrite keymap on LSP enabled buffers vim.api.nvim_create_autocmd('LspAttach', { callback = function(args) vim.keymap.set('n', MY_LOOKUP_KEY, vim.lsp.buf.hover, { buffer = args.buf }) vim.keymap.set('n', MY_DIAGNOSTIC_KEY, function() vim.diagnostic.open_float(nil, { focusable = false }) end, {buffer = true}) end })

    -- autocmd-event LSP Server Start Callback function _G.start_luau_lsp() vim.lsp.start({ name = 'nvim-luau-lsp', cmd = {MY_LUAU_LSP_PATH, 'lsp'}, root_dir = vim.fs.dirname(vim.fs.find({'aftman.toml', 'wally.toml', 'default.project.json'}, { upward = true })[1]) }) end

    -- enable signcolumn and register autocmd-event vim.cmd([[ set signcolumn=yes au BufRead,BufNewFile *.luau lua _G.start_luau_lsp() ]])

依赖项

~2.8–4MB
~72K SLoC