当前位置: 首页 > news >正文

2401llvm,clang的重构引擎

Clang的重构引擎

展示如何使用重构API中的各种原语来实现不同的重构.
LibTooling库提供了几个在开发重构操作时,使用的其他API.

可用重构引擎来实现,用编辑器IDE中的选择启动本地重构.可结合AST匹配器和重构引擎,以实现不适合源选择和/或必须查询某些指定节点AST的重构.

假定基本了解了ClangAST.更多见ClangAST简介.

介绍

Clang的重构引擎定义了一组重构操作,来实现许多不同的源转换.clang-refactor命令行工具可用来重构.

其他如文本编辑器和IDE也用这些重构.

重构操作是一个定义了相关重构操作(规则)列表的类.在共同的单个clang-refactor命令下,分组这些规则.
除了规则外,重构操作还向clang-refactor提供操作的命令名和描述.每个操作都必须实现RefactoringAction接口.
下面是本地重命名操作的大概:

class LocalRename final : public RefactoringAction {
public:StringRef getCommand() const override { return "local-rename"; }StringRef getDescription() const override {return "Finds and renames symbols in code with no indexer support";}RefactoringActionRules createActionRules() const override {...}
};

重构操作规则

单个重构操作负责创建一组表示重构操作分组重构操作规则.尽管一个操作中的规则可能有多个不同实现,但它们应努力产生类似结果.

无论使用哪种重构操作规则,用户都应很容易识别是哪个重构操作产生了结果.

通过区分操作和规则,可创建定义一组产生类似结果不同规则的操作.如,"添加缺失开关(switch)"重构操作,一般一次添加一个缺失switch.

但是,在指定枚举上运行所有开关上都适用的重构可能很有用,因为在添加新的枚举常量后,可自动更新所有开关.为此,可创建两个使用clang-refactor子命令的不同规则.

第一条规则描述在用户选择单个开关时启动的本地操作.第二条规则描述跨翻译单元工作的全局操作,并在用户向clang-refactor提供枚举名时启动(或用户可改为选择枚举声明).

然后,clang-refactor工具分析传递给重构操作选择和其他选项,并为给定选择其他选项选择最合适的规则.

规则类型

Clang的重构引擎支持几个不同的重构规则:
1,SourceChangeRefactoringRule生成应用至源文件源替换.选择实现此规则子类必须实现createSourceReplacements成员函数.
该类型规则一般用来实现仅在翻译单元内转换源的本地重构.
2,FindSymbolOccurrencesRefactoringRule生成"部分"重构结果:引用指定符号的一组实例.该类型的规则一般用来实现,重构时,允许用户指定重命名哪些匹配项的交互式重命名操作.

选择实现此规则的子类必须实现findSymbolOccurrences成员函数.

如果不确定应使用的规则类型,以下快速检查也许有用:

如果想在一个翻译单元中转换源,且不需要跨TU信息,则SourceChangeRefactoringRule应该适合你.
如果要使用潜在的交互式组件实现类似重命名的操作,则FindSymbolOccurrencesRefactoringRule可能适合你.

如何创建规则

确定适合规则后,可通过继承规则并实现其接口来重构.子类应该有个取期望重构的输入的构造器.
如,如果要实现仅删除所选内容规则,则应使用接受选择区间的构造器,来创建SourceChangeRefactoringRule的子类:

class DeleteSelectedRange final : public SourceChangeRefactoringRule {
public:DeleteSelection(SourceRange Selection) : Selection(Selection) {}Expected<AtomicChanges>createSourceReplacements(RefactoringRuleContext &Context) override {AtomicChange Replacement(Context.getSources(), Selection.getBegin());Replacement.replace(Context.getSource,CharSourceRange::getCharRange(Selection), "");return { Replacement };}
private:SourceRange Selection;
};

然后,可用createRefactoringActionRule函数添加规则子类特定操作重构操作规则列表中.如,可用以下代码,把上面显示的类添加操作规则列表中:

RefactoringActionRules Rules;
Rules.push_back(createRefactoringActionRule<DeleteSelectedRange>( SourceRangeSelectionRequirement()));

createRefactoringActionRule函数取重构操作规则要求值的列表.这些值描述重构引擎必须满足的启动要求,然后才能构造调用提供的操作规则.

后面介绍如何求值这些要求,并列举可用来构造重构操作规则所有可能要求.

重构操作规则要求

重构操作规则要求是一个从RefactoringActionRuleRequirement继承的类型的值.该类型必须定义一个返回Expected<...>evaluate成员函数.

createRefactoringActionRule的参数用要求值时,在启动操作规则时求值该值.然后,除非求值产生错误,把求值结果传递给规则的构造器.

如,以下步骤求值上一部分中定义的DeleteSelectedRange示例规则:
首先调用SourceRangeSelectionRequirement的返回Expected<SourceRange>evaluate成员函数.

如果返回值为错误,则启动失败,并给客户报告错误.注意,客户可能不会向用户报告错误.

否则,用源区间返回值来构造DeleteSelectedRange规则.然后,启动成功(已成功求值所有要求)时,调用该规则.

相同的一系列步骤适合所有重构规则.首先,引擎求值所有要求.然后,检查是否满足这些要求(它们不应产生错误).然后,构造规则并调用它.

需求,求值和调用重构操作规则的分离允许重构客户:
1,禁止不支持的要求的重构操作规则.
2,收集选项集并定义一个允许用户不调用操作时,输入这些选项命令行/可视化接口.

选区要求

下面列举了需要选择源重构规则要求:
1,在使用某种选择调用操作时,按源区间计算SourceRangeSelectionRequirement.在编辑器中启动重构时,即使用户未选择内容(此时,区间包含光标的位置),也应满足此要求.

其他要求

创建重构规则时,可用其他几种要求类型:
1,RefactoringOptionsRequirement要求是一个应由使用选项的需求继承抽象类.更具体的OptionRequirement要求是上述类在计算特定选项时,返回该选项值简单实现.

重构选项

重构选项是影响重构操作的值,它用命令行选项或其他客户相关机制指定.应使用从OptionalRequiredOptionRequiredRefactoringOption继承的创建选项.

以下示例显示了如何创建与clang-refactor中的-new-name命令行选项对应的必需串选项:

class NewNameOption : public RequiredRefactoringOption<std::string> {
public:StringRef getName() const override { return "new-name"; }StringRef getDescription() const override {return "目标的新名";}
};

然后,可用上面示例中显示的选项,通过类似OptionRequirement的要求为重构规则创建要求:

createRefactoringActionRule<RenameOccurrences>(...,OptionRequirement<NewNameOption>())
);

相关文章:

2401llvm,clang的重构引擎

Clang的重构引擎 展示如何使用重构API中的各种原语来实现不同的重构. LibTooling库提供了几个在开发重构操作时,使用的其他API. 可用重构引擎来实现,用编辑器或IDE中的选择启动的本地重构.可结合AST匹配器和重构引擎,以实现不适合源选择和/或必须查询某些指定节点的AST的重构…...

【C语言深度剖析——第四节(关键字4)】《C语言深度解剖》+蛋哥分析+个人理解

追求本质&#xff0c;不断进步 本文由睡觉待开机原创&#xff0c;转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 这里写目录标题 一、空间的申请1.变量定义1.1变量定义的概念&#xff1a;1.2变…...

鸿蒙开发系列教程(五)--ArkTS语言:组件开发

1、基础组件 组件API文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/84_u58f0_u660e_u5f0f_u5f00_u53d1_u8303_u5f0f_uff09-0000001427744776-V2 查看组件API 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 容…...

Java:正则表达式讲解加举例,简洁易懂

正则表达式定义&#xff1a; 由一些特定的字符组成&#xff0c;代表的是一个规则。 作用&#xff1a;1.校验数据是否合法。2.可以在一段文本中查找满足要求的内容。 先自己写一个方法去校验qq号&#xff0c;比较与正则表达式的区别&#xff1a; 正则表达式的代码暂时可以不…...

2.机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

2️⃣机器学习-K最近邻&#xff08;k-Nearest Neighbor&#xff0c;KNN&#xff09;分类算法原理讲解 个人简介一算法概述二算法思想2.1 KNN的优缺点 三实例演示3.1电影分类3.2使用KNN算法预测 鸢(yuan)尾花 的种类3.3 预测年收入是否大于50K美元 个人简介 &#x1f3d8;️&…...

​WordPress顶部管理工具栏怎么添加一二级自定义菜单?

默认情况下&#xff0c;WordPress前端和后台页面顶部都有一个“管理工具栏”&#xff0c;左侧一般就是站点名称、评论、新建&#xff0c;右侧就是您好&#xff0c;用户名称和头像。那么我们是否可以在这个管理工具栏中添加一些一二级自定义菜单呢&#xff1f; 其实&#xff0c…...

Linux安装ossutil工具且在Jenkins中执行shell脚本下载文件

测试中遇到想通过Jenkins下载OSS桶上的文件&#xff0c;要先在linux上安装ossutil工具&#xff0c;记录安装过程如下&#xff1a; 一、下载安装ossutil&#xff0c;使用命令 1.下载&#xff1a;wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64 2.一定要赋权限…...

Docker命令---搜索镜像

介绍 使用docker命令搜索镜像。 命令 docker search 镜像命令:版本号示例 以搜索ElasticSearch镜像为例 docker search ElasticSearch...

docker使用http_proxy配置代理

钢铁知识库&#xff0c;一个学习python爬虫、数据分析的知识库。人生苦短&#xff0c;快用python。 在内网服务器中&#xff0c;docker经常需要下载拉取镜像&#xff0c;但由于没有网络要么只能手动导入镜像包&#xff0c;又或者通过http_proxy代理到其它服务器下载。 解决方法…...

综述:自动驾驶中的 4D 毫米波雷达

论文链接&#xff1a;《4D Millimeter-Wave Radar in Autonomous Driving: A Survey》 摘要 4D 毫米波 (mmWave) 雷达能够测量目标的距离、方位角、仰角和速度&#xff0c;引起了自动驾驶领域的极大兴趣。这归因于其在极端环境下的稳健性以及出色的速度和高度测量能力。 然而…...

蓝桥杯:1.特殊日期(Java)

题目描述 对于一个日期&#xff0c;我们可以计算出年份的各个数位上的数字之和&#xff0c;也可以分别计算月和日的各位数字之和。 请问从1900年1月1日至9999年12月31日&#xff0c;总共有多少天&#xff0c;年份的数位数字之和等于月的数位数字之和加日的数位数字之和。 例如&…...

服务异步通讯之 SpringAMQP【微服务】

文章目录 一、初识 MQ1. 同步通讯2. 异步通讯3. MQ 常见框架 二、RabbitMQ 入门1. 概述和安装2. 常见消息模型3. 基础模型练习 三、SpringAMQP1. 简单队列模型2. 工作队列模型3. 发布订阅模型3.1 Fanout Exchange3.2 Direct Exchange3.3 Topic Exchange 一、初识 MQ 1. 同步通…...

LED闪烁

这段代码是用于STM32F10x系列微控制器的程序&#xff0c;主要目的是初始化GPIOA的Pin 0并使其按照特定的模式进行闪烁。下面是对这段代码的逐行解释&#xff1a; #include "stm32f10x.h"&#xff1a;这一行包含了STM32F10x系列微控制器的设备头文件。这个头文件包含…...

php array_diff 比较两个数组bug避坑 深入了解

今天实用array_diff出现的异常问题&#xff0c;预想的结果应该是返回 "integral_initiate">"0"&#xff0c;实际没有 先看测试代码&#xff1a; $a ["user_name">"测","see_num">0,"integral_initiate&quo…...

c++中STL的vector简单实现

文章目录 vector构造函数 vector()拷贝构造 vector()析构函数 ~vector()iterator 的定义begin()与const版本end()与const版本增删改查尾插push_back()尾删pop_back()指定位置插入insert()指定位置删除 erase() operator[]与const版本容量增容reserve()设置容量 resize() 成员函…...

C# 更改Bitmap图像色彩模式

方法一&#xff1a;直接修改RGB的值 首先将BitmapData扫描线上的所有像素复制到字节数组中&#xff0c;然后遍历数组并对每个像素的RGB值进行修改&#xff0c;最后将修改后的像素值复制回BitmapData。这个过程不会影响原始的Bitmap对象&#xff0c;但会改变锁定的位图区域的数…...

5.2 基于深度学习和先验状态的实时指纹室内定位

文献来源 Nabati M, Ghorashi S A. A real-time fingerprint-based indoor positioning using deep learning and preceding states[J]. Expert Systems with Applications, 2023, 213: 118889.&#xff08;5.2_基于指纹的实时室内定位&#xff0c;使用深度学习和前一状态&…...

AIGC时代高效阅读论文实操

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

对网站进行打点(不要有主动扫描行为)

什么是打点&#xff1f; 简单来说就是获取一个演习方服务器的控制权限。 目的&#xff1a; 1. 上传一个一句话木马 2. 挖到命令执行 3. 挖到反序列化漏洞 4. 钓鱼 假设对“千峰”网站进行打点&#xff1a; 1. 利用平台 1. 利用各类平台&#xff1a; 天眼查-商业查询平…...

502. IPO(贪心算法+优先队列/堆)

整体思想&#xff1a;在满足可用资金的情况下&#xff0c;选择其中利润最大的业务&#xff0c;直到选到k个业务为止&#xff0c;注意k可能比n大。 每次选择完一个业务&#xff0c;可用资金都会变动&#xff0c;这是可选择的业务也会变化&#xff0c;因此每次将可选择的业务放在…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...