, как указано в комментариях, Roslyn DataFlowAnalysis
, вероятно, лучший инструмент для работы:
SyntaxTree tree = CSharpSyntaxTree.ParseText(
@"public class foo
{
private int field;
public void method()
{
field = 0;
}
}");
var compilation = CSharpCompilation.Create("test").AddSyntaxTrees(tree).AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location));
var model = compilation.GetSemanticModel(tree);
var methodDeclaration = tree.GetRoot().DescendantNodes().OfType<MethodDeclarationSyntax>().First();
var dataFlow = model.AnalyzeDataFlow(methodDeclaration.Body);
foreach (var symbol in dataFlow.DataFlowsIn)
{
Console.WriteLine(symbol.Name, symbol.Kind);
}
анализ для вашего конкретного примера дает ссылку на класс foo
через неявный this
, но не сам field
(что технически правильно, но не очень полезно). Предполагая, что ваш реальный код, вероятно, будет иметь немного больше зависимостей - вы можете увидеть лучшие результаты.