建立标准编码规则(三)-CodeFixProvider 给代码分析器增加修复建议
给代码分析器增加修复建议
既然代码分析器,向代码编写者提出了错误或警告,那么有没有可能向代码编写者提交有效的改进建议?
相对于 DiagnosticAnalyzer,代码修复继承与 CodeFixProvider
CodeFixProvider,是基于DiagnosticAnalyzer,也就是说,必须给CodeFixProvider提供FixableDiagnosticIds。
1.增加继承CodeFixProvider的类RegexAnalyzerCodeFixProvider对我们刚才编写RegexAnalyzer进行代码修复提示
继承CodeFixProvider必须要实现
public abstract ImmutableArray<string> FixableDiagnosticIds { get; } //这里是对应的诊断代码ID
public virtual FixAllProvider GetFixAllProvider() //获取修复的方式 这里没搞明白
public abstract Task RegisterCodeFixesAsync(CodeFixContext context)//注册到方法中
2 编写业务代码
/// <summary>
/// 修复代码
/// 1 获取语义模型
/// 2 找到正值表达式
/// 3 给出正确的表达式
/// 4 返回语法树新节点document
/// </summary>
/// <param name="document"></param>
/// <param name="invocationExpr"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
private async Task<Document> FixRegexAsync(Document document,InvocationExpressionSyntax invocationExpr,CancellationToken cancellationToken)
{
var sementicModel = await document.GetSemanticModelAsync(cancellationToken);
var memberAccessExpr = invocationExpr.Expression as MemberAccessExpressionSyntax;
var memberSymbol = sementicModel.GetSymbolInfo(memberAccessExpr).Symbol as IMethodSymbol;
var argumentList = invocationExpr.ArgumentList as ArgumentListSyntax;
var regexLiteral =
argumentList.Arguments[].Expression as LiteralExpressionSyntax;
var regexOpt = sementicModel.GetConstantValue(regexLiteral);
var regx = regexOpt.Value as string;
var newLiteral = SyntaxFactory.ParseExpression("\"valid regex\"")
.WithLeadingTrivia(regexLiteral.GetLeadingTrivia())
.WithTrailingTrivia(regexLiteral.GetTrailingTrivia())
.WithAdditionalAnnotations(Formatter.Annotation);
var root = await document.GetSyntaxRootAsync();
var newroot = root.ReplaceNode(regexLiteral, newLiteral);
var newDocument = document.WithSyntaxRoot(newroot);
return newDocument;
}
实际效果如下:类似我们重命名


总结:
至此,我们知道,编写标准的代码规则步骤很容易,核心的部分是要写个我们定义的规则。
1 基于Roslyn模板新建代码分析器项目
2 编写诊断代码
3 编写修复代码
建立标准编码规则(三)-CodeFixProvider 给代码分析器增加修复建议的更多相关文章
- 建立标准编码规则(一)-自定义C#代码分析器
1.下载Roslyn的Visual Studio分析器模板插件(VS2015 或VS2017) https://marketplace.visualstudio.com/items?itemName= ...
- 建立标准编码规则(四)-C#编码规范分类及实现
1 现实中的问题 在任何一个公司,每个程序员编写的习惯可能都是不一样的,大到命名空间,小到变量的名字.甚至,我们去github,里面的大牛每个开源的项目的命名规则可能都不一样. 我们通常会遇到下面的问 ...
- 建立标准编码规则(二)-DiagnosticAnalyzer 增加诊断分析代码
1.使用语法树 当我们要编写一个规则,例如 检测正值表达式的时候,如何编写有效的规则呢 Regex.Match("my text", @"\pXXX"); 这里 ...
- Device Tree(三):代码分析【转】
转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...
- Device Tree(三):代码分析
一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因) 2.Device Tree的基础概 ...
- 【转】Device Tree(三):代码分析
原文网址:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入De ...
- UTF-8编码规则(转)
from:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html UTF-8是Unicode的一种实现方式,也就是它的字节 ...
- UTF-8编码规则
UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所 ...
- Javascript编码规范,好的代码从书写规范开始,增强代码的可读性,可维护性,这是相当重要的!
1. 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对JavaScript设 ...
随机推荐
- docker学习系列(二):使用Dockerfile创建自己的镜像
dockerfile可以允许我们自己创建镜像,通过编写里面的下载软件命令,执行docker build 即可生成镜像文件. 初尝dockerfile 新建一个目录test,然后进入这个目录,创建一个名 ...
- 只知道ajax?你已经out了
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 随着前端技术的发展,请求服务器数据的方法早已不局限于ajax.jQuery的ajax方法.各种js库已如雨 ...
- JAVA 面试知识点
参考:https://www.cnblogs.com/java1024/p/8594784.html 反射: JAVA反射机制是在运行状态中, 对于任意一个类,都能够知道这个类的所有属性和方法: 对于 ...
- 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)
第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ...
- 按值传递 vs. 按指针传递
按值传递还是指针传递? 变量赋值有两种方式:按值传递.按"指针"传递(指针也常称为"引用").不同的编程语言赋值的方式不一样,例如Python是按"指 ...
- XtraBackup的备份原理与应用示例
一.XtraBackup简介与安装 XtraBackup是一款免费的在线开源数据库备份解决方案,适用于所有版本的MySQL和MariaDB.XtraBackup支持对InnoDB热备,是一款物理备份工 ...
- IDEA配置maven(配置阿里云中央仓库)
前言 idea配置maven后如果不修改中央仓库地址创建maven则出奇的慢,不管你用MyEclipse还是idea都慢的不要不要的,实在不能忍受. 这种条件下发现一个阿里云中央仓库来点福利,有福利了 ...
- MySQL学习(五) UNION与UNION ALL
UNION用于把来自许多SELECT语句的结果组合到一个结果集合中,也叫联合查询. SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | ...
- java_二进制的前导的零
题目内容: 计算机内部用二进制来表达所有的值.一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000.可以看到,从左边数过来,在第 ...
- 分布式日志框架之ExceptionLess【二】:自行搭建帮助文档【译文】
原文地址:https://github.com/exceptionless/Exceptionless/wiki/Self-Hosting ExceptionLess自行托管环境搭建 一.测试环境 如 ...