大规模自动化重构框架--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来调整代码的结构和格式。

配方(Recipe)实际开发实践参见:OpenRewrite:实现一个简单的配方(Recipe)

4. 参考链接

Introduction to OpenRewrite | OpenRewrite by Moderne

Java LST examples | OpenRewrite by Moderne

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数

摘要/导言 本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明&#xff0c;读者将了解如何实现数据分析和爬虫技术的结合应用&#xff0c;从而更好地理解和应用相关技术。 背景/引言 随着电…

IO流(3)-文件字符输入\输出流

FIleReader(文件字符输入流&#xff09; 文件字符输出流代码示例 package com.zz.io;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader;public class Test4 {public static void main(String args[]) …

pycharm @NotNull parameter ‘module‘ of ...

下载了最新pycharm &#xff0c;无法启动运行 pycharm或者idea中Run/Debug Python项目报错 Argument for NotNull parameter ‘module‘ of … 解决方案 删除项目根目录的 idea 文件夹 随后重启&#xff0c;重新配置即可

LIN API call LINWakeup() ignored! due to LIN Interactive Master seetings!

在写使用CANoe写测试用例时&#xff0c;想控制LIN节点的休眠和唤醒&#xff0c;笔者想想这玩意再简单不过了&#xff0c;不过就是调用linWakeup()和linGotoSleep()嘛&#xff0c;可是越自信&#xff0c;现实总会给你啪啪啪打脸。实际写完验证并不能达到效果&#xff0c;看了下w…

WRF模型运行教程(ububtu系统)--III.运行WRF模型(官网案例)

零、创建DATA目录 # 1.创建一个DATA目录用于存放数据&#xff08;一般为fnl数据&#xff0c;放在Build_WRF目录下&#xff09;。 mkdir DATA # 2.进入 DATA cd DATA 一、WPS预处理 在模拟之前先确定模拟域&#xff08;即模拟范围&#xff09;,并进行数据预处理&#xff08…

Docker 哲学 - 容器操作

容器&#xff1a; 创建 停止 删除 强制删除&#xff08;正在运行&#xff09; run stop rm rm -f 列出本地容器&#xff1a; docker ps / docker container ls 镜像&#xff1a; search pull run &#xff1a; …

Altium Designer怎么设置默认原理图纸张大小

Altium Designer怎么设置默认原理图纸张大小 绘制原理图时我们需要设置好原理图图纸大小&#xff0c;建议大家可以将默认原理图图纸设置为A3&#xff0c;A3图纸大小可以容纳下大部分原理图&#xff0c;这样就不用每次画原理图前去修改图纸大小&#xff0c;可以提高设计效率。 …

java serlvet 高校学生画像平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目echarts图形展现

一、源码特点 java serlvet 高校学生画像平台系统是一套完善的java web信息管理系统 系统采用serlvetdaobean 模式开发本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCA…

sqllab第三关通关笔记

知识点&#xff1a; 通过回显的信息判断原始语句的组成猜测该语句为 select 1,2,3 from 表名 where id (输入) limit 0,1 首先通过测试判断存在什么类型的sql注入 构造id1/0 发现正常输出&#xff1b;说明是字符型的sql注入 好了&#xff0c;下面就测试有什么限制条件 构造…

AI视频矩阵混剪系统|罐头鱼AI批量混剪定时发送

AI视频矩阵混剪系统&#xff1a;智能创作与发布的完美结合 随着社交媒体平台的快速发展&#xff0c;视频已成为各行业推广和传播的热门方式。然而&#xff0c;对于许多人来说&#xff0c;制作高质量的视频仍然是一项挑战。Q:290615413但现在&#xff0c;有了AI视频矩阵混剪系统…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.5 导数&#xff08;Derivatives&#xff09;2.6 更多的导数例子&#xff08;More Derivative Examples&…

【快捷部署】002_Flink(1.17.2)

&#x1f4e3;【快捷部署系列】002期信息 编号选型版本操作系统部署形式部署模式002Flink1.17.2CentOS 7.Xtgz包单机 &#x1f449; 演示视频 Flink一键安装&#xff08;本地模式&#xff09; install-flink.sh 脚本内容 #!/bin/bash ####变量 ###执行脚本的当前目录 mydir$…

【linux】搜索所有目录和子目录下的包含.git的文件并删除

一、linux命令搜索所有目录和子目录下的包含.git的文件 在Linux系统中&#xff0c;要搜索所有目录和子目录下的包含.git的文件&#xff0c;可以使用find命令。find命令允许指定路径、表达式和操作来查找文件。 以下是使用find命令搜索包含.git的文件的方法&#xff1a; 1. 基…

oracle基础-子查询 备份

一、什么是子查询 子查询是在SQL语句内的另外一条select语句&#xff0c;也被称为内查询活着内select语句。在select、insert、update、delete命令中允许是一个表达式的地方都可以包含子查询&#xff0c;子查询也可以包含在另一个子查询中。 【例1.1】在Scott模式下&#xff0…

JVM理解学习

参考视频 运行时数据区 JVM架构总览图 绿色的&#xff1a;方法区&#xff0c;堆&#xff0c;是所有线程共享的 黄色的&#xff1a; 虚拟机栈&#xff0c;本地方法栈&#xff0c;程序计数器&#xff0c;是线程私有的 程序计数器 程序计数器是一块较小的内存空间&#xff0c;物…

SpringBoot(异常处理)

SpringBoot&#xff08;异常处理&#xff09; 1.基本介绍 2.debug异常处理机制 1.找到 DefaultErrorViewResolver 2.下断点 3.debug启动&#xff0c;浏览器输出一个不存在的页面 4.第一次查找 error/404 1.查看目前要找的视图名 2.准备去查找资源 3.准备从四个默认存放静态资…

AcWing.505 火柴排队(离散化逆序对)

题目 涵涵有两盒火柴&#xff0c;每盒装有 n  根火柴&#xff0c;每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列&#xff0c;同一列火柴的高度互不相同&#xff0c;两列火柴之间的距离定义为&#xff1a; ∑i1n(ai−bi)2 其中 ai表示第一列火柴中第 i个火柴的…

开源漏扫工具:DependencyCheck

开源漏扫工具&#xff1a;DependencyCheck Dependency-Check 是 OWASP&#xff08;Open Web Application Security Project&#xff09;的一个实用开源程序&#xff0c;用于识别项目依赖项并检查是否存在任何已知的&#xff0c;公开披露的漏洞。 DependencyCheck是一个开源的…

【并查集】模版

【模板】并查集 - 洛谷 #include <bits/stdc.h> using namespace std; const int N2e59; int a[N]; int Find(int x) {if(xa[x]){return x;}else{a[x]Find(a[x]);return a[x];} } void push(int x,int y) {a[Find(x)]Find(y);return ; } int main() {int n,m; cin>>…

前端实例:页面布局1(后端数据实现)

效果图 注&#xff1a;这里用到后端语言php&#xff08;页面是.php文件&#xff09;,提取纯html也可以用 inemployee_index.php <?php include(includes/session.inc); $Title _(内部员工首页); $ViewTopic 内部员工首页; $BookMark 内部员工首页; include(includes/…