LuaForQC — Lua IDE for QC Games (青瓷游戏)
基于 LuaHelper 二次开发,专为青瓷游戏团队打造的 Lua 语言工具。
在原版高性能 LSP 基础上,新增 class/module 支持、访问控制、正则诊断忽略、读写锁性能优化等特性。
✨ 本插件独有特性(相比原版 LuaHelper 的增强)
1. Lua 5.1 module(...) 模块声明支持
- 背景:本插件基于 LuaHelper 二次开发,补充了 Lua 5.1 中
module(...) 的模块声明支持,方便兼容现有项目。
- 作用:为使用
module('modname', package.seeall) 的代码提供模块内符号解析、跳转、补全、引用与诊断。
- 识别规则:
- 识别
module("xxx", package.seeall),将当前文件声明的符号归入全局模块 xxx 的命名空间;
示例:
-- a.lua
module("A", package.seeall)
function foo(x)
return x + 1
end
BAR = 42
-- b.lua
A.foo(1)
print(A.BAR)
注意:
- 新项目建议使用“返回表”模块风格(return table),
module(...) 支持主要用于兼容旧项目;
2. 忽略不存在的全局变量(支持正则)
- 配置项:luahelper.base.ignoreUndefinedGlobals(字符串数组)
- 规则:同一数组中可混合“精确名”和“正则”
- 精确名:直接写变量名,如 "GlobalConfig"、"DEV"
- 正则:两种写法任选其一
示例 settings.json 片段:
{
"luahelper.base.ignoreUndefinedGlobals": [
"GlobalConfig",
"__DEV__",
"regex:^cc\\.",
"/^GAME_/"
]
}
说明:精确项性能更好(哈希匹配);正则仅对显式声明的项编译与匹配。上述配置会忽略如 cc.Sprite、GAME_VERSION 等前缀匹配的未定义全局告警。
3. class(...) 的 super 继承与隐式声明支持
- 继承:当使用 class 函数配合父类时,支持从父类(super)继承字段与方法信息,悬停/补全/跳转均可透传展示。
- 隐式声明:未显式
---@class 时,可基于 class('Name') 与后续成员赋值推断类型,提供基本的类型感知与诊断。
示例:
Animal = class("Animal")
function Animal:say() end
Dog = class("Dog", Animal) -- 此处不需要显式添加注解
function Dog:init()
self:say(); -- 从 super 继承的方法,可补全/跳转
end
4. 类成员/属性访问控制修饰符支持 (@private, @protected, @public)
- 背景:为类属性和类方法引入标准的 OOP(面向对象)访问修饰符,便于在大型 Lua 项目中支持更严格、更清晰的作用域和信息封装。
- 作用:
- 静态语义诊断:支持对类属性的点语法访问以及类方法的冒号语法调用进行访问级别(Visibility)的安全审计。一旦有非授权的代码上下文跨越可见性边界(比如外部文件违规访问
@private/@protected),编辑器会实时下划线警告。
- 智能补全过滤:自动提示与自动补全时,该过滤机制会与可见性权限无缝联动。如果没有合法的访问权限(如在外部类或外部文件中调取
private / protected 成员),补全列表会自动将其屏蔽隐藏,只展示合规的公有成员。
- 可见性修饰规则:
private(私有):只有在当前类(同名 Class)的上下文中可访问。
protected(保护):在同一文件、当前类定义文件,或通过继承自当前类的子类对象/子类上下文中可以访问。
public(公开,缺省默认值):公开可见,任何地方均可被补全和调用。
示例:
-- base.lua
---@class Base
---@field public publicField number
---@field protected protectedField number
---@field private privateField number
local Base = {}
---@private
function Base:privateMethod() end
-- external.lua
local Base = require("base")
---@type Base
local externalObj = Base
externalObj.publicField = 100 -- 允许 (public)
externalObj.protectedField = 200 -- 报错 (protected, 外部上下文违规访问)
externalObj.privateField = 300 -- 报错 (private, 外部上下文违规访问)
externalObj:privateMethod() -- 报错 (private 函数, 外部上下文违规调用)
📖 基础功能(继承自 LuaHelper)
本插件继承了 LuaHelper 的全部核心能力:
| 分类 |
功能 |
| 代码编辑 |
定义跳转、引用查找、文件符号表、工程符号表、自动补全、代码格式化、悬停提示、全局变量着色 |
| 代码检测 |
语法检测、语义检测、快速增量分析 |
| 调试 |
调试连接其他进程、调试单 Lua 文件、运行单 Lua 文件 |
详细使用说明请参考 LuaHelper 官方文档。
⚡ v0.3.0 性能优化亮点
- LSP 请求锁从互斥锁升级为读写锁,Hover/Define/Complete 等只读请求改为并发读锁
- 保存链路与文件监控缩小写锁临界区,减少"正在加载"现象
- 新增注解校验增量通道,按变更文件局部校验,避免每次保存全量扫描
📦 安装
- 打开 VS Code 扩展市场
- 搜索
LuaForQC
- 点击安装
🙏 致谢
📄 License
BSD-3-Clause