2015-12-12 14 views
0

在编写分析器时,我该如何处理会影响我的CodeFix的多个错误。例如,我想要表达式的类型,但表达式具有未声明的函数,因此它的类型是表达为“?”的错误。在使用Roslyn的CodeFix期间处理分析代码中的错误

如果我返回原始文档或者什么也没有Visual Studio仍提供CodeFix,但没有显示差异并显示代码分析器中的错误。

如果CodeFix有多个错误会导致CodeFix不起作用,CodeFix有没有提供方法?

Line with 2 Errors

回答

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