Рослин: получить инструкции из базового блока - PullRequest
0 голосов
/ 19 марта 2019

Управляющий граф потока, сгенерированный в рослине, содержит блоки (базовый блок) в качестве узлов, каждый базовый блок содержит одну или несколько инструкций.для основных блоков, которые содержат более одной инструкции, я пытаюсь получить все инструкции и их типы, вот что я сделал:

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;
}

iполучить результат:

ExpressionStatement
ExpressionStatement

но я хочу получить инструкцию exacte и ее тип, например, для инструкции x = y; я хочу получить AssignmentExpressionSyntax.Также я хочу выполнить некоторые инструкции по каждой инструкции в зависимости от ее типа.

1 Ответ

1 голос
/ 03 апреля 2019

Так как вы смотрите на синтаксический вид, ExpressionStatement является правильным видом для оператора. Вы можете найти вид выражений, посмотрев на вид выражения в ExpressionStatement.

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

Однако, если вы используете операции (IOperation), вы, вероятно, можете получить более точную информацию, пропустив синтаксис и используя OperationKind.

...