2017-03-08 6 views
0

Roslyn을 사용하여 C# 코드를 구문 분석하고 코드에서 참조 된 모든 유형의 정규화 된 이름을 가져 오려고합니다. 나는 IdentifierNameSyntax에 도착하면,이 예제에서는구문 분석 된 소스 외부에서 선언 된 유형의 식별자에서 SymbolInfo 가져 오기

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