private IEnumerable <Instruction> CreateFunctionCall(string methodIdentifier, SyntaxNode syntaxNode,
                                                             UcfgExpression assignedTo, params UcfgExpression[] arguments)
        {
            if (syntaxNode is ObjectCreationExpressionSyntax)
            {
                throw new UcfgException("Expecting this method not to be called for nodes of type 'ObjectCreationExpressionSyntax'.");
            }

            if (arguments.Length == 0 &&
                methodIdentifier != UcfgBuiltInMethodId.EntryPoint)
            {
                throw new UcfgException($"Every UCFG expression  except {UcfgBuiltInMethodId.EntryPoint}  must have at least " +
                                        "one argument.  " +
                                        $"Identifier: {methodIdentifier},  " +
                                        $"File: {syntaxNode.GetLocation()?.GetLineSpan().Path ?? "{unknown}" }  " +
                                        $"Line: {syntaxNode.GetLocation()?.GetLineSpan().StartLinePosition}");
            }

            expressionService.Associate(syntaxNode, assignedTo);

            var instruction = new Instruction
            {
                Assigncall = new AssignCall
                {
                    Location = syntaxNode.GetUcfgLocation(),
                    MethodId = methodIdentifier
                }
            };

            IList <Instruction> newInstructions = new List <Instruction>();

            if (methodIdentifier == UcfgBuiltInMethodId.Identity)
            {
                instruction.Assigncall.Args.AddRange(arguments.Select(a => a.Expression));
            }
            else
            {
                var processedArgs = ProcessInstructionArguments(arguments, newInstructions);
                instruction.Assigncall.Args.AddRange(processedArgs);
            }

            assignedTo.ApplyAsTarget(instruction);
            newInstructions.Add(instruction);

            return(newInstructions);
        }
        private IEnumerable <Instruction> CreateNewArray(ArrayCreationExpressionSyntax syntaxNode,
                                                         IArrayTypeSymbol arrayTypeSymbol, UcfgExpression callTarget)
        {
            expressionService.Associate(syntaxNode, callTarget);

            var instruction = new Instruction
            {
                NewObject = new NewObject
                {
                    Location = syntaxNode.GetUcfgLocation(),
                    Type     = arrayTypeSymbol.ToDisplayString()
                }
            };

            callTarget.ApplyAsTarget(instruction);

            return(new[] { instruction });
        }
        private IEnumerable <Instruction> CreateNewObject(ObjectCreationExpressionSyntax syntaxNode,
                                                          IMethodSymbol ctorSymbol, UcfgExpression callTarget)
        {
            expressionService.Associate(syntaxNode, callTarget);

            var instruction = new Instruction
            {
                NewObject = new NewObject
                {
                    Location = syntaxNode.GetUcfgLocation(),
                    Type     = expressionService.CreateClassName(ctorSymbol.ContainingType).Expression.Classname.Classname
                }
            };

            callTarget.ApplyAsTarget(instruction);

            return(new[] { instruction });
        }