Ejemplo n.º 1
0
        private static Evaluator Initialize(StringBuilder builder)
        {
            var settings  = new CompilerSettings();
            var writer    = new StringWriter(builder);
            var printer   = new StreamReportPrinter(writer);
            var context   = new CompilerContext(settings, printer);
            var evaluator = new Evaluator(context)
            {
                InteractiveBaseClass    = typeof(Interactive),
                DescribeTypeExpressions = true
            };

            evaluator.ReferenceAssembly(typeof(CSharpEvaluator).Assembly);
            foreach (var assembly in AssemblyLoader.NewAssemblies)
            {
                evaluator.ReferenceAssembly(assembly);
            }

            var nameSpaces = new[]
            {
                "System",
                "System.Linq",
                "System.Linq.Expressions",
                "System.Collections.Generic"
            }.Concat(InteractiveSection.Namespaces.Select(n => n.Namespace));

            foreach (var nameSpace in nameSpaces)
            {
                evaluator.Run(string.Format("using {0};", nameSpace));
            }
            return(evaluator);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// compile script
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public override bool Compile(string code)
        {
            IsCompiled = false;

            var sourceCode = GetScript(code);

            var compilerSettings = new CompilerSettings
            {
                GenerateDebugInfo = false,
                WarningsAreErrors = false,
                WarningLevel      = 0,
            };

            compilerSettings.AssemblyReferences.AddRange(new[]
            {
                "System.dll",
                "System.Core.dll",
            });

            var errSb = new StringBuilder();

            using (var writer = new StringWriter(errSb))
            {
                var streamReport = new StreamReportPrinter(writer);

                var ctx = new CompilerContext(compilerSettings, streamReport)
                {
                };

                _evaluator = new Evaluator(ctx);

                try
                {
                    var result = _evaluator.Compile(sourceCode);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }

                var errs = errSb.ToString();
                Errors = new List <string>();
                using (var reader = new StringReader(errs))
                {
                    var line = default(string);
                    while ((line = reader.ReadLine()) != null)
                    {
                        Errors.Add(line);
                    }
                }

                if (Errors.Count == 0)
                {
                    Type botFactoryType = (Type)_evaluator.Evaluate($"typeof({typeof(BotFactory).FullName});");
                    IsCompiled = CreateInstance(botFactoryType);
                }
            }

            return(IsCompiled);
        }
Ejemplo n.º 3
0
        private void initEvalEngine()
        {
            if (mEngine == null)
            {
                // Initialize the expression evaluator
                mEngineReport = new StringBuilder();
                var writer       = new StringWriter(mEngineReport);
                var printer      = new StreamReportPrinter(writer);
                var evalSettings = new CompilerSettings();
                evalSettings.AssemblyReferences.Add("Recomedia_de.Logic.VisuWeb.dll");
                var evalContext = new CompilerContext(evalSettings, new StreamReportPrinter(writer));
                mEngine = new Evaluator(evalContext);

                // Using supported namespaces
                mEngine.Run("using System;" + Environment.NewLine +
                            "using Recomedia_de.Logic.VisuWeb;");

                // Declare all variables we will ever use
                string declText = getVariableDecls();
                mEngine.Run(declText);

                // After we declared all needed variables is the time to get access to
                // them for later field updates
                const BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
                FieldInfo          fieldInfo    = typeof(Evaluator).GetField("fields", bindingFlags);
                mFields = fieldInfo.GetValue(mEngine) as FieldDictionary;

                // Start with nulled compiled expressions (lazy-init in Execute)
                mCompiled = new List <CompiledMethod>(
                    Enumerable.Repeat <CompiledMethod>(null, mOutputs.Count));
            }
        }
Ejemplo n.º 4
0
        static int Main(string [] args)
        {
            var cmd = new CommandLineParser(Console.Out);

            cmd.UnknownOptionHandler += HandleExtraArguments;

            var settings = cmd.ParseArguments(args);

            if (settings == null)
            {
                return(1);
            }
            var startup_files = new string [settings.SourceFiles.Count];
            int i             = 0;

            foreach (var source in settings.SourceFiles)
            {
                startup_files [i++] = source.FullPathName;
            }
            settings.SourceFiles.Clear();

            TextWriter    agent_stderr = null;
            ReportPrinter printer;

            if (agent != null)
            {
                agent_stderr = new StringWriter();
                printer      = new StreamReportPrinter(agent_stderr);
            }
            else
            {
                printer = new ConsoleReportPrinter();
            }

            var eval = new Evaluator(new CompilerContext(settings, printer));

            eval.InteractiveBaseClass    = typeof(InteractiveBaseShell);
            eval.DescribeTypeExpressions = true;

            CSharpShell shell;

#if !ON_DOTNET
            if (attach.HasValue)
            {
                shell = new ClientCSharpShell(eval, attach.Value);
            }
            else if (agent != null)
            {
                new CSharpAgent(eval, agent, agent_stderr).Run(startup_files);
                return(0);
            }
            else
#endif
            {
                shell = new CSharpShell(eval);
            }
            return(shell.Run(startup_files));
        }
Ejemplo n.º 5
0
        public void Setup()
        {
            var builder  = new StringBuilder();
            var writer   = new StringWriter(builder);
            var printer  = new StreamReportPrinter(writer);
            var settings = new CompilerSettings();

            settings.AssemblyReferences.Add("DbTool.Testing");
            var context = new CompilerContext(settings, printer);

            _evaluator = new Evaluator(context);
        }
Ejemplo n.º 6
0
    public static MonoScript New(TextWriter rw, Type ib, string tmp = null)
    {
        var reporter = new StreamReportPrinter(rw);
        var ms       = new MonoScript(BuildContext(reporter));

        ms.reporter = reporter;
        ms.tw       = rw;
        ms.tempdir  = tmp;
        ms.ImportAssemblies(ms.ReferenceAssembly);
        AppDomain.CurrentDomain.AssemblyLoad += ms.asmLoaded;
        return(ms);
    }
Ejemplo n.º 7
0
        static void Main(string[] args)
        {
            var _stringBuilder = new StringBuilder();
            var _writer        = new StringWriter(_stringBuilder);
            var settings       = new CompilerSettings();
            var printer        = new StreamReportPrinter(_writer);
            var context        = new CompilerContext(settings, printer);
            var evaluator      = new Evaluator(context);

            evaluator.ReferenceAssembly(Assembly.GetExecutingAssembly());

            var input = "";

            while (input != "exit")
            {
                Console.Write(">");
                input = Console.ReadLine();

                if (input.EndsWith(";"))
                {
                    var result = evaluator.Run(input);
                    if (printer.ErrorsCount > 0 || printer.WarningsCount > 0)
                    {
                        Console.WriteLine(_stringBuilder);
                        _stringBuilder.Clear();
                    }
                    else
                    {
                        Console.WriteLine(result);
                    }
                }
                else
                {
                    object result;
                    bool   result_set;
                    var    ret = evaluator.Evaluate(input, out result, out result_set);
                    if (printer.ErrorsCount > 0 || printer.WarningsCount > 0)
                    {
                        Console.WriteLine(_stringBuilder);
                        _stringBuilder.Clear();
                    }
                    else if (result != null)
                    {
                        Console.WriteLine(result);
                    }
                }
            }
        }
Ejemplo n.º 8
0
        private static CompilerContext BuildContext(TextWriter tw)
        {
            var reporter = new StreamReportPrinter(tw);

            var settings = new CompilerSettings
            {
                Version           = LanguageVersion.Experimental,
                GenerateDebugInfo = false,
                StdLib            = true,
                Target            = Target.Library,
                WarningLevel      = 0,
                EnhancedWarnings  = false
            };

            return(new CompilerContext(settings, reporter));
        }
Ejemplo n.º 9
0
    public UCCE()
    {
        _stringBuilder = new StringBuilder();
        TextWriter       _writer  = new StringWriter(_stringBuilder);
        CompilerSettings settings = new CompilerSettings();

        settings.LoadDefaultReferences = false;
        settings.StdLib = false;
        ReportPrinter   printer = new StreamReportPrinter(_writer);
        CompilerContext ctx     = new CompilerContext(settings, printer);

        _evaluator = new Evaluator(ctx);

        InitEvaluator();
        RegisterTypes(BuiltInTypes);
        RegisterTypes(AdditionalTypes);
    }
Ejemplo n.º 10
0
        public void Init()
        {
            var printer  = new StreamReportPrinter(_stringWriter);
            var settings = new CompilerSettings();

            settings.AssemblyReferences.AddRange(InitialAssemblies);
            var report = new Report(printer);

            _evaluator = new Evaluator(settings, report)
            {
                InteractiveBaseClass    = typeof(CodeGeneratorInteractive),
                DescribeTypeExpressions = true,
            };

            TryUsing(InitialUsings);
            CodeGeneratorInteractive.Evaluator = _evaluator;
            CodeGeneratorInteractive.Output    = _stringWriter;
        }
Ejemplo n.º 11
0
        public void Init()
        {
            var printer  = new StreamReportPrinter(_stringWriter);
            var settings = new CompilerSettings();

            settings.AssemblyReferences.AddRange(InitialAssemblies);
            var context = new CompilerContext(settings, printer);

            _evaluator = new Evaluator(context)
            {
                InteractiveBaseClass    = typeof(DbToolInteractive),
                DescribeTypeExpressions = true,
            };

            ReferenceAssemblies(typeof(DynamicSqlQuery).Assembly);

            TryUsing(InitialUsings);
            DbToolInteractive.Evaluator = _evaluator;
            DbToolInteractive.Output    = _stringWriter;
        }
Ejemplo n.º 12
0
        public MonoCSharpExecutor()
        {
            _reportBuilder = new StringBuilder();
            var writer   = new StringWriter(_reportBuilder);
            var printer  = new StreamReportPrinter(writer);
            var settings = new CompilerSettings();

            var context = new CompilerContext(settings, printer);

            _evaluator = new Evaluator(context);
            _evaluator.InteractiveBaseClass = typeof(InteractiveStuff);
            _evaluator.ReferenceAssembly(typeof(HttpContext).Assembly);
            _evaluator.ReferenceAssembly(typeof(VisualFarmRepo).Assembly);
            _evaluator.ReferenceAssembly(typeof(BondegardFacade).Assembly);
            _evaluator.ReferenceAssembly(typeof(IVFSConfig).Assembly);
            Execute("using System;");
            Execute("using System.Linq;");
            Execute("using System.Web;");
            Execute("using VisualFarmStudio.Core.Domain;");
            Execute("using VisualFarmStudio.Core.Repository;");
            Execute("using VisualFarmStudio.Lib.Model;");
            Execute("using VisualFarmStudio.Lib.Containers;");
        }
Ejemplo n.º 13
0
        void Start()
        {
            try {
                if (GetComponent <SceneViewerFlag>() == null)
                {
                    gameObject.AddComponent <SceneViewerFlag>();
                }

                if (GetComponent <RectTransform>() == null)
                {
                    gameObject.AddComponent <RectTransform>();
                }

                gameObject.AddComponent <Image>().color = new Color(0.7f, 0.7f, 0.7f, 0.3f);

                var thisR = GetComponent <RectTransform>();
                thisR.anchorMin        = new Vector2(0.5f, 0);
                thisR.anchorMax        = new Vector2(0.5f, 0);
                thisR.pivot            = new Vector2(0.5f, 0);
                thisR.anchoredPosition = Vector2.zero;
                thisR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);
                thisR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Screen.height - 100);

                var codeInput = new GameObject("CodeInput");
                codeInput.AddComponent <SceneViewerFlag>();
                codeInput.transform.SetParent(transform);
                codeInput.AddComponent <Image>().color = Color.white;
                var codeInputR = codeInput.GetComponent <RectTransform>();
                codeInputR.anchorMin        = Vector2.zero;
                codeInputR.anchorMax        = Vector2.right;
                codeInputR.pivot            = new Vector2(0.5f, 0);
                codeInputR.anchoredPosition = Vector2.zero;
                codeInputR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);
                codeInputR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, ViewerCreater.size);
                var codeInputText = new GameObject("Text");
                codeInputText.transform.SetParent(codeInput.transform);
                var codeInputTextT = codeInputText.AddComponent <Text>();
                codeInputTextT.font     = ViewerCreater.font;
                codeInputTextT.fontSize = ViewerCreater.fontSize;
                codeInputTextT.color    = Color.black;
                var codeInputTextR = codeInputText.GetComponent <RectTransform>();
                codeInputTextR.anchorMin = Vector2.zero;
                codeInputTextR.anchorMax = Vector2.one;
                codeInputTextR.pivot     = new Vector2(0.5f, 0.5f);
                codeInputTextR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width - 10);
                codeInputTextR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, ViewerCreater.size - 10);
                codeInputTextR.anchoredPosition = Vector2.zero;

                var output = new GameObject("Output");
                output.transform.parent = transform;
                var outputS = output.AddComponent <ScrollRect>();
                var outputR = output.GetComponent <RectTransform>();
                outputR.anchorMin        = Vector2.up;
                outputR.anchorMax        = Vector2.one;
                outputR.pivot            = new Vector2(0.5f, 1);
                outputR.anchoredPosition = new Vector2(0, -10);
                outputR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);
                outputR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Screen.height - ViewerCreater.size - 120);
                var viewport = new GameObject("Viewport");
                viewport.transform.parent = output.transform;
                viewportR                  = viewport.AddComponent <RectTransform>();
                viewportR.anchorMin        = Vector2.zero;
                viewportR.anchorMax        = Vector2.one;
                viewportR.pivot            = new Vector2(0, 1);
                viewportR.anchoredPosition = Vector2.zero;
                viewportR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);
                viewportR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Screen.height - ViewerCreater.size - 120);
                viewport.AddComponent <Mask>();
                viewport.AddComponent <Image>().color = Color.white;
                var outputText = new GameObject("OutputText");
                outputText.transform.parent = viewport.transform;
                outputT                   = outputText.AddComponent <Text>();
                outputT.font              = ViewerCreater.font;
                outputT.fontSize          = ViewerCreater.fontSize;
                outputT.color             = Color.black;
                outputT.text              = "Output";
                outputTR                  = outputText.GetComponent <RectTransform>();
                outputTR                  = outputT.rectTransform;
                outputTR.anchorMin        = new Vector2(0.5f, 1);
                outputTR.anchorMax        = new Vector2(0.5f, 1);
                outputTR.pivot            = new Vector2(0.5f, 1);
                outputTR.anchoredPosition = new Vector2(5, -5);
                outputTR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width - 10);
                outputT.gameObject.AddComponent <ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
                outputS.content          = outputTR;
                outputS.movementType     = ScrollRect.MovementType.Clamped;
                outputS.decelerationRate = 0.5f;
                outputS.viewport         = viewportR;

                codeInputTextT.supportRichText = false;
                codeInputI = codeInput.AddComponent <InputField>();
                codeInputI.textComponent = codeInputTextT;

                var type     = typeof(Debug);
                var s_Logger = type.GetField("s_Logger", BindingFlags.NonPublic | BindingFlags.Static);
                s_Logger.SetValue(type, new InGameLogger(Debug.unityLogger.logHandler));
                InGameLogger.Logging = log => {
                    switch (log.logType)
                    {
                    case LogType.Error:
                        WriteLine($"<color=#ee0000ff>UnityError:\n{log.message}</color>");
                        break;

                    case LogType.Assert:
                        WriteLine($"<color=#ee0000ff>UnityAssert:\n{log.message}</color>");
                        break;

                    case LogType.Warning:
                        WriteLine($"<color=#55dd00ff>UnityWarning:\n{log.message}</color>");
                        break;

                    case LogType.Log:
                        WriteLine($"<color=#aaaaaaff>UnityLog:\n{log.message}</color>");
                        break;

                    case LogType.Exception:
                        WriteLine($"<color=#ee0000ff>UnityException:\n{log.message}</color>");
                        break;

                    default:
                        break;
                    }
                };

                var writer          = new StringWriter();
                var printer         = new StreamReportPrinter(writer);
                var compilerContext = new CompilerContext(new CompilerSettings(), printer);
                evaluator = new Evaluator(compilerContext);
                evaluator.ReferenceAssembly(Assembly.Load("UnityEngine.CoreModule"));
                evaluator.ReferenceAssembly(Assembly.Load("UnityEngine.UI"));
                evaluator.Run("using System;using UnityEngine;using UnityEngine.UI;using UnityEngine.Events;using System.Reflection;using System.Collections;using System.Collections.Generic;");
                codeInputI.onEndEdit.AddListener(new UnityAction <string>(str => {
                    if (str == "")
                    {
                        return;
                    }
                    try {
                        var method = evaluator.Compile(str);
                        writer.Flush();
                        var builder = writer.GetStringBuilder();
                        var s       = builder.ToString();
                        builder.Clear();
                        if (printer.ErrorsCount > 0)
                        {
                            WriteLine($"{str}\n<color=#ff0000ff>{s}</color>");
                            return;
                        }
                        object result = null;
                        method.Invoke(ref result);
                        if (result == null)
                        {
                            result = "Done";
                        }
                        WriteLine($"{str}\n<color=#00aa00ff>{result}</color>");
                    } catch (Exception e) {
                        WriteLine($"{str}\n<color=#ff0000ff>{e.Message}</color>");
                    }
                }));
            } catch (Exception e) {
                Utils.LogError(e.ToString(), "Error in InGameConsole Start");
            }
        }
Ejemplo n.º 14
0
        void Compile()
        {
            if (m_Xt_Del == null && m_X__Del == null)
            {
                using (var err = new StringWriter()) {
                    var Settings = new CompilerSettings();
#if DEBUG
                    Settings.Optimize = false;
#else
                    Settings.Optimize = false;
#endif
                    var Printer = new StreamReportPrinter(err);


                    CompilerContext cmpCont = new CompilerContext(Settings, Printer);


                    Evaluator eval = new Evaluator(cmpCont);
                    eval.InteractiveBaseClass = typeof(Object);

                    Assembly[] allAssis = BoSSS.Solution.Application.GetAllAssemblies().ToArray();

                    foreach (var assi in allAssis)
                    {
                        eval.ReferenceAssembly(assi);
                    }

                    eval.Compile(@"
                                using System;
                                using System.Collections.Generic;
                                using System.Linq;
                                using ilPSP;
                                using ilPSP.Utils;
                                using BoSSS.Platform;
                                using BoSSS.Platform.Utils;
                                using BoSSS.Foundation;
                                using BoSSS.Foundation.Grid;
                                using BoSSS.Foundation.IO;
                                using BoSSS.Solution;
                                using BoSSS.Solution.Utils;
                      ");

                    if (!m_AdditionalPrefixCode.IsEmptyOrWhite())
                    {
                        try {
                            object figdi;
                            bool   dummy;
                            eval.Evaluate(m_AdditionalPrefixCode, out figdi, out dummy);
                        } catch (Exception e) {
                            throw new AggregateException(e.GetType().Name + " during the interpretation of code snippet '"
                                                         + m_AdditionalPrefixCode + "'" + err.NewLine + "Error(s): " + err.NewLine + err.ToString(),
                                                         e);
                        }
                    }

                    object formula;
                    {
                        try {
                            string Prefix = m_TimeDep ? "Func<double[], double, double>" : "Func<double[], double>";
                            Prefix = Prefix + " myfunc = ";
                            object result;
                            bool   result_set;
                            string ans = eval.Evaluate(Prefix + m_Code + ";", out result, out result_set);
                            formula = eval.Evaluate("myfunc;");
                        } catch (Exception e) {
                            throw new AggregateException(e.GetType().Name + " during the interpretation of code snippet '"
                                                         + m_Code + "'" + err.NewLine + "Error(s): " + err.NewLine + err.ToString(),
                                                         e);
                        }
                    }

                    if (formula != null && cmpCont.Report.Errors == 0)
                    {
                        if (formula is Func <double[], double, double> )
                        {
                            m_Xt_Del = (Func <double[], double, double>)formula;
                            return;
                        }

                        if (formula is Func <double[], double> )
                        {
                            m_X__Del = (Func <double[], double>)formula;
                            return;
                        }

                        throw new ArgumentException("Unable to cast result of code snippet '" + m_Code + " to a valid expression (Func<double[],double,double> or Func<double[],double>)." + err.NewLine + "Error(s): " + err.NewLine + err.ToString());
                    }
                }
            }
        }
Ejemplo n.º 15
0
        static int Main(string [] args)
        {
            if (!SplitDriverAndScriptArguments(ref args, out script_args))
            {
                return(1);
            }

            var cmd = new CommandLineParser(Console.Out);

            cmd.UnknownOptionHandler += HandleExtraArguments;

            // Enable unsafe code by default
            var settings = new CompilerSettings()
            {
                Unsafe = true
            };

            if (!cmd.ParseArguments(settings, args))
            {
                return(1);
            }

            var startup_files = new string [settings.SourceFiles.Count];
            int i             = 0;

            foreach (var source in settings.SourceFiles)
            {
                startup_files [i++] = source.OriginalFullPathName;
            }
            settings.SourceFiles.Clear();

            TextWriter    agent_stderr = null;
            ReportPrinter printer;

            if (agent != null)
            {
                agent_stderr = new StringWriter();
                printer      = new StreamReportPrinter(agent_stderr);
            }
            else
            {
                printer = new ConsoleReportPrinter();
            }

            var eval = new Evaluator(new CompilerContext(settings, printer));

            eval.InteractiveBaseClass    = typeof(InteractiveBaseShell);
            eval.DescribeTypeExpressions = true;
            eval.WaitOnTask = true;

            CSharpShell shell;

#if !ON_DOTNET
            if (attach.HasValue)
            {
                shell = new ClientCSharpShell_v1(eval, attach.Value);
            }
            else if (agent != null)
            {
                new CSharpAgent(eval, agent, agent_stderr).Run(startup_files);
                return(0);
            }
            else
#endif
            if (target_host != null)
            {
                shell = new ClientCSharpShell(eval, target_host, target_port);
            }
            else
            {
                shell = new CSharpShell(eval);
            }

            return(shell.Run(startup_files));
        }
Ejemplo n.º 16
0
        private void Awake()
        {
            try {
                Instance = this;

                if (GetComponent <SceneViewerFlag>() == null)
                {
                    gameObject.AddComponent <SceneViewerFlag>();
                }

                if (GetComponent <RectTransform>() == null)
                {
                    gameObject.AddComponent <RectTransform>();
                }

                var color = new Color(0.7f, 0.7f, 0.7f, 0.3f);
                gameObject.AddComponent <Image>().color = color;

                var thisR = GetComponent <RectTransform>();
                thisR.anchorMin        = new Vector2(0.5f, 0);
                thisR.anchorMax        = new Vector2(0.5f, 0);
                thisR.pivot            = new Vector2(0.5f, 0);
                thisR.anchoredPosition = Vector2.zero;
                thisR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);
                thisR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Screen.height - 100);

                var codeInput = new GameObject("CodeInput");
                codeInput.AddComponent <SceneViewerFlag>();
                codeInput.transform.SetParent(transform);
                codeInput.AddComponent <Image>().color = color;
                var codeInputR = codeInput.GetComponent <RectTransform>();
                codeInputR.anchorMin        = Vector2.zero;
                codeInputR.anchorMax        = Vector2.right;
                codeInputR.pivot            = new Vector2(0.5f, 0);
                codeInputR.anchoredPosition = Vector2.zero;
                codeInputR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);
                codeInputR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, ViewerCreator.Size);
                var codeInputText = new GameObject("Text");
                codeInputText.transform.SetParent(codeInput.transform);
                var codeInputTextT = codeInputText.AddComponent <Text>();
                codeInputTextT.font     = ViewerCreator.font;
                codeInputTextT.fontSize = ViewerCreator.FontSize;
                codeInputTextT.color    = Color.black;
                var codeInputTextR = codeInputText.GetComponent <RectTransform>();
                codeInputTextR.anchorMin = Vector2.zero;
                codeInputTextR.anchorMax = Vector2.one;
                codeInputTextR.pivot     = new Vector2(0.5f, 0.5f);
                codeInputTextR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width - 10);
                codeInputTextR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, ViewerCreator.Size - 10);
                codeInputTextR.anchoredPosition = Vector2.zero;

                var output = new GameObject("Output");
                output.transform.parent = transform;
                var outputS = output.AddComponent <ScrollRect>();
                var outputR = output.GetComponent <RectTransform>();
                outputR.anchorMin        = Vector2.up;
                outputR.anchorMax        = Vector2.one;
                outputR.pivot            = new Vector2(0.5f, 1);
                outputR.anchoredPosition = new Vector2(0, -10);
                outputR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);
                outputR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Screen.height - ViewerCreator.Size - 120);
                var viewport = new GameObject("Viewport");
                viewport.transform.parent = output.transform;
                viewportR                  = viewport.AddComponent <RectTransform>();
                viewportR.anchorMin        = Vector2.zero;
                viewportR.anchorMax        = Vector2.one;
                viewportR.pivot            = new Vector2(0, 1);
                viewportR.anchoredPosition = Vector2.zero;
                viewportR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width);
                viewportR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Screen.height - ViewerCreator.Size - 120);
                viewport.AddComponent <Mask>();
                viewport.AddComponent <Image>().color = color;
                var outputText = new GameObject("OutputText");
                outputText.transform.parent = viewport.transform;
                outputT                   = outputText.AddComponent <Text>();
                outputT.font              = ViewerCreator.font;
                outputT.fontSize          = ViewerCreator.FontSize;
                outputT.color             = Color.black;
                outputT.text              = "Output";
                outputTR                  = outputText.GetComponent <RectTransform>();
                outputTR                  = outputT.rectTransform;
                outputTR.anchorMin        = new Vector2(0.5f, 1);
                outputTR.anchorMax        = new Vector2(0.5f, 1);
                outputTR.pivot            = new Vector2(0.5f, 1);
                outputTR.anchoredPosition = new Vector2(5, -5);
                outputTR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Screen.width - 10);
                outputT.gameObject.AddComponent <ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
                outputS.content           = outputTR;
                outputS.movementType      = ScrollRect.MovementType.Clamped;
                outputS.decelerationRate  = 0.5f;
                outputS.viewport          = viewportR;
                outputS.scrollSensitivity = 30f;

                codeInputTextT.supportRichText = false;
                codeInputI = codeInput.AddComponent <InputField>();
                codeInputI.textComponent = codeInputTextT;

                var autoComplete = new GameObject("AutoComplete");
                autoComplete.transform.parent = transform;
                var autoCompleteS = autoComplete.AddComponent <ScrollRect>();
                var autoCompleteR = autoComplete.GetComponent <RectTransform>();
                autoCompleteR.anchorMin        = Vector2.zero;
                autoCompleteR.anchorMax        = Vector2.zero;
                autoCompleteR.pivot            = Vector2.zero;
                autoCompleteR.anchoredPosition = new Vector2(0, 40);
                autoCompleteR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 300);
                autoCompleteR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 0);
                var aViewport = new GameObject("Viewport");
                aViewport.transform.SetParent(autoCompleteR);
                var aViewportR = aViewport.AddComponent <RectTransform>();
                aViewportR.anchorMin        = Vector2.zero;
                aViewportR.anchorMax        = Vector2.one;
                aViewportR.pivot            = new Vector2(0, 1);
                aViewportR.anchoredPosition = Vector2.zero;
                aViewportR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 300);
                aViewportR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 0);
                aViewport.AddComponent <Mask>();
                aViewport.AddComponent <Image>().color = color;
                var content = new GameObject("Content");
                content.transform.SetParent(aViewportR);
                var contentR = content.AddComponent <RectTransform>();
                contentR.anchorMin        = Vector2.zero;
                contentR.anchorMax        = Vector2.one;
                contentR.pivot            = new Vector2(0, 1);
                contentR.anchoredPosition = Vector2.zero;
                contentR.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 300);
                contentR.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 0);
                AutoComplete.ScrollView         = autoCompleteR;
                AutoComplete.Content            = contentR;
                autoCompleteS.movementType      = ScrollRect.MovementType.Clamped;
                autoCompleteS.decelerationRate  = 0.5f;
                autoCompleteS.viewport          = aViewportR;
                autoCompleteS.content           = contentR;
                autoCompleteS.scrollSensitivity = 30f;

                var type    = typeof(Debug);
                var sLogger = type.GetField("s_Logger", BindingFlags.NonPublic | BindingFlags.Static);
                sLogger?.SetValue(type, new Logger(Debug.unityLogger.logHandler));
                Logger.Logging = log => {
                    switch (log.logType)
                    {
                    case LogType.Error:
                        WriteLine($"<color=#ee0000ff>UnityError:\n{log.message}</color>");
                        break;

                    case LogType.Assert:
                        WriteLine($"<color=#ee0000ff>UnityAssert:\n{log.message}</color>");
                        break;

                    case LogType.Warning:
                        WriteLine($"<color=#55dd00ff>UnityWarning:\n{log.message}</color>");
                        break;

                    case LogType.Log:
                        WriteLine($"<color=#444444ff>UnityLog:\n{log.message}</color>");
                        break;

                    case LogType.Exception:
                        WriteLine($"<color=#ee0000ff>UnityException:\n{log.message}</color>");
                        break;
                    }
                };

                AutoComplete.Initialize();
                AutoComplete.OnClick += AutoCompleteClick;

                ConsoleCommand.Initialize();

                writer  = new StringWriter();
                printer = new StreamReportPrinter(writer);
                var compilerContext = new CompilerContext(new CompilerSettings(), printer);
                evaluator = new Evaluator(compilerContext);
                foreach (var assembly in AutoComplete.Assemblies)
                {
                    evaluator.ReferenceAssembly(assembly);
                }
                evaluator.Run("using System;using UnityEngine;using UnityEngine.UI;using UnityEngine.Events;using System.Reflection;using System.Collections;using System.Collections.Generic;using System.Linq;using System.IO;using System.Text;");

                codeInputI.onValueChanged.AddListener(str => {
                    caretPosition = codeInputI.caretPosition;
                    str           = str.Substring(0, caretPosition);
                    if (str == string.Empty)
                    {
                        autoComplete.SetActive(false);
                        return;
                    }
                    //autoCompleteR.anchoredPosition = new Vector2(codeInputI.caretPosition * ViewerCreator.FontSize, autoCompleteR.anchoredPosition.y);
                    var quo    = false;
                    startIndex = 0;
                    for (var i = 0; i < str.Length; i++)
                    {
                        if (str[i] == '"')
                        {
                            quo = !quo;
                        }
                        if (str[i] == ';' || str[i] == '(' || str[i] == '[' || str[i] == '{' || str[i] == ',' ||
                            str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '=' ||
                            str[i] == '|' || str[i] == '&' || str[i] == ':' || str[i] == '<' || str[i] == '>')
                        {
                            if (!quo)
                            {
                                startIndex = i + 1;
                            }
                        }
                    }
                    if (quo)
                    {
                        return;
                    }
                    str = str.Substring(startIndex);                      // 找到最后一个语句的位置,从此断开

                    endIndex = 0;
                    for (var i = 0; i < str.Length; i++)
                    {
                        if (str[i] == '"')
                        {
                            quo = !quo;
                        }
                        if (str[i] == '.')
                        {
                            if (!quo && (i == str.Length - 1 || !char.IsDigit(str[i + 1])))
                            {
                                var flag = true;
                                for (var j = i + 1; j < str.Length; j++)
                                {
                                    if (!char.IsLetterOrDigit(str[j]) && str[j] != '_')
                                    {
                                        flag = false;
                                        break;
                                    }
                                }
                                if (flag)
                                {
                                    endIndex = i;                                     // 找到最后一个.的位置
                                }
                            }
                        }
                    }

                    if (endIndex == 0)
                    {
                        AutoComplete.Update(null, str);
                    }
                    else
                    {
                        var prefix = str.Substring(0, endIndex);
                        var t      = AutoComplete.ParseType(prefix);
                        if (t == null)
                        {
                            var method = evaluator.Compile(prefix);
                            writer.Flush();
                            var builder = writer.GetStringBuilder();
                            if (printer.ErrorsCount > 0)
                            {
                                return;
                            }
                            builder.Clear();
                            t = method.Method.ReturnType;
                            if (printer.ErrorsCount == 0 && t != typeof(void))
                            {
                                AutoComplete.Update(t, str.Substring(endIndex + 1));
                            }
                        }
                        else
                        {
                            AutoComplete.Update(t, str.Substring(endIndex + 1));
                        }
                    }
                });

                if (PlayerPrefs.HasKey("InGameConsoleCommandHistory"))
                {
                    foreach (var command in PlayerPrefs.GetString("InGameConsoleCommandHistory").Split('\n'))
                    {
                        commandList.AddLast(command);
                    }
                }
            } catch (Exception e) {
                Utils.LogError(e.ToString(), "Error in Console Start");
            }
        }