Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }