1. 程式人生 > >建立標準編碼規則(三)-CodeFixProvider 給代碼分析器增加修復建議

建立標準編碼規則(三)-CodeFixProvider 給代碼分析器增加修復建議

.cn access 容易 編寫 color tco 效果 -s 我們

給代碼分析器增加修復建議

既然代碼分析器,向代碼編寫者提出了錯誤或警告,那麽有沒有可能向代碼編寫者提交有效的改進建議?

相對於 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 給代碼分析器增加修復建議