public override IPStmt VisitFunCallStmt(PParser.FunCallStmtContext context) { string funName = context.fun.GetText(); IEnumerable <IPExpr> args = context.rvalueList()?.rvalue().Select(rv => exprVisitor.Visit(rv)) ?? Enumerable.Empty <IPExpr>(); List <IPExpr> argsList = args.ToList(); if (!table.Lookup(funName, out Function fun)) { throw handler.MissingDeclaration(context.fun, "function or function prototype", funName); } if (fun.Signature.Parameters.Count != argsList.Count) { throw handler.IncorrectArgumentCount((ParserRuleContext)context.rvalueList() ?? context, argsList.Count, fun.Signature.Parameters.Count); } foreach (Tuple <Variable, IPExpr> pair in fun.Signature.Parameters.Zip(argsList, Tuple.Create)) { TypeCheckingUtils.CheckArgument(handler, context, pair.Item1.Type, pair.Item2); } method.AddCallee(fun); return(new FunCallStmt(context, fun, argsList)); }
public override IPStmt VisitFunCallStmt(PParser.FunCallStmtContext context) { var funName = context.fun.GetText(); var argsList = TypeCheckingUtils.VisitRvalueList(context.rvalueList(), exprVisitor).ToList(); if (!table.Lookup(funName, out Function fun)) { throw handler.MissingDeclaration(context.fun, "function or function prototype", funName); } if (fun.Signature.Parameters.Count != argsList.Count) { throw handler.IncorrectArgumentCount((ParserRuleContext)context.rvalueList() ?? context, argsList.Count, fun.Signature.Parameters.Count); } foreach (var pair in fun.Signature.Parameters.Zip(argsList, Tuple.Create)) { TypeCheckingUtils.CheckArgument(handler, context, pair.Item1.Type, pair.Item2); } method.AddCallee(fun); return(new FunCallStmt(context, fun, argsList)); }