Esempio n. 1
0
        static public Result <string, SubmissionResponseValueStructure> EvaluateSubmissionAndGetResultingValue(
            JavaScriptEngineSwitcher.Core.IJsEngine evalElmPreparedJsEngine,
            Composition.TreeComponent appCodeTree,
            string submission,
            IReadOnlyList <string> previousLocalSubmissions = null)
        {
            var modulesTexts =
                appCodeTree == null ? null
                :
                ElmApp.ToFlatDictionaryWithPathComparer(
                    appCodeTree.EnumerateBlobsTransitive()
                    .Select(file =>
                            (filePath: (IImmutableList <string>)file.path.Select(pathComponent => Encoding.UTF8.GetString(pathComponent.ToArray())).ToImmutableList(),
                             content: file.blobContent)))
                .Select(appCodeFile => appCodeFile.Key.Last().EndsWith(".elm") ? Encoding.UTF8.GetString(appCodeFile.Value.ToArray()) : null)
                .WhereNotNull()
                .ToImmutableList();

            var argumentsJson = Newtonsoft.Json.JsonConvert.SerializeObject(
                new
            {
                modulesTexts             = modulesTexts ?? ImmutableList <string> .Empty,
                submission               = submission,
                previousLocalSubmissions = previousLocalSubmissions ?? ImmutableList <string> .Empty,
            }
                );

            var responseJson =
                evalElmPreparedJsEngine.CallFunction("evaluateSubmissionInInteractive", argumentsJson)
                ?.ToString();

            var responseStructure =
                Newtonsoft.Json.JsonConvert.DeserializeObject <EvaluateSubmissionResponseStructure>(
                    responseJson);

            if (responseStructure.DecodedArguments == null)
            {
                throw new Exception("Failed to decode arguments: " + responseStructure.FailedToDecodeArguments);
            }

            if (responseStructure.DecodedArguments.Evaluated == null)
            {
                return(Result <string, SubmissionResponseValueStructure> .err(responseStructure.DecodedArguments.FailedToEvaluate));
            }

            return(Result <string, ElmEngine.EvaluateElm.SubmissionResponseValueStructure> .ok(
                       responseStructure.DecodedArguments.Evaluated.SubmissionResponseValue));
        }
    static public Result <string, EvaluatedSctructure> EvaluateSubmissionAndGetResultingValue(
        JavaScriptEngineSwitcher.Core.IJsEngine evalElmPreparedJsEngine,
        TreeWithStringPath?appCodeTree,
        string submission,
        IReadOnlyList <string>?previousLocalSubmissions = null)
    {
        var modulesTexts =
            appCodeTree == null ? null
            :
            TreeToFlatDictionaryWithPathComparer(compileTree(appCodeTree) !)
            .Select(appCodeFile => appCodeFile.Key.Last().EndsWith(".elm") ? Encoding.UTF8.GetString(appCodeFile.Value.ToArray()) : null)
            .WhereNotNull()
            .ToImmutableList();

        var argumentsJson = System.Text.Json.JsonSerializer.Serialize(
            new
        {
            modulesTexts             = modulesTexts ?? ImmutableList <string> .Empty,
            submission               = submission,
            previousLocalSubmissions = previousLocalSubmissions ?? ImmutableList <string> .Empty,
        }
            );

        var responseJson =
            evalElmPreparedJsEngine.CallFunction("evaluateSubmissionInInteractive", argumentsJson).ToString() !;

        var responseStructure =
            System.Text.Json.JsonSerializer.Deserialize <EvaluateSubmissionResponseStructure>(responseJson) !;

        if (responseStructure.DecodedArguments == null)
        {
            throw new Exception("Failed to decode arguments: " + responseStructure.FailedToDecodeArguments);
        }

        if (responseStructure.DecodedArguments.Evaluated == null)
        {
            return(Result <string, EvaluatedSctructure> .err(responseStructure.DecodedArguments.FailedToEvaluate !));
        }

        return(Result <string, EvaluatedSctructure> .ok(
                   responseStructure.DecodedArguments.Evaluated));
    }
Esempio n. 3
0
        public static JavaScriptEngineSwitcher.Core.IJsEngine CreateEngine()
        {
            var engineSwitcher = JavaScriptEngineSwitcher.Core.JsEngineSwitcher.Current;

            engineSwitcher.EngineFactories.Add(new JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngineFactory());
            engineSwitcher.DefaultEngineName = JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.EngineName;
            JavaScriptEngineSwitcher.Core.IJsEngine engine = JavaScriptEngineSwitcher.Core.JsEngineSwitcher.Current.CreateDefaultEngine();
            // C#中设置JS变量值
            engine.SetVariableValue("pi", 3.1415926);
            // C#向JS注入类型
            //engine.EmbedHostType("Console", typeof(JsConsole));
            // C#向JS注入对象
            engine.EmbedHostObject("console", new JsConsole());
            engine.EmbedHostObject("math", new JsMath());
            engine.EmbedHostObject("file", new JsFile());
            //engine.EmbedHostObject("File", typeof(JsFile));
            engine.SetVariableValue("jsEngineVersion", engine.Version);
            engine.Execute("function version(){ \r\n    return jsEngineVersion; \r\n}");
            engine.Execute("function print(arg){ \r\n    console.log(arg); \r\n}");
            return(engine);
        }
Esempio n. 4
0
        public static void Init(string[] args)
        {
            // ½âÎö²ÎÊý
            // -
            Console.WriteLine($"command arguments: '{string.Join("','", args)}'");
            Console.WriteLine($"run dic: {AppContext.BaseDirectory}");
            if (args.Length > 0)
            {
                switch (args[0])
                {
                case "run":
                    if (args.Length > 1)
                    {
                        var arg = args[1];
                        if (arg == "js")
                        {
                            if (args.Length > 2)
                            {
                                var code = args[2];
                                using (JavaScriptEngineSwitcher.Core.IJsEngine engine = JavaScript.JsEngine.CreateEngine())
                                {
                                    Console.WriteLine($"out:{"".PadRight(40, '-')}");
                                    engine.Execute(code);
                                    Console.WriteLine($"out:{"".PadRight(40, '-')}");
                                }
                            }
                        }
                        var path = System.IO.Path.GetFullPath(arg);
                        Console.WriteLine($"source code file: {path}");
                        if (System.IO.File.Exists(path))
                        {
                            var sourceCode = System.IO.File.ReadAllText(path);
                            Console.WriteLine($"src:{"".PadRight(40, '-')}");
                            Console.WriteLine(sourceCode);
                            Console.WriteLine($"src:{"".PadRight(40, '-')}");
                            if (System.IO.Path.HasExtension(".ws"))
                            {
                                ILexer lexer = new Lexer();
                            }
                            if (System.IO.Path.HasExtension(".js"))
                            {
                                using (JavaScriptEngineSwitcher.Core.IJsEngine engine = JavaScript.JsEngine.CreateEngine())
                                {
                                    Console.WriteLine($"out:{"".PadRight(40, '-')}");
                                    // Ö´ÐÐJS½Å±¾Îļþ
                                    engine.ExecuteFile(path);
                                    //engine.Execute("var a=1+3;if(1)a=5;TestA.Name=a");
                                    Console.WriteLine($"out:{"".PadRight(40, '-')}");
                                }
                            }
                            #region << ¶¯Ì¬±àÒëC#´úÂë >>
                            // if (System.IO.Path.HasExtension(".cs"))
                            // {
                            //     CSharpCodeProvider provider = new CSharpCodeProvider();
                            //     ICodeCompiler compiler = provider.CreateCompiler();
                            //     CompilerParameters parameters = new CompilerParameters();
                            //     parameters.ReferencedAssemblies.Add("System.dll");
                            //     parameters.GenerateExecutable = false;
                            //     parameters.GenerateInMemory = true;
                            //     CompilerResults cr = compiler.CompileAssemblyFromSource(parameters, sourceCode);
                            //     if(cr.Errors.HasErrors){
                            //         Console.WriteLine("±àÒë´íÎó£º");
                            //         Console.WriteLine(string.Join(Environment.NewLine
                            //             , cr.Errors.Cast<CompilerError>()
                            //                 .Select(err => err.ErrorText)));
                            //     }
                            //     else {
                            //         Assembly assembly = cr.CompiledAssembly;
                            //         var type = assembly.GetType("Program");
                            //         // type.InvokeMember()
                            //     }
                            // }
                            #endregion
                        }
                    }
                    break;

                default:
                    break;
                }
            }
        }
Esempio n. 5
0
 public JsEngine(JavaScriptEngineSwitcher.Core.IJsEngine engine)
 {
     _engine = engine;
 }