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

news2024/11/26 0:35:04

目录

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

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

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

相关文章

SpringBlade error/list SQL 注入漏洞复现

0x01 产品简介 SpringBlade 是一个由商业级项目升级优化而来的 SpringCloud 分布式微服务架构、SpringBoot 单体式微服务架构并存的综合型项目。 0x02 漏洞概述 SpringBlade 框架后台 /api/blade-log/error/list路径存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数…

Redis应用缓存

目录 前言 关于“二八定律” 使用Redis作为缓存 为什么关系型数据库性能不高 为什么并发量高了就容易宕机 Redis就是一个用来作为数据库缓存的常见方案 缓存更新策略 定期生成 搜索引擎为例 实时生成 淘汰策略 FIFO(First In First Out) 先进先出 lRU(Least …

106. Dockerfile通过多阶段构建减小Golang镜像的大小

我们如何通过引入具有多阶段构建过程的Dockerfiles来减小Golang镜像的大小&#xff1f; 让我们从一个通用的Dockerfile开始&#xff0c;它负责处理基本的事务&#xff0c;如依赖项、构建二进制文件、声明暴露的端口等&#xff0c;以便为Go中的一个非常基础的REST API提供服务。…

YoloV8实战:YoloV8-World应用实战案例

摘要 YOLO-World模型确实是一个突破性的创新&#xff0c;它结合了YOLOv8框架的实时性能与开放式词汇检测的能力&#xff0c;为众多视觉应用提供了前所未有的解决方案。以下是对YOLO-World模型的进一步解读&#xff1a; 模型架构与功能 YOLO-World模型充分利用了YOLOv8框架的…

剑指offer面试题34:在二叉树中和为某一值的路径

面试题34&#xff1a;在二叉树中和为某一值的路径 题目&#xff1a; LCR 153. 二叉树中和为目标值的路径 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路…

C语言 - 各种自定义数据类型

1.结构体 把不同类型的数据组合成一个整体 所占内存长度是各成员所占内存的总和 typedef struct XXX { int a; char b; }txxx; txxx data; typedef struct XXX { int a:1; int b:1; …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RichText)

富文本组件&#xff0c;解析并显示HTML格式文本。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件无法根据内容自适应设置宽高属性&#xff0c;需要开发者设置显示布局。 子组件 不包含子组…

封装的echarts子组件使用watch监听option失效的问题

项目场景&#xff1a; 我在项目里面封装了一个echarts组件&#xff0c;组件接收一个来自外部的option,然后我用了一个watch函数去监听这个option的变化&#xff0c;option变化之后&#xff0c;销毁&#xff0c;然后再新建一个charts表 碎碎念 问题如标题所示&#xff0c;这篇…

ubuntu 安装 infiniband 和 RoCE 驱动

下载驱动程序 驱动程序地址 https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ 安装 安装参考文档 https://docs.nvidia.com/networking/display/mlnxofedv24010331/installing+mlnx_ofed#src-2571322208_InstallingMLNX_OFED-InstallationProced…

十五、计算机视觉-sobel算子

文章目录 前言一、sobel算子的概念二、sobel算子的计算方式三、具体实现 前言 上节课我们学习了梯度的知识&#xff0c;学习了如何去计算梯度&#xff0c;本节我们继续学习计算梯度的方法&#xff0c;本节我们学习使用Sobel算子计算梯度&#xff0c;这与上节课梯度计算方法有所…

Java客户端调用elasticsearch进行深度分页查询 (search_after)

Java客户端调用elasticsearch进行深度分页查询 &#xff08;search_after&#xff09; 一. 代码二. 测试结果 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 具体的Search_after解…

科技回顾,飞凌嵌入式受邀亮相第八届瑞芯微开发者大会「RKDC2024」

2024年3月7日~8日&#xff0c;第八届瑞芯微开发者大会&#xff08;RKDC2024&#xff09;在福州举行&#xff0c;本届大会以“AI芯片AI应用AloT”为主题&#xff0c;邀请各行业的开发者共启数智化未来。 本届大会亮点颇多&#xff0c;不仅有13大芯片应用展示、9场产品和技术论坛…

28 批量归一化【李沐动手学深度学习v2课程笔记】(备注:这一节讲的很迷惑,很乱)

目录 1.批量归一化 1.1训练神经网络时出现的挑战 1.2核心思想 1.3原理 2.批量规范化层 2.1 全连接层 2.2 卷积层 2.3 总结 3. 代码实现 4. 使用批量规范化层的LeNet 5. 简明实现 1.批量归一化 现在主流的卷积神经网络几乎都使用了批量归一化 批量归一化是一种流行且…

面向对象【static关键字】

文章目录 Java中的static关键字1. 静态变量2. 静态方法的特点3. 静态块4. 静态导入5. 单例模式中的应用 Java中的static关键字 在Java中&#xff0c;static是一个关键字&#xff0c;用于定义类级别的成员&#xff0c;这些成员与类的实例无关。static成员属于类而不是类的实例&…

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展&#xff0c;固态硬盘&#xff08;Solid State Drive&#xff0c;简称SSD&#xff09;已成为现代电脑的标配。相较于传统的机械硬盘&#xff0c;固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是&#xff0c;对于不熟悉电脑硬件的用户来说&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水下目标检测系统(深度学习模型+UI界面+训练数据集)

摘要&#xff1a;本研究详述了一种采用深度学习技术的水下目标检测系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别水…

唯众物联网+地理科学交付云南师范大学地理学部教学实验室项目

近日&#xff0c;云南师范大学地理学部教学实验室建设项目顺利交付。该项目的成功落地&#xff0c;标志着物联网技术与地理科学教育的深度融合&#xff0c;为云南师范大学的地理教学提供了全新的教学平台与资源。该项目以物联网技术为核心&#xff0c;结合地理科学的特点&#…

新一代实时数据集成框架 Flink CDC 3.0 —— 核心技术架构解析

本文整理自阿里云开源大数据平台吕宴全关于新一代实时数据集成框架 Flink CDC 3.0 的核心技术架构解析&#xff0c;内容主要分为以下四部分&#xff1a; Flink CDC 演进历程 Flink CDC 3.0 的架构设计 Flink CDC 3.0 的核心实现 未来规划 一、Flink CDC 演进历程 Flink CD…

Web——HTML

一.HTML概述 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器来解析。 二.…

相机模型Omnidirectional Camera(全方位摄像机)

1. 背景 大多数商用相机都可以描述为针孔相机&#xff0c;通过透视投影进行建模。然而&#xff0c;有些投影系统的几何结构无法使用传统针孔模型来描述&#xff0c;因为成像设备引入了非常高的失真。其中一些系统就是全方位摄像机。 有几种方法可以制作全向相机。屈光照相机(D…