Roslyn:从基本块获取说明

问题描述 投票:0回答:1

在roslyn中生成的控制流图包含作为节点的块(基本块),每个基本块包含一个或多个指令。对于包含多个指令的基本块,我尝试获取所有指令及其类型,这就是我所做的:

var cfg = ControlFlowGraph.Create(method);
foreach(var block in cfg.Blocks)
{
    foreach(var operation in block.Operations)
    {
        var syntax = operation.Syntax;
        Console.WriteLine(syntax.Kind());
    }
}

对于以下方法:

public int method(int x, int y)
{
y = 10;
x = y;
return x + y;
}

我得到了结果:

ExpressionStatement
ExpressionStatement

但我想得到exacte指令,它的类型为例如指令x = y;我想得到AssignmentExpressionSyntax。另外,我想根据它的类型在每条指令上执行一些操作。

c# roslyn roslyn-code-analysis control-flow-graph
1个回答
1
投票

由于您正在查看语法类型,因此ExpressionStatement是语句的正确类型。您可以通过查看ExpressionStatement中表达式的类型来查找表达式的类型。

if (operation.Syntax is ExpressionStatement es)
{
    var kind = es.Expression.Kind();
}

但是,如果您正在使用操作(IOperation),那么您可以通过跳过语法并使用OperationKind来获得更好的信息。

© www.soinside.com 2019 - 2024. All rights reserved.