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