建立標準編碼規則(三)-CodeFixProvider 給代碼分析器增加修復建議
阿新 • • 發佈:2017-11-22
.cn access 容易 編寫 color tco 效果 -s 我們
給代碼分析器增加修復建議
既然代碼分析器,向代碼編寫者提出了錯誤或警告,那麽有沒有可能向代碼編寫者提交有效的改進建議?
相對於 DiagnosticAnalyzer,代碼修復繼承與 CodeFixProvider
CodeFixProvider,是基於DiagnosticAnalyzer,也就是說,必須給CodeFixProvider提供FixableDiagnosticIds。
1.增加繼承CodeFixProvider的類RegexAnalyzerCodeFixProvider對我們剛才編寫RegexAnalyzer進行代碼修復提示
繼承CodeFixProvider必須要實現
publicabstract 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> privateasync 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 給代碼分析器增加修復建議