编写Analyzer时,如何处理会影响CodeFix的多个错误的行。例如,我想要一个Expression的类型,但Expression有未声明的函数,所以它的Type是一个表示为"和#34;的错误。
如果我返回原始文档或Nothing Visual Studio仍然提供CodeFix,但没有显示Diff,并且显示了代码分析器中的错误。
如果有多个错误导致CodeFix无法正常工作,是否有某种方法可以不提供CodeFix?
答案 0 :(得分:0)
我发现它似乎需要在FixProvider中处理。我有所需的通用代码的开头。您似乎需要查看整个表达式中的错误,而不仅仅是问题的上下文。使用上下文,您可以找到要查找错误的整个表达式或行或块。将块中的每个错误与您要处理的错误进行比较。如果找到影响修复的修复程序,则可以在注册修复程序提供程序之前退出。我愿意学习更简单的方法,但下面的代码确实有效。它可以缩短,但为了清晰和调试,当我保持简单的线条时更容易。
Public NotOverridable Overrides ReadOnly Property FixableDiagnosticIds As ImmutableArray(Of String) = ImmutableArray.Create(DiagnosticId.ERR_StrictDisallowsImplicitProc.ToDiagnosticId, DiagnosticId.ERR_StrictDisallowImplicitObject.ToDiagnosticId, DiagnosticId.ERR_NameNotDeclared1.ToDiagnosticId)
Public NotOverridable Overrides Async Function RegisterCodeFixesAsync(context As CodeFixContext) As Task
Dim root As SyntaxNode = Await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(False)
Dim Model As SemanticModel = Await context.Document.GetSemanticModelAsync(context.CancellationToken)
Dim firstDiagnostic As Diagnostic = context.Diagnostics.First()
Dim diagnosticSpanStart As Integer = firstDiagnostic.Location.SourceSpan.Start
Dim declarationSyntax As SyntaxNode = root.FindToken(diagnosticSpanStart).Parent.FirstAncestorOrSelfOfType(GetType(VariableDeclaratorSyntax))
If declarationSyntax IsNot Nothing Then
For Each DiagnosticEntry As Diagnostic In Model.GetDiagnostics(declarationSyntax.Span)
' Does Diagnostic contain any of the errors I care about?
If FixableDiagnosticIds.Any(Function(m) m.ToString = DiagnosticEntry.Id.ToString) Then
Continue For
End If
Exit Function
Next