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