给代码分析器增加修复建议

既然代码分析器,向代码编写者提出了错误或警告,那么有没有可能向代码编写者提交有效的改进建议?

相对于 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 给代码分析器增加修复建议的更多相关文章

  1. 建立标准编码规则(一)-自定义C#代码分析器

    1.下载Roslyn的Visual Studio分析器模板插件(VS2015 或VS2017) https://marketplace.visualstudio.com/items?itemName= ...

  2. 建立标准编码规则(四)-C#编码规范分类及实现

    1 现实中的问题 在任何一个公司,每个程序员编写的习惯可能都是不一样的,大到命名空间,小到变量的名字.甚至,我们去github,里面的大牛每个开源的项目的命名规则可能都不一样. 我们通常会遇到下面的问 ...

  3. 建立标准编码规则(二)-DiagnosticAnalyzer 增加诊断分析代码

    1.使用语法树 当我们要编写一个规则,例如 检测正值表达式的时候,如何编写有效的规则呢 Regex.Match("my text", @"\pXXX"); 这里 ...

  4. Device Tree(三):代码分析【转】

    转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:201 ...

  5. Device Tree(三):代码分析

    一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因) 2.Device Tree的基础概 ...

  6. 【转】Device Tree(三):代码分析

    原文网址:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入De ...

  7. UTF-8编码规则(转)

    from:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html UTF-8是Unicode的一种实现方式,也就是它的字节 ...

  8. UTF-8编码规则

    UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所 ...

  9. Javascript编码规范,好的代码从书写规范开始,增强代码的可读性,可维护性,这是相当重要的!

    1. 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对JavaScript设 ...

随机推荐

  1. 四、windows下TortoiseGit的使用与操作

    使用 Git命令有时候确实不怎么方便,特别是每次都要输入密码,如果配置 SSH 的方式,又实在是很麻烦.(当然,必须使用 Windows 神器才有方便友好的客户端图形界面啦!!!) 关于 Tortoi ...

  2. Python机器学习笔记:深入理解Keras中序贯模型和函数模型

     先从sklearn说起吧,如果学习了sklearn的话,那么学习Keras相对来说比较容易.为什么这样说呢? 我们首先比较一下sklearn的机器学习大致使用流程和Keras的大致使用流程: skl ...

  3. 关于toggle事件委托的处理

    当html页面加载后,页面上需要再次动态加载的按钮等事件的绑定,我们有两种处理方案 一.再次加载后进行绑定 二.使用委托进行绑定 而toggle事件是无法直接绑定的,这时可以转化为click的事件,并 ...

  4. idea创建maven项目速度慢?别急,这有三种方案

    困扰 Intellij idea是一款非常强大的编辑器,可以很方便地帮我们创建maven项目,有用过的同学应该都深有体会,但我们经常会遇到一个困扰,那就是用idea创建maven项目时,速度很慢,往往 ...

  5. nginx重启服务

    修改完nginx配置后,需要使用 nginx -s reload使修改的配置生效,配置生效是平滑的,不会对访问产生任何影响reload后会启动新的进程接受新请求,对于未处理完的请求还是用老的配置,直到 ...

  6. 初学CSS-4-文字颜色属性

    { color : red ; color : rgb(255,0,0); (红,绿,蓝)值越大,越亮 color : rgba(255,0,0,1);   第四位数字:透明度(0~1),值越小越透明 ...

  7. TurboLinux系统管理习题一

    TurboLinux系统管理习题一 1. 使用vi编辑文本只读时,强制存盘并退出的命令是?(单选题)A :w!        B :q!       C   :wq!        D   :e!答案 ...

  8. python *args,**kwargs用法

    *args用于接受传入的值,无限制,但是不能接收key类型的,如c=2 def fun(*args): for i in args: print(i) print("test") ...

  9. 《Inside C#》笔记(十一) 运算符重载

    运算符重载与之前的索引器类似,目的是为了让语言本身使用起来更方便直接,也是一种语法糖. 一 运算符重载(Operator Overloading) 运算符重载的存在,使得现有的各种运算符可以被重新定义 ...

  10. flask day01

    目标:搭建好一个flask架构,并且可以运行起来,能够访问 ## 一丶配置环境 比较简单,只需要配一个flask pip3 install flask #也可以使用pip install flask ...