资讯动态

从零到跑通:为 OpenRewrite 添加新语言解析器支持的完整教程

发布时间:2026/8/23 17:37:59 来源:尧图企业网站定制
从零到跑通为 OpenRewrite 添加新语言解析器支持的完整教程【免费下载链接】rewriteAutomated mass refactoring of source code.项目地址: https://gitcode.com/gh_mirrors/re/rewrite想让这个重构工具认识一门它还不会的语言却不知道从哪下手本文围绕 OpenRewrite 解析器开发以虚构语言 Lumen 贯穿全程讲清楚为 OpenRewrite 添加解析器支持所需的每一步从 AST 定义、Parser 实现到测试与生态接入。先看懂这套体系五个角色各管一段动手之前先分清每个组件的职责后面写代码时才不会迷路ASTSourceFile源码的无损失真每个字符含空白和注释都能在其中找到位置Parser解析器源码 → ASTPrinter打印机AST → 源码与解析互为逆操作Visitor访问者遍历并修改 AST 的骨架Recipe配方驱动转换的业务逻辑它调用的正是前四者rewrite-java、rewrite-docker、rewrite-hcl 这些模块本质上都是这五块积木的排列组合。分清哪块管哪件事你写代码时才有确定感。动手前环境与依赖JDK 11 及以上、Gradle仓库自带 wrapper解析器生成工具多数模块使用 ANTLR你需要为 Lumen 编写一个.g4语法文件克隆仓库git clone https://gitcode.com/gh_mirrors/re/rewrite做到这一步环境就绪。接下来用同一门语言走完全流程。用一门新语言走完全流程案例Lumen设 Lumen 是一门语法近似 Java 的语言。定义 AST先搭骨架看现有语言的 AST 目录找手感例如 rewrite-java 的 tree 包J.java集中定义了 Java 的全部节点。为 Lumen 建一个平行的tree/包顶层节点继承SourceFilepublic class LumenFile extends SourceFile { // 语句列表、包名、导入等字段 }关键心法解析阶段就为每个空白、注释预留字段否则打印时无米下锅。实现解析器源码变 AST可参考 DockerParser 的骨架Parser接口核心就两件事public class LumenParser implements Parser { public StreamSourceFile parseInputs(...); // 源码 → LumenFile public boolean accept(Path path); // 认领哪些文件 }流程通常是ANTLR 得到语法树 → 遍历它构建 LumenFile → 构建完成后调用requirePrintEqualsInput做往返校验。首次打印结果与原文不一致一律当 bug 处理不放过。实现打印机AST 还原成源码打印机常与访问者一体实现写法可对照 JavaPrinter。规则很简单按「先空白、后内容」的顺序输出每个节点目标是print(parse(x)) x。实现访问者让 AST 可遍历、可修改继承TreeVisitor配方后续才能在你的树上行走public class LumenVisitorT extends TreeVisitorLumenFile, T { }写测试往返一致是硬指标把 round-trip 测试放在第一位解析 → 打印 → 逐字比对原文。各模块的src/test/如 rewrite-docker 的测试里都有可直接套用的模板。往返全绿之后再补具体语法点的解析用例。接入生态注册解析器并纳入构建新建rewrite-lumen模块在 settings.gradle.kts 中加入构建核心通过 Java SPI 从 classpath 发现 Parser在模块的META-INF/services下登记LumenParser即可被自动加载附一个示例配方与简短使用文档别人拿到就能跑OpenRewrite 与 Moderne 生态的关系如下你的模块最终会落在这一盘棋的「语言支持」位上验证与调试最快跑通验证./gradlew :rewrite-lumen:test先过单测自检解析正确性不用自己写工具核心自带FindParseToPrintInequality搜索配方直接扫出「打印 ≠ 解析」的文件用 Moderne CLI 对真实代码库端到端跑一遍配方确认大规模输入下也稳定常见卡点与排障 ⚠️空白/注释打印时消失AST 没留「空白槽位」回填无源。在解析期就收集不要等打印时补救accept 误伤或漏收文件名正则太松/太紧先单独给accept(Path)写测试解析错误被吞成空树忘了配置 ANTLR 的 error listener异常分支参照 DockerParser 用ParseError记录别静默返回 null往返明明一样却报不等SourceFile参与 diff 比较equals/hashCode漏实现一上来就啃类型解析先做到「解析—打印」无损类型信息留到第二期收尾把成果交给社区完成后按 贡献者指南 提交 PR参与评审。后续可规划的方向类型推断与解析增强、格式化风格支持、围绕 Lumen 的更多配方。做完一轮你对编译器设计和无损代码转换的理解会扎实一个台阶。【免费下载链接】rewriteAutomated mass refactoring of source code.项目地址: https://gitcode.com/gh_mirrors/re/rewrite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价