2017-08-25 8 views
0

完全に使用するステートメントをチェックするコードアナライザを作成しようとしています。このリンクは非常に役に立ち、私の解決策(How can I get the fully qualified namespace from a using directive in Roslyn?)の根拠ですが、usingディレクティブのシンボルの場所にアクセスしようとすると問題が発生しています。私のコードは次のようになります。Roslynの完全修飾ネームスペースメタデータエラー

private static void AnalyzeModel(SemanticModelAnalysisContext semanticModelAnalysisContext) 
    { 
     var semanticModel = semanticModelAnalysisContext.SemanticModel; 
     var root = semanticModel.SyntaxTree.GetRoot(); 

     // compare each using statement's name with its fully qualified name 
     foreach (var usingDirective in root.DescendantNodes().OfType<UsingDirectiveSyntax>()) 
     { 
      var symbol = semanticModel.GetSymbolInfo(usingDirective.Name).Symbol; 
      var fullyQualifiedName = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); 

      if (fullyQualifiedName.Contains(GlobalTag)) 
      { 
       fullyQualifiedName = fullyQualifiedName.Substring(GlobalTag.Length); 
      } 

      if (usingDirective.Name.ToString() != fullyQualifiedName) 
      { 
       // for each name that is not fully qualified, produce a diagnostic. 
       var diagnostic = Diagnostic.Create(Rule, symbol.Locations[0], symbol.Name); 
       semanticModelAnalysisContext.ReportDiagnostic(diagnostic); 
      } 
     } 
    } 

問題は、メタデータのみでのアイテムではなく、ソース内の項目が含まれていsymbol.Locations[0]です。これは、次のエラーにつながる:私のユニットテストで

Assert.IsTrue failed. Test base does not currently handle diagnostics in metadata locations.

私のソースは次のようになります。

private const string incorrectSourceCode = @" namespace System { using IO; using Threading; }";

なぜ源であるsymbol.Locations内アイテムがありませんか?私はこの場所を得ることができる別の場所はありますか?私はsymbol.ContainingSymbol.Locations[0]またはsymbol.ContainingNamespace.Locations[0]を使ってみましたが、それは私が興味を持って使っているものを使用していることを指していません。私はこれを何時間もかけて引き出しています。

ありがとうございます!あなたがSourceLocationを見たい場合は、単に適切なSyntaxNodeからそれを取り出すよう

答えて

2

Symbolは、MetadateLocationが含まれています

var diagnostic = Diagnostic.Create(Rule, usingDirective.Name.GetLocation(), symbol.Name) 

代わりの

var diagnostic = Diagnostic.Create(Rule, symbol.Locations[0], symbol.Name) 
+0

このソリューションは魅力のように働きました。あなたの知識を共有してくれてありがとう、あなたは親切な魂です。 :) – CynicalPassion63

関連する問題