cztctl-vscode
VSCode 插件,go-zero 微服务框架扩展代码生成工具 cztctl 的 IDE 插件。支持 .cron(定时任务)和 .rabbitmq(消息队列)DSL 文件的语法高亮、语义着色、语法错误检查、代码导航与代码片段。
配套的 cztctl 代码生成工具 cztctl
使用方法
1. 创建 DSL 文件
在 VSCode 资源管理器中右键文件夹 → 选择 New Cron File (.cron) 或 New RabbitMQ File (.rabbitmq),输入文件名即可创建带基础结构的 DSL 文件。
2. 编写 DSL
使用 Snippets 快速编写:
- 输入
type → 展开结构体声明
- 输入
server → 展开 @server 注解块
- 输入
service → 展开 service 服务块
- 输入
crontask → 展开完整的定时任务(.cron 文件)
- 输入
consumer → 展开 RabbitMQ 消费者(.rabbitmq 文件)
完整模板列表见下方 Snippets(代码片段) 章节。
3. 生成代码
使用 cztctl CLI 工具从 DSL 文件生成 Go 代码:
# 生成定时任务服务代码
cztctl api cron -api your-service.cron -dir .
# 生成 RabbitMQ 消费者服务代码
cztctl api rabbitmq -api your-service.rabbitmq -dir .
4. 代码导航
- Ctrl+Click(Mac: Cmd+Click)路由参数(如
OrderCancelReq)→ 跳转到对应的 type 定义
- Ctrl+Click import 路径 → 打开引入的文件
功能
语法高亮 + 语义着色
基于 ANTLR4 Lexer/Parser + TextMate Grammar + Semantic Tokens Provider 驱动,覆盖 DSL 全部语法元素,并提供上下文感知的语义配色:
| 元素 |
说明 |
| 关键字 |
syntax、info、import、type、service、map、struct(模块关键字加粗斜体) |
| 注解 |
@server(独立配色)、@doc、@handler、@cron、@cronRetry |
| 类型系统 |
结构体名称(加粗)、字段名称、字段类型、struct tag 各有独立颜色 |
| 路由行 |
cron 任务标识符(支持 - : 分隔)、rabbitmq 队列名称(支持 . - 分隔)、路由参数(加粗斜体) |
| info / @server |
KV 键名独立配色,@server 非字符串值斜体高亮 |
| service |
服务名称、handler 名称、注解关键字各有独立颜色 |
| 注释 |
单行注释 //、块注释 /* */ |
| 字符串 |
双引号字符串、反引号原始字符串 |
语法错误检查
基于 ANTLR4 Parser 全量解析,实时检测语法错误并以红色波浪线标注:
- 缺少必填声明(syntax / service)
- 括号/大括号不匹配
- 注解格式错误(@cron / @handler / @doc)
- 结构体字段定义错误
- service route 格式错误
- 文件类型语义校验:
.rabbitmq 文件中使用 @cron / @cronRetry 会报红线
- 路由分隔符校验:
.cron 文件禁止 . 分隔符,.rabbitmq 文件禁止 : 分隔符
代码导航
Ctrl+Click(或 Cmd+Click)跳转:
| 元素 |
行为 |
路由参数(如 OrderCancelReq) |
跳转到对应的 type 定义(支持跨 import 文件解析) |
| import 路径字符串 |
打开对应的引入文件 |
快速创建文件
右键文件夹 → 上下文菜单:
| 菜单项 |
说明 |
| New Cron File (.cron) |
创建带 syntax = "v1" + info() 基础结构的 .cron 文件 |
| New RabbitMQ File (.rabbitmq) |
创建带 syntax = "v1" + info() 基础结构的 .rabbitmq 文件 |
Snippets(代码片段)
输入缩写后从补全列表选择即可快速展开,共 18 个代码片段:
| 缩写 |
说明 |
syntax |
syntax 版本声明 |
info |
info 元信息块 |
import |
import 单文件导入 |
type |
type 结构体声明 |
typeg |
type 分组结构体声明 |
server |
@server 注解块 |
serverfull |
@server 完整注解块(tags/summary/group/middleware) |
service |
service 服务块 |
@doc |
@doc 字符串文档注解 |
@dockv |
@doc KV 文档注解 |
@handler |
@handler 处理器名称 |
@cron |
@cron 定时表达式 |
@cronRetry |
@cronRetry 重试次数 |
crontask |
完整的内部定时任务(@doc + @cron + @cronRetry + @handler + 路由) |
exttask |
外部触发任务(无 @cron,仅 @doc + @handler + 路由) |
consumer |
RabbitMQ 消费者(@doc + @handler + 队列路由) |
cronfile |
.cron 完整文件模板 |
mqfile |
.rabbitmq 完整文件模板 |
安装
从 VSIX 安装
- VSCode → Extensions 侧边栏
- 点击右上角
... → Install from VSIX...
- 选择
cztctl-0.0.1.vsix
- 重启 VSCode
命令行安装
code --install-extension cztctl-0.0.1.vsix
更新插件
同上步骤,安装新版本 VSIX 即可覆盖旧版本。
构建
前置条件
- Node.js 16+(含 npm)
- Java(用于 antlr4ng-cli 生成 Parser)
构建步骤
cd cztctl-vscode
# 安装依赖
npm install
# 生成 ANTLR4 Parser(仅 .g4 文件变更时需要)
export JAVA_HOME=/path/to/jdk && npm run generate-parser
# 编译 TypeScript
npm run compile
# 打包 VSIX
npx vsce package --allow-missing-repository
构建产物:
cztctl-<version>.vsix
修改版本号
编辑 package.json 中的 version:
"version": "0.0.1" // 修改为新版本号
项目结构
cztctl-vscode/
├── package.json # 插件清单(语言注册/语义Token/Snippets/Commands)
├── tsconfig.json # TypeScript 编译配置
├── language-configuration.json # 括号匹配/注释/自动闭合
├── syntaxes/
│ └── cztctl.tmLanguage.json # TextMate Grammar(词法级高亮)
├── snippets/
│ └── cztctl.json # 18 个代码片段
└── src/
├── extension.ts # 插件入口(注册所有 Provider)
├── parser/
│ ├── Cztctl.g4 # ANTLR4 Combined Grammar(词法+语法)
│ ├── index.ts # re-exports
│ └── generated/ # antlr4ng-cli 生成的 Lexer/Parser/Listener/Visitor
├── highlight/
│ └── semanticTokens.ts # Semantic Tokens Provider(17项语义着色)
├── diagnostics/
│ └── validator.ts # 语法错误诊断 + 4项语义校验
├── navigation/
│ └── definitionProvider.ts # Ctrl+Click 代码导航(跨文件)
└── commands/
└── newFile.ts # 右键创建 .cron/.rabbitmq 文件
关键文件说明
| 文件 |
修改场景 |
Cztctl.g4 |
新增或修改语法规则(如新增 DSL 关键字、注解) |
semanticTokens.ts |
新增语义着色规则、修改颜色配置 |
validator.ts |
新增语义校验规则 |
definitionProvider.ts |
新增或修改代码导航规则 |
cztctl.json (snippets) |
新增或修改代码片段 |
cztctl.tmLanguage.json |
修改 TextMate 词法高亮规则 |
package.json |
修改版本号、新增 semanticTokenTypes、修改颜色配置 |
技术架构
Cztctl.g4
│
┌─────────────┼─────────────┐
▼ ▼ ▼
CztctlLexer CztctlParser CztctlListener
(generated) (generated) (generated)
│ │ │
│ │ ┌────────┴────────┐
│ │ ▼ ▼
│ │ semanticTokens.ts validator.ts
│ │ (语义着色) (语法错误+语义校验)
│ │
▼ ▼
TextMate Grammar definitionProvider.ts
(词法级高亮) (代码导航)
| 层 |
组件 |
作用 |
| ANTLR4 生成层 |
CztctlLexer / CztctlParser |
从 Cztctl.g4 自动生成的词法/语法分析器 |
| 词法高亮层 |
cztctl.tmLanguage.json |
TextMate Grammar 提供基础词法着色 |
| 语义着色层 |
semanticTokens.ts |
Semantic Tokens Provider,覆盖 14 种语义 Token |
| 诊断层 |
validator.ts |
ANTLR4 全量解析,收集语法/语义错误 → DiagnosticCollection |
| 导航层 |
definitionProvider.ts |
DefinitionProvider 实现 Ctrl+Click 跳转 |
| 命令层 |
newFile.ts |
右键菜单快速创建文件 |
| 代码片段层 |
cztctl.json |
18 个 Snippets,对应 IntelliJ 版 Live Templates |
与 cztctl CLI 的关系
本插件与 czt-contrib/cztctl 命令行工具共享同一套语法设计:
| 模块 |
用途 |
语法实现 |
czt-contrib/cztctl |
CLI 代码生成工具 |
Go 手写解析器 |
cztctl-intellij |
GoLand IDE 插件 |
ANTLR4 Combined Grammar(Java 目标) |
cztctl-vscode |
VSCode IDE 插件 |
ANTLR4 Combined Grammar(TypeScript 目标) |
三端语法规范保持一致,权威来源为 cztctl CLI 的手写解析器。插件的 Cztctl.g4 需与 CLI 解析器行为对齐。
DSL 语法示例
.cron 文件
syntax = "v1"
info (
title: "定时任务服务"
desc: "订单超时自动取消"
)
type OrderCancelReq {
OrderId int64 `json:"orderId"`
}
@server (
group: order
)
service order-cron {
@doc "订单超时取消"
@cron "*/5 * * * *"
@cronRetry 3
@handler OrderCancel
order-cancel:timeout(OrderCancelReq)
}
.rabbitmq 文件
syntax = "v1"
type PaymentMsg {
OrderId int64 `json:"orderId"`
Amount string `json:"amount"`
}
service payment-mq {
@doc "支付成功回调"
@handler PaymentSuccess
payment.success(PaymentMsg)
}