public static void RunExpressionTest(InstructionSpan instructions, Expression expectedExpression) { // Add a `pop` to the end to make it a full statement instructions = BuildSpan( instructions.First.Offset, Enumerable.Concat(instructions, new[] { Instruction.Create(OpCodes.Pop) })); var controlFlowGraph = ControlFlowGraphBuilder.Build(instructions.ToList(), Array.Empty <ExceptionHandler>()); var actualGraph = SyntaxGraphBuilder.Create(controlFlowGraph, new MethodVariables()); // Extract the expression Assert.Equal(1, actualGraph.Nodes.Count); var node = actualGraph.Nodes.First(); Assert.Equal(1, node.Statements.Count); var discardStatement = Assert.IsType <DiscardStatement>(node.Statements.Single()); Assert.Equal(expectedExpression, discardStatement.Value); }
private static async Task <int> Execute(string assemblyPath, string typeName, string memberName) { var disassembler = new DisassemblerSession(); var disassembly = await disassembler.LoadAsync(assemblyPath); var type = disassembly.FindType(typeName); if (type == null) { return(Error($"could not find type: {typeName}")); } var member = type.Members.FirstOrDefault(t => t.Name.Equals(memberName)); if (member == null) { return(Error($"could not find member: {memberName} in type {typeName}")); } ControlFlowGraph graph = null; MethodDefinition method = null; if (member.MemberType == MemberType.Method) { method = (MethodDefinition)member.Definition; graph = ControlFlowGraphBuilder.Build(method.Body); } else { return(Error($"Member type not supported: {member.MemberType}")); } var syntax = SyntaxGraphBuilder.Create(graph, method); var arguments = string.Join(", ", method.Parameters.Select(p => $"{p.ParameterType.FullName} {p.Name}")); Console.WriteLine($"Syntax analysis for {typeName}.{memberName}({arguments})"); if (method.Body.Variables.Any()) { Console.WriteLine(); foreach (var local in method.Body.Variables) { Console.WriteLine($" .local {local.VariableType.FullName} _{local.Index}"); } } foreach (var node in syntax.Nodes) { Console.WriteLine(); Console.WriteLine($" {node.DisplayName} : {{"); foreach (var statement in node.Statements) { Console.WriteLine($" {statement}"); } Console.WriteLine($" }}{FormatLinks(node)}"); } Console.WriteLine(); return(0); }