/// <summary>
        ///   Add the current function to the scope
        /// </summary>
        /// <param name = "astHelper"></param>
        public void AddToScope(AstHelper astHelper)
        {
            Name.CheckSemantics(astHelper);
            ReturnTypeName.CheckSemantics(astHelper);

            astHelper.Errors.Check(new SomeParametersWithTheSameNameError(Parameters, Start));

            foreach (FunctionParameterExpression functionParameterExpression in Parameters)
            {
                functionParameterExpression.CheckSemantics(astHelper);
            }

            Type[] argTypes     = Parameters.Select(param => param.Type).ToArray();
            Type   delegateType = ReturnTypeName.HasType
                                    ? MAst.GetFuncType(new List <Type>(argTypes)
            {
                Type
            }.ToArray())
                                    : MAst.GetActionType(argTypes);

            Pointer = MAst.Parameter(delegateType);

            bool error = false;

            error |= astHelper.Errors.Check(new MemberWithSameSignatureAlreadyDefinedError(
                                                Name.Name, argTypes, astHelper, Name.Start));
            error |= astHelper.Errors.Check(new VariableAlreadyDefinedError(Name.Name, astHelper, Start));

            if (!error)
            {
                astHelper.Functions.Add(Name.Name, new FunctionReference(Pointer, Type, argTypes));
            }
        }
예제 #2
0
    public string ToCodeFormat()
    {
        StringBuilder sbParams = new StringBuilder();

        foreach (var nativeParam in ParamList)
        {
            if (nativeParam == null)
            {
                continue;
            }

            if (sbParams.Length > 0)
            {
                sbParams.Append(", ");
            }

            sbParams.Append(String.Format("{0}", nativeParam.ParamTypeName));
        }

        var retString = String.Format("Function.Call(Hash.{0}", NativeName);

        if (sbParams.Length != 0)
        {
            retString = retString + ", " + sbParams + ");\n";
        }
        else
        {
            retString = retString + ");\n";
        }

        // If it returns a value
        if (ReturnTypeName != "void")
        {
            if (ReturnTypeName == "char*")
            {
                ReturnTypeName = "string";
            }
            else if (ReturnTypeName == "Any")
            {
                ReturnTypeName = "int";
            }
            else if (ReturnTypeName.ToLower() == "hash")
            {
                ReturnTypeName = "int";
            }
            else if (ReturnTypeName == "BOOL")
            {
                ReturnTypeName = "bool";
            }
            retString = retString.Replace(".Call(", string.Format(".Call<{0}>(", ReturnTypeName));
        }
        if (ReturnTypeName != "void")
        {
            retString = "return " + retString;
        }
        ;
        return(retString);
    }
예제 #3
0
        public EvalResult(ScriptState <object> state, string consoleOut, TimeSpan executionTime, TimeSpan compileTime)
        {
            if (state == null)
            {
                throw new ArgumentNullException(nameof(state));
            }

            ReturnValue = state.ReturnValue;
            var type = state.ReturnValue?.GetType();

            if (type?.GetTypeInfo().ImplementedInterfaces.Contains(typeof(IEnumerator)) ?? false)
            {
                var genericParams = type.GetGenericArguments();

                if (genericParams.Length == 2)
                {
                    type = typeof(List <>).MakeGenericType(genericParams[1]);

                    ReturnValue = Activator.CreateInstance(type, ReturnValue);
                }
            }

            ReturnTypeName = type?.Name;
            ExecutionTime  = executionTime;
            CompileTime    = compileTime;
            ConsoleOut     = consoleOut;
            Code           = state.Script.Code;
            Exception      = state.Exception?.Message;
            ExceptionType  = state.Exception?.GetType().Name;


            var genericArgs = type?.GetGenericArguments();

            if (genericArgs != null && genericArgs.Length > 0)
            {
                ReturnTypeName = ReturnTypeName.Replace($"`{genericArgs.Length}", $"<{string.Join(", ", genericArgs.Select(a => a.Name))}>");
            }
        }