建立标准编码规则-CodeFixProvider 给代码分析器增加修复建议

Posted fishpro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建立标准编码规则-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 编写修复代码

 

以上是关于建立标准编码规则-CodeFixProvider 给代码分析器增加修复建议的主要内容,如果未能解决你的问题,请参考以下文章

建立标准编码规则-罗斯林语法工具 Roslyn Syntax Visualizer

ASN.1笔记——标准编码规则BER

条型码编码规则是怎样规定的?

lamp字符编码的转换规则

SD从零开始67-70 后勤信息系统中的标准分析, 信息结构, 信息的更新规则, 建立统计数据

银行卡编码规则及检验算法详解