大规模自动化重构框架--OpenRewrite浅析

目录

1. OpenRewrite是什么?定位?

2. OpenWrite具体如何做?

3. 核心概念释义

3.1 Lossless Semantic Trees (LST) 无损语义树

3.2 访问器(Visitors)

3.3 配方(Recipes)

4. 参考链接


OpenRewrite是一个用于大规模自动化代码重构的框架,通过帮助开发人员自动化地进行代码重构和转换,大大提升了研发效率。

本文主要对OpenRewrite进行简要介绍,更详尽的说明可以参加OpenRewrite官网Introduction to OpenRewrite | OpenRewrite by Moderne。

作为一款开源框架,代码仓库地址见:GitHub - openrewrite/rewrite: Automated mass refactoring of source code.

1. OpenRewrite是什么?定位?

OpenRewrite是一个用于源代码的自动重构开源框架,使开发人员能够有效地消除代码库中的技术债务。

它包括一个自动重构引擎,可以运行预打包的开源重构方案,用于常见的框架迁移、安全修复和风格一致性任务,将您的编码工作从几小时或几天减少到几分钟。构建工具插件如OpenRewrite Gradle插件和OpenRewrite Maven插件帮助您一次在一个代码库上运行这些重构方案。

通过使用OpenRewrite,开发人员可以轻松地应用各种重构规则,以改善代码的可读性、可维护性和性能。它可以帮助开发人员自动化地进行代码转换,减少手动修改代码的工作量,并确保代码的一致性和质量。

总之,OpenRewrite是一个强大的工具,可以帮助开发人员快速、高效地进行代码重构,消除技术债务,提高代码质量和开发效率。

OpenRewrite主要的用途包括但不限于:

  • 自动化代码重构
  • 框架迁移
  • 安全漏洞修复
  • 代码技术债消除
  • 等等

2. OpenWrite具体如何做?

OpenRewrite的工作原理是对表示源代码的LST(Lossless Semantic Trees)无损语义树进行修改,并将修改后的树输出回源代码。然后,您可以查看代码中的更改并提交。对LST的修改是在访问器(Visitors)中执行的,并将这些访问器聚合到配方(Recipe)中,这里采用了访问者设计模式的方案。

在OpenRewrite中,LST无损语义树是一种抽象语法树(AST)的变体,用于表示特定编程语言的源代码结构。通过解析源代码文件,OpenRewrite将其转换为LST表示形式。然后,访问器可以遍历和修改LST的不同部分,例如添加、删除、替换代码片段,修改变量名等。

配方(Recipe)是一组预定义的或自定义的访问器,它们定义了对LST进行的具体修改操作。这些配方可以针对常见的框架迁移、安全修复和风格一致性任务进行预打包,也可以根据特定需求进行自定义开发。

在执行具体的配方(Recipe)时,OpenRewrite会应用访问器对LST进行修改。修改后的LST将被重新生成为源代码文件,以便您可以查看和审查更改。您可以根据需要进行进一步的修改和调整,然后提交更改后的代码。

总之,OpenRewrite通过对LST进行修改和重新生成源代码,实现了对源代码的自动化重写。它使用访问器来执行具体的修改操作,并将这些访问器聚合到配方(Recipe)中。

3. 核心概念释义

3.1 Lossless Semantic Trees (LST) 无损语义树

LST使用树来表示代码,与传统的抽象语法树(AST)不同,OpenRewrite的LST具有一组独特的特性,使得在代码库中进行准确的转换和搜索成为可能:

OpenRewrite的LST具有以下特点:

1. 类型属性(Type-attributed):每个LST都包含与之相关的类型信息。例如,在源代码中引用一个字段时,源代码可能只是将其称为myField。而OpenRewrite的LST则会包含关于myField的类型信息。

2. 保持格式(Format-preserving):LST在树中保留了LST前后的空白字符,因此可以将树打印出来以重新构建原始的源代码,而不会破坏格式。此外,插入代码的重构操作会对周围代码的本地风格敏感,并匹配本地风格。

通过这些特点,OpenRewrite的LST能够提供更准确和可靠的代码转换和搜索。

类型属性使得在进行代码转换时可以更精确地处理不同类型的代码元素;

保持格式的特性使得转换后的代码保持了原始代码的格式和风格,并提高了代码的可读性。

在Java语言中,下图释义了一个简单的Java类如何表示为LST,并描述LST的层次结构,如下:

  • CompilationUnit(编译单元):

    在Java的LST中,CompilationUnit(编译单元)是LST的根节点,代表了一个Java源代码文件的整体结构,它包含了文件级别的信息和元素,例如包声明、导入语句、类声明等。

  • ClassDeclaration(类声明):表示整个Java类,它包含了类的名称、修饰符、继承关系等信息。
  • Block(代码块):由一对花括号(curly braces)以及其中包含的语句(Statements)组成的。Block表示了一段代码的作用域范围,通常用于定义方法体、循环体、条件语句体等。它可以包含多个语句,这些语句按照顺序执行。
  • VariableDeclarations(变量声明):这是一个LST,表示类中的字段声明、方法参数、局部变量定义等;

  • MethodDeclaration(方法声明):这是一个LST,表示类中的方法声明。
  • ......

3.2 访问器(Visitors)

在OpenRewrite中,访问器(Visitor)是核心逻辑所在的地方。它确定了应该更新哪些元素以及何时更新。

访问器是一种用于遍历和修改LST的组件。它定义了在遍历LST时要执行的操作,例如查找特定类型的代码元素、修改代码元素的属性或结构等。

在OpenRewrite中,所有的访问器都继承自抽象类TreeVisitor<T extends Tree, P>,并提供了泛型化的visit(T, P)方法;参数化类型T代表访问器将要遍历和转换的LST的类型,第二个参数P是一个额外的、共享的上下文,作为一个访问器在遍历给定的LST时传递给所有的visit方法

OpenRewrite的访问器通过继承TreeVisitor类,并重写visit方法来实现对LST的遍历和转换。通过泛型化的visit方法和参数化类型,访问器可以灵活地处理不同类型的LST,并通过共享的上下文实现数据的共享和传递。

3.3 配方(Recipes)

一个配方(Recipe)代表了一组可以应用于Lossless Semantic Tree的搜索和重构操作,它可以表示一个单独的、独立的操作,也可以与其他配方链接在一起,以实现更大的目标,比如框架迁移。

Recipe是OpenRewrite中的一个核心概念,它定义了对代码进行搜索和重构的具体操作。一个Recipe可以包含多个访问器(Visitors),每个访问器负责执行特定的操作,例如查找特定类型的代码元素、修改代码元素的属性或结构等。

通过将多个Recipe链接在一起,开发人员可以实现复杂的重写逻辑和转换操作。例如,可以使用一个Recipe来查找所有使用过时的API,并将其替换为新的API,然后使用另一个Recipe来调整代码的结构和格式。

4. 参考链接

Introduction to OpenRewrite | OpenRewrite by Moderne

Java LST examples | OpenRewrite by Moderne

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA 按键控制串口发送

按键消抖 消抖时间一般为10ms&#xff0c;我使用的板子是ACX720&#xff0c;晶振为50MHZ&#xff0c;20ns为一周期。 状态机 模块设计 设计文件 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2023/01/11 12:18:36 // Design Name: // Module Name…

Linux应用 inotify监控文件变化

1、前言 inotify是Linux内核提供的一种文件系统监控机制&#xff0c;可以用来监视文件系统的变化&#xff0c;如文件创建、删除、修改、移动等。通过inotify&#xff0c;用户空间程序可以实时获取文件系统的变化事件&#xff0c;并做出相应的处理。 主要特点&#xff1a; 实…

C++进阶之路---二叉搜索树详解 | 具体实现

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、二叉搜索树简介 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&am…

设计模式九:装饰器模式

文章目录 1、装饰器模式2、示例3、装饰器模式与适配器模式4、装饰器模式和代理模式5、java io流的装饰器模式 1、装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构…

H5 微商宣传引流跳转微信单页源码

源码名称&#xff1a;H5 微商宣传引流跳转微信单页源码 源码介绍&#xff1a;一款微商宣传引流单页源码&#xff0c;源码带有导师微信二维码&#xff0c;点击复制微信号并跳转到微信功能【跳转后需自行贴贴搜索】。可用于各种微商团队宣传。 需求环境&#xff1a;H5 下载地址…

如何将应用一键部署至多个环境?丨Walrus教程

在 Walrus 平台上&#xff0c;运维团队在资源定义&#xff08;Resource Definition&#xff09;中声明提供的资源类型&#xff0c;通过设置匹配规则&#xff0c;将不同的资源部署模板应用到不同类型的环境、项目等。与此同时&#xff0c;研发人员无需关注底层具体实现方式&…

基与HTML5的塔防游戏设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 项目背景与相关技术 3 1.1 背景与发展简介 3 1.2 HTML5技术及其优势 4 1.3 JavaScript开发的优势与劣势 4 1.4 CSS样式表在开发中的用处 5 1.5 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 问题分析 7 2.3 流程设计 7 2.3 功能分析 8 2.…

私立医院的革命者:大数据解决方案全面解析

第一部分&#xff1a;背景 在信息化飞速发展的今天&#xff0c;医疗行业正经历着一场深刻的数字化转型。特别是对于私立医院来说&#xff0c;要在这个变革的浪潮中立于不败之地&#xff0c;就必须拥抱新技术&#xff0c;优化服务流程&#xff0c;提高医疗质量。大数据技术&…

基于深度学习的植物类别检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 可以任意更换主干结构&#xff0c;支持几百种网络主干。 数据集&#xff1a;     网上下载的数据集&#x…

【Linux】常见的基本指令(下)

在本篇博客中&#xff0c;继续介绍Linux的常见的基本指令。 一.find指令 find指令是一条搜索指令&#xff0c;在目录结构中搜索文件。 find [目录名] -name [文件名] 在指定的目录下以文件名的搜索方式去搜索文件 二.which指令 which指令是只用来搜索命令在那个路径下…

Ableton Live 12 Suite:音乐创作的全能工作站 mac版

在数字音乐制作的领域中&#xff0c;Ableton Live 11 Suite 无疑是引领潮流的旗舰产品。作为一款综合性的音乐制作和演出软件&#xff0c;它提供了从创作灵感的萌芽到最终作品完成的全方位解决方案。 Ableton Live 12 Suite Mac版软件获取 Ableton Live 11 Suite 凭借其强大的…

登录与注册功能(简单版)(1)登录

目录 1、需求 2、怎样实现 3、步骤 1&#xff09;创建login.html 2&#xff09;创建user数据表 3&#xff09;IDEA连接数据库 4&#xff09;pom.xml中添加MyBatis和MySQL驱动坐标 5&#xff09;创建User实体类 6&#xff09;创建UserMapper.xml映射文件 7&#xff0…

实体好做,还是电商好做?最适合新手的是哪种?

我是电商珠珠 时间过得很快&#xff0c;距离2025年转眼间也就只剩下了9个月&#xff0c;部分人想要充分利用自己的时间去做一些可以赚钱的项目。 现在创业要么做实体店&#xff0c;要么做自媒体&#xff0c;要么就做电商。按照现在的经济发展趋势&#xff0c;开实体店甚至不能…

Tiktok视频播放为何为0?4大原因小白需了解

原因一、养号失败&#xff0c;被判为营销号 注册了tiktok账号以后&#xff0c;是需要一段时间进行养号&#xff0c;培养账号权重的&#xff01;而有些小伙伴未经养号&#xff0c;直接注册上手开始发视频&#xff01;这样很容易导致视频没有播放&#xff01;因为这样连续的一系…

比派电器T6白色系高速吹风机,高品质保证下,追求极致性价比

广东比派电器科技有限公司于2020年成立于东莞市松山湖高新技术企业园区融易大厦&#xff0c;公司聚焦于小家电的研发&#xff0c;生产&#xff0c;销售。专注在小家电的PCBA研发&#xff0c;产品设计&#xff0c;成品生产。提供小家电产品一站式解决方案&#xff0c;致力于成为…

铁威马TOS 6即将登场,全新设计更多功能抢先看!

错过了TOS 6内测的铁粉们注意啦&#xff01; 很高兴与大家宣布 铁威马TOS 6 Beta 将在本月与大家见面 时隔一年多 TOS 6历经严格测试与精细优化 焕然一新的用户界面 由内而外展现全新风采 今天小马就来给大家小剧透 TOS 6新功能抢先看 TOS 6是铁威马迄今为止“最友好最美…

深度强化学习(三)(DQN)

深度强化学习&#xff08;三&#xff09;DQN与Q学习 一.DQN 通过神经网络来近似最优动作价值函数 Q ∗ ( a t , s t ) Q_*(a_t,s_t) Q∗​(at​,st​),在实践中, 近似学习“先知” Q ⋆ Q_{\star} Q⋆​ 最有效的办法是深度 Q \mathrm{Q} Q网络 (deep Q network, 缩写 DQN)…

Java进程CPU高负载排查

Java进程CPU高负载排查步骤_java进程cpu使用率高排查_YouluBank的博客-CSDN博客 【问题定位】使用arthas定位CPU高的问题_arthas cpu高_秋装什么的博客-CSDN博客 CPU飙升可能原因 CPU 上下文切换过多。 对于 CPU 来说&#xff0c;同一时刻下每个 CPU 核心只能运行-个线程&…

深度学习模型部署(六)TensorRT工作流and入门demo

TensorRT工作流程 官方给出的步骤&#xff1a; 总结下来可以分为两大部分&#xff1a; 模型生成&#xff1a;将onnx经过一系列优化&#xff0c;生成tensorrt的engine模型 选择batchsize&#xff0c;选择精度precision&#xff0c;模型转换 模型推理&#xff1a;使用python或…

SpringBoot(容器功能)

文章目录 1.Configuration 添加/注入bean1.注入bean1.编写一个JavaBean&#xff0c;Monster.java2.创建一个config文件夹&#xff08;名字任意&#xff09;&#xff0c;用于存放配置Bean的类&#xff08;相当于配置文件&#xff09;3.BeanConfig.java4.测试使用 MainApp.java2.…