void InitializeExecutionEngine(bool loadConfig, bool showHelp) { Debug.Assert(execState == null); if (execState != null) { throw new InvalidOperationException(); } execState = new ExecState(this, new CancellationTokenSource()); var execStateCache = execState; Task.Run(() => { AppCulture.InitializeCulture(); execStateCache.CancellationTokenSource.Token.ThrowIfCancellationRequested(); var userOpts = new UserScriptOptions(); if (loadConfig) { userOpts.LibPaths.AddRange(GetDefaultLibPaths()); userOpts.LoadPaths.AddRange(GetDefaultLoadPaths()); InitializeUserScriptOptions(userOpts); } var opts = ScriptOptions.Default; opts = opts.WithMetadataResolver(ScriptMetadataResolver.Default .WithBaseDirectory(AppDirectories.BinDirectory) .WithSearchPaths(userOpts.LibPaths.Distinct(StringComparer.OrdinalIgnoreCase))); opts = opts.WithSourceResolver(ScriptSourceResolver.Default .WithBaseDirectory(AppDirectories.BinDirectory) .WithSearchPaths(userOpts.LoadPaths.Distinct(StringComparer.OrdinalIgnoreCase))); opts = opts.WithImports(userOpts.Imports); opts = opts.WithReferences(userOpts.References); execStateCache.ScriptOptions = opts; var script = Create <object>(string.Empty, execStateCache.ScriptOptions, typeof(IScriptGlobals), null); execStateCache.CancellationTokenSource.Token.ThrowIfCancellationRequested(); execStateCache.ScriptState = script.RunAsync(execStateCache.Globals, execStateCache.CancellationTokenSource.Token).Result; if (showHelp) { this.replEditor.OutputPrintLine(Help); } }, execStateCache.CancellationTokenSource.Token) .ContinueWith(t => { execStateCache.IsInitializing = false; var ex = t.Exception; if (!t.IsCanceled && !t.IsFaulted) { CommandExecuted(); } else { replEditor.OutputPrintLine(string.Format("Could not create the script:\n\n{0}", ex)); } }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); }
protected abstract void InitializeUserScriptOptions(UserScriptOptions options);