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

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

相对于 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 编写修复代码

最新文章

  1. LinQ 组合查询与分页
  2. AC日记——大整数的因子 openjudge 1.6 13
  3. linux下好用的软件
  4. golang time and duration
  5. js原生选项卡(包含移动端无缝选项卡)三
  6. OC基础(5)
  7. C常用字符字符串处理函数
  8. 根据IP地址查询所在地
  9. windows2003网络负载平衡设置
  10. 【转】 Linux/Unix 进程间通信的各种方式及其比较
  11. hdu 1022
  12. c# 大批量用户访问数据库报错
  13. shell 脚本加密
  14. alert大法看执行流程(一次采坑)
  15. sip 注册流程
  16. 自学Zabbix13.1 分布式监控proxy介绍
  17. NFS无法启动解决方式
  18. React Native - FlexBox弹性盒模型
  19. Linux下solr集群搭建
  20. 使用Apache Bench对网站性能进行测试

热门文章

  1. 【PyTorch深度学习60分钟快速入门 】Part5:数据并行化
  2. 实验吧 貌似有点难 伪造ip
  3. #18 turtle模块
  4. 线段树(segment tree)
  5. js------保留指定位数小数
  6. EF select 匿名类 问题
  7. elasticsearch6.7 05. Document APIs(1)data replication model
  8. Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
  9. 关于Ajax的get与post浅分析,同步请求与异步请求,跨域请求;
  10. 【工具相关】Web-将网站放在XAMPP上面