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
要求是上述类
在计算特定选项
时,返回该选项值
的简单实现
.
重构选项
重构选项
是影响重构操作
的值,它用命令行选项
或其他客户相关
机制指定.应使用从OptionalRequiredOption
或RequiredRefactoringOption
继承的类
创建选项
.
以下示例显示了如何创建与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语言深度解剖》+蛋哥分析+个人理解
追求本质,不断进步 本文由睡觉待开机原创,转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 这里写目录标题 一、空间的申请1.变量定义1.1变量定义的概念:1.2变…...

鸿蒙开发系列教程(五)--ArkTS语言:组件开发
1、基础组件 组件API文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/84_u58f0_u660e_u5f0f_u5f00_u53d1_u8303_u5f0f_uff09-0000001427744776-V2 查看组件API 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 容…...
Java:正则表达式讲解加举例,简洁易懂
正则表达式定义: 由一些特定的字符组成,代表的是一个规则。 作用:1.校验数据是否合法。2.可以在一段文本中查找满足要求的内容。 先自己写一个方法去校验qq号,比较与正则表达式的区别: 正则表达式的代码暂时可以不…...

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

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

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

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

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

综述:自动驾驶中的 4D 毫米波雷达
论文链接:《4D Millimeter-Wave Radar in Autonomous Driving: A Survey》 摘要 4D 毫米波 (mmWave) 雷达能够测量目标的距离、方位角、仰角和速度,引起了自动驾驶领域的极大兴趣。这归因于其在极端环境下的稳健性以及出色的速度和高度测量能力。 然而…...
蓝桥杯:1.特殊日期(Java)
题目描述 对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。 请问从1900年1月1日至9999年12月31日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。 例如&…...

服务异步通讯之 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系列微控制器的程序,主要目的是初始化GPIOA的Pin 0并使其按照特定的模式进行闪烁。下面是对这段代码的逐行解释: #include "stm32f10x.h":这一行包含了STM32F10x系列微控制器的设备头文件。这个头文件包含…...

php array_diff 比较两个数组bug避坑 深入了解
今天实用array_diff出现的异常问题,预想的结果应该是返回 "integral_initiate">"0",实际没有 先看测试代码: $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图像色彩模式
方法一:直接修改RGB的值 首先将BitmapData扫描线上的所有像素复制到字节数组中,然后遍历数组并对每个像素的RGB值进行修改,最后将修改后的像素值复制回BitmapData。这个过程不会影响原始的Bitmap对象,但会改变锁定的位图区域的数…...

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.(5.2_基于指纹的实时室内定位,使用深度学习和前一状态&…...
AIGC时代高效阅读论文实操
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

对网站进行打点(不要有主动扫描行为)
什么是打点? 简单来说就是获取一个演习方服务器的控制权限。 目的: 1. 上传一个一句话木马 2. 挖到命令执行 3. 挖到反序列化漏洞 4. 钓鱼 假设对“千峰”网站进行打点: 1. 利用平台 1. 利用各类平台: 天眼查-商业查询平…...
502. IPO(贪心算法+优先队列/堆)
整体思想:在满足可用资金的情况下,选择其中利润最大的业务,直到选到k个业务为止,注意k可能比n大。 每次选择完一个业务,可用资金都会变动,这是可选择的业务也会变化,因此每次将可选择的业务放在…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

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

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...

Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...