[英]Roslyn : get instructions from a basicblock
在roslyn中生成的控制流程圖包含塊(basicblock)作為節點,每個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;
的類型x = y;
我想獲得AssignmentExpressionSyntax
。 我也想根據它的類型對每條指令執行一些操作。
由於您正在查看語法類型,因此ExpressionStatement是該語句的正確類型。 您可以通過查看ExpressionStatement中的表達式種類來找到表達式的種類。
if (operation.Syntax is ExpressionStatement es)
{
var kind = es.Expression.Kind();
}
但是,如果您正在使用操作(IOperation),則可以通過跳過語法並使用OperationKind獲得更好的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.