Roslyn已解析没有工作区的语法树

时间:2016-01-01 19:03:52

标签: c# roslyn

我正在尝试使用Roslyn创建一个C#代码编辑器。我想获得一个已解析的语法树,以便我可以添加代码完成支持。

但是,我不能使用Workspaces,因为它们在iOS上被破坏了。

因此我试图使用Compilations直接命中C#编译器(这是对的吗?)。 API很简单,但我无法弄清楚如何获取类型的成员信息。

具体来说,我希望看到C类的Members属性,其中包含对完全声明的D类的引用。

但是,INamedTypeSymbol并未附加任何有用的信息。

如何从CSharpCompilation中获取丰富的类型信息?

var cst = Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseCompilationUnit (
    "public class C { public D foo; }");
var dst = Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseCompilationUnit (
    "public class D { public C bar; }");

var comp = Microsoft.CodeAnalysis.CSharp.CSharpCompilation.
    Create ("Poo").
    AddSyntaxTrees (cst.SyntaxTree).
    AddSyntaxTrees (dst.SyntaxTree);

var classC = comp.GetSymbolsWithName (n => n == "C").FirstOrDefault (); //= C
var classD = comp.GetSymbolsWithName (n => n == "D").FirstOrDefault (); //= D

var otherClassC = comp.GetTypeByMetadataName ("C"); //= C

Console.WriteLine ("C = " + classC);

1 个答案:

答案 0 :(得分:2)

您正在寻找GetMembers() method,它会返回该类型中所有已声明的成员。