Пример #1
0
        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);
        }
Пример #2
0
        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);
        }