建立标准编码规则(三)-CodeFixProvider 给代码分析器增加修复建议
2024-08-31 03:18:35
给代码分析器增加修复建议
既然代码分析器,向代码编写者提出了错误或警告,那么有没有可能向代码编写者提交有效的改进建议?
相对于 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 编写修复代码
最新文章
- LinQ 组合查询与分页
- AC日记——大整数的因子 openjudge 1.6 13
- linux下好用的软件
- golang time and duration
- js原生选项卡(包含移动端无缝选项卡)三
- OC基础(5)
- C常用字符字符串处理函数
- 根据IP地址查询所在地
- windows2003网络负载平衡设置
- 【转】 Linux/Unix 进程间通信的各种方式及其比较
- hdu 1022
- c# 大批量用户访问数据库报错
- shell 脚本加密
- alert大法看执行流程(一次采坑)
- sip 注册流程
- 自学Zabbix13.1 分布式监控proxy介绍
- NFS无法启动解决方式
- React Native - FlexBox弹性盒模型
- Linux下solr集群搭建
- 使用Apache Bench对网站性能进行测试
热门文章
- 【PyTorch深度学习60分钟快速入门 】Part5:数据并行化
- 实验吧 貌似有点难 伪造ip
- #18 turtle模块
- 线段树(segment tree)
- js------保留指定位数小数
- EF select 匿名类 问题
- elasticsearch6.7 05. Document APIs(1)data replication model
- Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
- 关于Ajax的get与post浅分析,同步请求与异步请求,跨域请求;
- 【工具相关】Web-将网站放在XAMPP上面