簡體   English   中英

使用Roslyn在CodeFix中處理分析代碼中的錯誤

[英]Dealing with Error in Analyized code during CodeFix using Roslyn

編寫分析器時,如何處理有多個錯誤的行,這會影響我的CodeFix。 例如,我想要表達式的類型,但是表達式具有未聲明的函數,因此其類型是表示為“?”的錯誤。

如果我退回原始文檔,或者Visual Studio仍未提供CodeFix,但沒有顯示差異,則顯示來自代碼分析器的錯誤。

如果有多個錯誤導致CodeFix無法正常工作,是否可以通過某種方式不提供CodeFix?

出現2個錯誤的行

我發現似乎需要在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM