public void GetAllFieldAndMethodSymbolsInACompilation()
{
var tree = SyntaxTree.ParseText(@"
using System;
namespace NS1
{
public class C
{
int InstanceField = 0;
internal void InstanceMethod()
{
Console.WriteLine(InstanceField);
}
}
}
namespace NS2
{
static class ExtensionMethods
{
public static void ExtensionMethod(this NS1.C s)
{
}
}
}
class Program
{
static void Main()
{
NS1.C c = new NS1.C();
c.ToString();
}
}");
var mscorlib = MetadataReference.CreateAssemblyReference("mscorlib");
var compilation = Compilation.Create("MyCompilation",
syntaxTrees: new[] { tree }, references: new[] { mscorlib });
var results = new StringBuilder();
// Traverse the symbol tree to find all namespaces, types, methods and fields.
// foreach (NamespaceSymbol ns in compilation.GetReferencedAssemblySymbol(mscorlib).GlobalNamespace.GetNamespaceMembers())
foreach (NamespaceSymbol ns in compilation.Assembly.GlobalNamespace.GetNamespaceMembers())
{
results.AppendLine();
results.Append(ns.Kind);
results.Append(": ");
results.Append(ns.Name);
foreach (TypeSymbol type in ns.GetTypeMembers())
{
results.AppendLine();
results.Append(" ");
results.Append(type.TypeKind);
results.Append(": ");
results.Append(type.Name);
foreach (Symbol member in type.GetMembers())
{
results.AppendLine();
results.Append(" ");
if (member.Kind == SymbolKind.Field || member.Kind == SymbolKind.Method)
{
results.Append(member.Kind);
results.Append(": ");
results.Append(member.Name);
}
}
}
}
Assert.AreEqual(@"
Namespace: NS1
Class: C
Method: .ctor
Field: InstanceField
Method: InstanceMethod
Namespace: NS2
Class: ExtensionMethods
Method: ExtensionMethod", results.ToString());
}