Roslyn:从基本块获取指令
Roslyn : get instructions from a basicblock
roslyn生成的控制流图以块(basicblock)为节点,每个basicblock包含一条或多条指令。对于包含多个指令的基本块,我尝试获取所有指令及其类型这就是我所做的:
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
但我想获得准确的指令,它的类型例如指令 x = y;
我想获得 AssignmentExpressionSyntax
。
我还想根据它的类型对每条指令执行一些操作。
由于您正在查看语法类型,因此 ExpressionStatement 是语句的正确类型。您可以通过查看 ExpressionStatement 中表达式的种类来找到表达式的种类。
if (operation.Syntax is ExpressionStatement es)
{
var kind = es.Expression.Kind();
}
但是,如果您正在使用操作 (IOperation),那么您可能可以通过跳过语法并使用 OperationKind 来获得更好的信息。
roslyn生成的控制流图以块(basicblock)为节点,每个basicblock包含一条或多条指令。对于包含多个指令的基本块,我尝试获取所有指令及其类型这就是我所做的:
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
但我想获得准确的指令,它的类型例如指令 x = y;
我想获得 AssignmentExpressionSyntax
。
我还想根据它的类型对每条指令执行一些操作。
由于您正在查看语法类型,因此 ExpressionStatement 是语句的正确类型。您可以通过查看 ExpressionStatement 中表达式的种类来找到表达式的种类。
if (operation.Syntax is ExpressionStatement es)
{
var kind = es.Expression.Kind();
}
但是,如果您正在使用操作 (IOperation),那么您可能可以通过跳过语法并使用 OperationKind 来获得更好的信息。