2017-03-08 2 views
0

Roslynを使用してC#コードを解析したいと思います。コード内の参照されるすべての型の修飾名を取得したいと思います。解析されたソースの外で宣言された型の識別子からSymbolInfoを取得

言ってやる例えば、私はこのコードのスニペット解析したい:私はIdentifierNameSyntaxを取得する場合、この例では

SyntaxTree tree = CSharpSyntaxTree.ParseText(source); 

CSharpCompilation compilation = CSharpCompilation.Create("test", new[] { tree }); 
SemanticModel semanticModel = compilation.GetSemanticModel(tree, false); 

CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot(); 

IEnumerable<IdentifierNameSyntax> identifiers = root.DescendantNodes() 
    .Where(s => s is IdentifierNameSyntax) 
    .Cast<IdentifierNameSyntax>(); 

foreach (IdentifierNameSyntax i in identifiers) 
{ 
    SymbolInfo info = semanticModel.GetSymbolInfo(i); 

    if (info.Symbol == null) 
    { 
     Console.WriteLine("Unknown :("); 
    } 
    else 
    { 
     Console.WriteLine(info.Symbol.ContainingNamespace?.Name + "." + info.Symbol.ContainingType?.Name + "." + info.Symbol.Name); 
    } 
} 

:私は次のコードを使用し、それを解析するには

using System; 

namespace RoslynTest 
{ 
    public class Test 
    { 
     public static void Main() 
     { 
      String a = "Hello, World!"; 
      Console.WriteLine(a); 
     } 
    } 
} 

をそれは "String"を記述し、info.Symbolはnullになります。私はフルネームのSystem.Stringを知るためにいくつかの方法をお勧めします。

  • 解析されたソース外で宣言された型のIdentifierNameSyntaxからSymbolInfoを取得するにはどうすればよいですか?
  • usingステートメントからSemanticModelを構築する方法はありますか?
+0

'.OfType ()'を使い、 'info.Symbol.ToString()'を使います。 – SLaks

答えて

3

実際の問題は、Stringタイプがないことです。

SemanticModelのコンパイルエラーを見ると、そのエフェクトにエラーが表示されます。

Compilationにmscorlibへの参照を追加して、System.Stringが存在するようにする必要があります。 これを実行すると、info.Symbolはnullになりません。

+0

ありがとうございました、私は追加しました: 'MetadataReference reference = MetadataReference.CreateFromFile(typeof(string).Assembly.Location); ' これは私の例を解決します。すべてのusingステートメントからMetadataReferencesを作成する実用的な方法はありますか? – Findus

関連する問題