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>())
);

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

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

相关文章

网络安全的概述

网络空间的概念 2003年美国提出网络空间的概念&#xff1a;一个由信息基础设施组成的互相依赖的网络。 我国官方文件定义&#xff1a;网络空间为继海&#xff0c;陆&#xff0c;空&#xff0c;天以外的第五大人类活动领域 网络安全发展历史 通信保密阶段 --- 计算机安全阶段…

API接口安全总结

接口分类 HTTP接口 RPC接口&#xff08;客户端和服务器端的连接 例如游戏登陆&#xff09;非web协议&#xff0c;PRC 远程过程调用 Remote Procedure Call&#xff0c;其就是一个节点请求另外一个节点提供的服务。当两个物理分离的子系统需要建立逻辑上的关联时&#xff0c;R…

1 认识微服务

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

k8s集群异常恢复

前提、我自己的k8s采用的是单master节点两个从节点部署&#xff0c;我针对单master情况进行恢复说明 场景一&#xff1a;正常开关虚拟机&#xff0c;可直接重启kubelet进行恢复 1、1、一般重启后三个节点都需要检查&#xff0c;输入命令检查kubelet&#xff1a; systemctl s…

web3 :开源区块链浏览器调研

目录 blockscout开源地址简单介绍更多介绍看链接EthVM开源地址简单介绍目前支持的网络开发语言主要功能Ethernal开源地址简单介绍目前支持的网络开发语言主要功能

时限挑战——深度解析Pytest插件 pytest-timeout

在软件开发中,测试用例的执行时间通常是一个关键考虑因素。Pytest插件 pytest-timeout 提供了一个强大的插件,允许你设置测试用例的超时时间。本文将深入介绍 pytest-timeout 插件的基本用法和实际案例,助你精确掌控测试用例的执行时限。 什么是pytest-timeout? pytest-tim…

python环境安装sklearn及报错解决

安装 如刚开始安装&#xff0c;还未遇到问题请直接从重新安装库开始看&#xff0c;如果遇到报错&#xff0c;从问题开始看 问题 python安装sklearn报错 &#xff0c;报错信息如下 File "<stdin>", line 1pip install scikit-learn^ SyntaxError: invalid s…

第7章 7.6.5 常量指针 Page406~407

const可以限制指针指向的数据&#xff0c;也可以限制指针的指向 const限制指针指向的数据&#xff0c;不可以修改指向的数据&#xff0c;可以改变指向 推荐写法 常见写法&#xff1a;

用Excel辅助做数独

做数独游戏的时候&#xff0c;画在纸上很容易弄花眼&#xff0c;所以我考虑用Excel辅助做一个。 界面如下&#xff1a; 按下初始化表格区域按钮&#xff0c;会在所有单元格中填充“123456789”。如下图&#xff1a; 当某个单元格删除得只剩一个数字时&#xff0c;会将同一行、…

《大型语言模型自然语言生成评估》综述

在快速发展的自然语言生成&#xff08;NLG&#xff09;评估领域中&#xff0c;引入大型语言模型&#xff08;LLMs&#xff09;为评估生成内容质量开辟了新途径&#xff0c;例如&#xff0c;连贯性、创造力和上下文相关性。本综述旨在提供一个关于利用LLMs进行NLG评估的全面概览…

一篇就学会接口,全网最详细的接口测试

大多数人对于接口测试都觉得是一种高大上的测试&#xff0c;觉得学会接口测试就可以从小白测试员&#xff0c;变成了高级测试员&#xff0c;但其实接口测试只是测试的基础内容 什么是接口 接口泛指实体把自己提供给外界的一种抽象化物&#xff08;可以为另一实体&#xff09;&…

开始学习Vue2(脚手架,组件化开发)

一、单页面应用程序 单页面应用程序&#xff08;英文名&#xff1a;Single Page Application&#xff09;简 称 SPA&#xff0c;顾名思义&#xff0c;指的是一个 Web 网站中只有唯一的 一个 HTML 页面&#xff0c;所有的功能与交互都在这唯一的一个页面内完成。 二、vue-cli …

java web mvc-02-struts2

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails Struts2 Apache Struts是一个用于创…

Matpoltlib Pandas 学习笔记

目录 Matplotlib matplotlib常用方法 散点图 饼图 直方图 Pandas pandas.Series(*args)参数说明 DataFrame 数据结构 CSV file 数据清洗 Matplotlib 定义&#xff1a; Matplotlib 是python的绘图库 Pyplot 是其子库&#xff0c;通用绘制2D图表&#xff0c; matplotli…

Redis 笔记二

概览 1.高并发秒杀问题及可能出现的bug 2.秒杀场景JVM级别锁和分布式锁 3.大厂分布式锁Redisson框架 4.从Redisson源码剖析lua解决锁原子性问题 5.从Redisson源码剖析经典锁续命问题 6.Redis主从架构锁失效如何解决 7.Redlock分布式锁高并发下可能存在的问题 8.双十一大促如何将…

alfred自定义谷歌翻译workflow

如果要实现自定义workflow&#xff0c;则必须安装付费版的alfred&#xff0c;囊中羞涩的话可以自行淘宝。自定义步骤如下&#xff1a; 1. 新建空的workflow&#xff0c;填写基本信息 2. 开发python脚本 打开该workflow所在目录&#xff0c;进行下面步骤&#xff1a; 首先安装…

OpenCV第 1 课 计算机视觉和 OpenCV 介绍

文章目录 第 1 课 计算机视觉和 OpenCV 介绍1.机器是如何“看”的2.机器视觉技术的常见应用3.图像识别介绍4. 图像识别技术的常见应用5.OpenCV 介绍6.图像在计算机中的存储形式 第 1 课 计算机视觉和 OpenCV 介绍 1.机器是如何“看”的 我们人类可以通过眼睛看到五颜六色的世界…

openssl3.2/test/certs - 010 - 768-bit key

文章目录 openssl3.2/test/certs - 010 - 768-bit key概述笔记END openssl3.2/test/certs - 010 - 768-bit key 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 // \file my_openssl_linux_log_doc_010.txt // \note openssl3.2/test/certs - 010 - 768-bit key // …

一文(10图)了解Cornerstone3D核心概念(万字总结附导图)

Cornerstone3D介绍 Cornerstone3D是一个专门为处理三维医学影像而设计的JavaScript库。 它是Cornerstone项目的一部分&#xff0c;旨在为医学影像社区提供高性能、可扩展且易于使用的开源Web工具&#xff0c;专注于提供交互式的3D医学图像浏览体验&#xff0c;适用于多种医学…

9款最新文生图模型汇总!含华为、谷歌、Stability AI等大厂创新模型(附论文和代码)

2023年真是文生图大放异彩的一年&#xff0c;给数字艺术界和创意圈注入了新鲜血液。从起初的基础图像创作跃进到现在的超逼真效果&#xff0c;这些先进的模型彻底变革了我们制作和享受数字作品的途径。 最近&#xff0c;一些大公司比如华为、谷歌、还有Stability AI等人工智能巨…