建立标准编码规则(三)-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[1].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 编写修复代码

 

转载于:https://www.cnblogs.com/fishpro/p/7875388.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值