支持大规模代码库的自动化查询和重写,对重构和代码迁移工作直接提效。
Playground | Tutorial | Docs
GritQL 是一种声明式查询语言,用于搜索和修改源代码。
📖 无需学习 AST 细节就能轻松上手:任何代码片段都是有效的 GritQL 查询
⚡️ 使用 Rust 和查询优化来扩展到 1000 万行以上的仓库
📦 使用 Grit 的内置模块系统来复用 200+ 个标准 pattern,或分享你自己的 pattern
♻️ 一旦学会了 GritQL,你就可以用它改写任何目标语言:JavaScript/TypeScript、Python、JSON、Java、Terraform、Solidity、CSS、Markdown、YAML、Rust、Go 或 SQL
🔧 GritQL 使包含自动修复规则变得容易,从而加快修复速度
阅读文档、交互式教程或运行 grit --help。
curl -fsSL https://docs.grit.io/install | bash
grit apply '`console.log($_)`'
grit apply '`console.log($msg)` => `winston.log($msg)`'
cat << 'EOF' > .grit/grit.yaml
patterns:
- name: use_winston
level: error
body: |
`console.log($msg)` => `winston.log($msg)` where {
$msg <: not within or { `it($_, $_)`, `test($_, $_)`, `describe($_, $_)` }
}
EOF
grit apply use_winston
grit check
`console.log($log)` => . where {
$log <: not within `try { $_ } catch { $_ }`
}
`$instance.oldMethod($args)` => `$instance.newMethod($args)` where {
$program <: contains `$instance = new TargetClass($_)`
}
许多更多的例子可以在 GritQL 标准库中找到。
可以组合 pattern 来创建复杂的查询,包括大规模的重构。
GritQL 来自我们进行大规模重构和迁移的经验。
通常,迁移从探索性工作开始,以确定问题的范围——通常使用简单的 grep 搜索。这些很容易开始,但大多数迁移最终都会积累额外的需求,比如确保导入了正确的包,并排除没有可行迁移路径的情况。
最终,任何复杂的迁移都会变成一个用 jscodeshift 等工具编写的完整 codemod 程序。这带来了自己的问题:
大多数探索性工作必须被放弃,因为你要弄清楚如何将原始正则表达式搜索表示为 AST。
读写 codemod 需要在心理上在 AST 名称和源代码实际样子之间进行转换。
大多数框架不可组合,所以你陷入了来回复制 pattern 的困境。
性能通常是事后考虑的问题,所以在大型 codemod 上进行迭代可能会很困难。
Codemod 框架是特定于语言的,因此如果你在多种语言之间跳跃——或者试图迁移共享 API——你必须学习不同的框架。
GritQL 是我们尝试开发的强大中间地带:
探索性分析很容易:只需将代码片段放在反引号中,并使用 $metavariables 表示你想表示的空缺。
通过引入 where 子句的侧面条件来逐步增加复杂性。
复用命名的 pattern 来避免重新构建查询,并使用标准库中的共享 pattern 来处理常见任务,比如确保模块被导入。
用 Rust 编写以获得最大性能:在几秒内改写数百万行代码。
GritQL 使用 tree-sitter 作为所有语言解析器,并从 Rust 生态系统中受益匪浅。
GritQL 在 MIT 许可证下发布。
欢迎贡献。要开始,请查看贡献指南。
你也可以在 Discord 上加入我们。