2015-12-10 40 views
1

我有一個基於默認分析儀模板的分析儀。 我的問題是,當做一個全重建,一些(但不是全部)警告出現在錯誤列表。roslyn分析儀提高後來被刪除的警告

當我打開這些文件時,隨着分析儀在打開的文件上重新執行,警告開始消失。 最終所有的警告消失

我是否註冊了這些分析儀不正確。理想情況下,我只希望它們在代碼模型正確加載後執行。

有關如何改善這一點的任何建議將是偉大的。

public override void Initialize(AnalysisContext context) 
    { 
     context.RegisterSyntaxNodeAction(
      this.HandleClassDeclaration, 
      SyntaxKind.ClassDeclaration); 
    } 

此代碼分析器對類聲明的文檔(本例中)。 它在Xml文檔節點不存在時報告診斷。

private void HandleClassDeclaration(SyntaxNodeAnalysisContext context) 
    { 
     // THE CHECK IN MY ANSWER BELOW GOES HERE... 
     var declaration = (ClassDeclarationSyntax)context.Node; 
     { 
      var hasDocumentation = declaration.HasDocumentation(); 
      if (!hasDocumentation) 
      { 
       var diagnostic = Diagnostic.Create(this.Descriptor, declaration.Identifier.GetLocation()); 
       context.ReportDiagnostic(diagnostic); 
      } 
     } 
    } 

我使用此代碼查找文檔。

public static DocumentationCommentTriviaSyntax GetDocumentationCommentTriviaSyntax(this SyntaxNode node) 
    { 
     if (node == null) 
     { 
      return null; 
     } 

     foreach (var leadingTrivia in node.GetLeadingTrivia()) 
     { 
      var structure = leadingTrivia.GetStructure() as DocumentationCommentTriviaSyntax; 

      if (structure != null) 
      { 
       return structure; 
      } 
     } 

     return null; 
    } 

回答

0

其他任何人試圖羅斯林分析文檔,這個小檢查需要

// <summary> 
    // check that the compiler is in a build mode that enables documentation analysis. 
    // it's not clear when this is off, but command line builds, and full rebuilds 
    // seem to have it turned off from time to time. 
    // </summary> 
    internal static bool IsDocumentationModeOn(this SyntaxNodeAnalysisContext context) 
    { 
     return context.Node.SyntaxTree?.Options.DocumentationMode 
       != DocumentationMode.None; 
    } 
+0

這反映了項目文件中的「生成XML文檔註釋」選項。保持傳統行爲,就是這樣的情況,如果你不生成一個我們不解析它們,因爲以前我們讓你擺脫那裏糟糕的語法。 –

+0

我注意到,儘管檢查這個選項後誤報的數量有所減少,但這種行爲仍然不是很正確。 我仍然有方案,如果我做了一個完整的重建,顯示虛假的警告。只要我打開文件,它們就會消失。 – Jim

1

你可以切換錯誤列表來建立唯一的視圖,看看警告是否仍然存在嗎?

如果警告仍然存在,那意味着警告是由命令行構建生成的。如果警告在您打開文檔後消失,那意味着實時分析認爲沒有問題。並且由於構建和實時分析之間的這種差異,這個問題可能會發生。

如果是這樣的話,那將是roslyn中的一個bug。 (更具體地說,實時分析和命令行構建之間的編譯選項中的錯誤 - VS內部的構建也是命令行構建,但具有稍微不同的選項)

+0

警告不再被誤報。 下面的檢查修復了其中的大部分。我認爲最後幾個是由於我的分析器/修復器中的ID不匹配導致的一個錯誤。 – Jim