public override Symbol VisitFunctionCall([NotNull] FunctionCallContext context) { var identifier = context.IDENTIFIER().GetText(); var functionArguments = context.functionArguments(); var functionDefinition = callStack.ResolveFunction(identifier); var functionBody = functionDefinition.Body.statementBlock(); seleniumLogger.Log($"Calling function {identifier}", SeleniumScriptLogLevel.InterpreterDetails); Variable[] argumentVariables = null; if (functionDefinition.Parameters.Count > 0 && (context.functionArguments() == null || context.functionArguments().data().Length != functionDefinition.Parameters.Count)) { throw new SeleniumScriptVisitorException( $"Error calling function {identifier}, argument list does not match parameter definition\n" + $"Expecting: {string.Join(", ", functionDefinition.Parameters.Select(x => x.Value + " " + x.Key))}" ); } else if (functionDefinition.Parameters.Count > 0) { argumentVariables = functionArguments.Accept(this).AsArray.Select((x, i) => new Variable(functionDefinition.Parameters.ElementAt(i).Key, functionDefinition.Parameters.ElementAt(i).Value, x)).ToArray(); } callStack.Push(StackFrameScope.Method); if (argumentVariables != null) { foreach (var variable in argumentVariables) { callStack.Current.AddVariable(variable.Name, variable.ReturnType, variable.AsString); } } foreach (var statement in functionBody.statement()) { if (statement.functionReturn() != null) { var data = statement.functionReturn().data().Accept(this).Value; callStack.Pop(); return(new Symbol(string.Empty, functionDefinition.ReturnType, data)); } statement.Accept(this); } callStack.Pop(); return(null); }
public void VisitFunctionExpression(FunctionCallContext context) { var name = context.IDENTIFIER().GetText(); if (!Enum.TryParse(name, out RemoteFunction id)) { throw new Exception($"Could not find remote function with the name of {name}"); } var paramcount = 0; if (context.functionparam() != null) { foreach (var e in context.functionparam().expression()) { VisitExpression(e); builder.OutputOperation(Operation.OpPush); paramcount++; } } builder.OutputOperation(Operation.OpVal, paramcount); builder.OutputOperation(Operation.OpFunc, (int)id); }