使用Roslyn处理CodeFix期间分析代码中的错误

时间:2015-12-12 21:45:53

标签: vb.net roslyn

编写Analyzer时,如何处理会影响CodeFix的多个错误的行。例如,我想要一个Expression的类型,但Expression有未声明的函数,所以它的Type是一个表示为"和#34;的错误。

如果我返回原始文档或Nothing Visual Studio仍然提供CodeFix,但没有显示Diff,并且显示了代码分析器中的错误。

如果有多个错误导致CodeFix无法正常工作,是否有某种方法可以不提供CodeFix?

Line with 2 Errors

1 个答案:

答案 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