public ScriptServices Build(IRepl repl) { //TODO: this need to be wired up properly using our own IoC container from caliburn. var underlyingLogger = LogManager.GetCurrentClassLogger(); var replLogger = new ReplLogger(LogLevel.Info, repl, underlyingLogger); ILog logger = replLogger; var fileSystem = new FileSystem(); var engine = new RoslynScriptEngine(new ReplScriptHostFactory(), logger); var filePreProcessor = new FilePreProcessor(fileSystem, logger, new ILineProcessor[] {new LoadLineProcessor(fileSystem), new ReferenceLineProcessor(fileSystem), new UsingLineProcessor() }); var packageAssemblyResolver = new PackageAssemblyResolver(fileSystem, new PackageContainer(fileSystem, logger), logger); var installationProvider = new NugetInstallationProvider(fileSystem, logger); return new ScriptServices( fileSystem, packageAssemblyResolver, new ScriptExecutor(fileSystem, filePreProcessor, engine, logger), engine, filePreProcessor, new ScriptPackResolver(new IScriptPack[0]), new PackageInstaller(installationProvider, logger), null, //IObjectSerializer logger, new AssemblyResolver(fileSystem, packageAssemblyResolver, new AssemblyUtility(), logger), null, //IConsole installationProvider ); }
public object LoadFromFile(ISimpleConfig config, string path) { var fileSystem = new FileSystem { CurrentDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase }; log.InfoFormat(CultureInfo.InvariantCulture, "Executing '{0}'", fileSystem.GetFullPath(path)); log.DebugFormat(CultureInfo.InvariantCulture, "The current directory is {0}", fileSystem.CurrentDirectory); var scriptCsLog = LogManager.GetLogger("ScriptCs"); var lineProcessors = new ILineProcessor[] { new LoadLineProcessor(fileSystem), new ReferenceLineProcessor(fileSystem), new UsingLineProcessor(), }; var filePreProcessor = new FilePreProcessor(fileSystem, scriptCsLog, lineProcessors); var engine = new RoslynScriptInMemoryEngine(new ConfigRScriptHostFactory(config), scriptCsLog); var executor = new ConfigRScriptExecutor(fileSystem, filePreProcessor, engine, scriptCsLog); executor.AddReferenceAndImportNamespaces(new[] { typeof(Config), typeof(IScriptHost) }); ScriptResult result; executor.Initialize(new string[0], new IScriptPack[0]); try { result = executor.Execute(path); } finally { executor.Terminate(); } RethrowExceptionIfAny(result, path); return result.ReturnValue; }
public object LoadFromFile(ISimpleConfig config, string path) { var fileSystem = new FileSystem { CurrentDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase }; log.InfoFormat("Executing '{0}'", fileSystem.GetFullPath(path)); log.DebugFormat("The current directory is {0}", fileSystem.CurrentDirectory); var scriptCsLog = new LogProviderAdapter(); var lineProcessors = new ILineProcessor[] { new LoadLineProcessor(fileSystem), new ReferenceLineProcessor(fileSystem), new UsingLineProcessor(), }; var filePreProcessor = new FilePreProcessor(fileSystem, scriptCsLog, lineProcessors); var engine = new RoslynScriptInMemoryEngine(new ConfigRScriptHostFactory(config), scriptCsLog); var executor = new ScriptExecutor(fileSystem, filePreProcessor, engine, scriptCsLog); executor.AddReferenceAndImportNamespaces(new[] { typeof(Config), typeof(IScriptHost) }); executor.AddReferences(this.references); ScriptResult result; executor.Initialize(new string[0], new IScriptPack[0]); // HACK (adamralph): BaseDirectory is set to bin subfolder in Initialize()! executor.ScriptEngine.BaseDirectory = executor.FileSystem.CurrentDirectory; try { result = executor.Execute(path); } finally { executor.Terminate(); } RethrowExceptionIfAny(result, path); return result.ReturnValue; }
public override ScriptResult Execute(string script, params string[] scriptArgs) { Guard.AgainstNullArgument("script", script); try { if (script.StartsWith("#clear", StringComparison.OrdinalIgnoreCase)) { Console.Clear(); return(new ScriptResult()); } if (script.StartsWith("#reset")) { Reset(); return(new ScriptResult()); } var preProcessResult = FilePreProcessor.ProcessScript(script); ImportNamespaces(preProcessResult.Namespaces.ToArray()); foreach (var reference in preProcessResult.References) { var referencePath = FileSystem.GetFullPath(Path.Combine(Constants.BinFolder, reference)); AddReferences(FileSystem.FileExists(referencePath) ? referencePath : reference); } Console.ForegroundColor = ConsoleColor.Cyan; Buffer += preProcessResult.Code; var result = ScriptEngine.Execute(Buffer, _scriptArgs, References, DefaultNamespaces, ScriptPackSession); if (result == null) { return(new ScriptResult()); } if (result.CompileExceptionInfo != null) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(result.CompileExceptionInfo.SourceException.Message); } if (result.ExecuteExceptionInfo != null) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(result.ExecuteExceptionInfo.SourceException.Message); } if (result.IsPendingClosingChar) { return(result); } if (result.ReturnValue != null) { Console.ForegroundColor = ConsoleColor.Yellow; var serializedResult = _serializer.Serialize(result.ReturnValue); Console.WriteLine(serializedResult); } Buffer = null; return(result); } catch (FileNotFoundException fileEx) { RemoveReferences(fileEx.FileName); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\r\n" + fileEx + "\r\n"); return(new ScriptResult { CompileExceptionInfo = ExceptionDispatchInfo.Capture(fileEx) }); } catch (Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\r\n" + ex + "\r\n"); return(new ScriptResult { ExecuteExceptionInfo = ExceptionDispatchInfo.Capture(ex) }); } finally { Console.ResetColor(); } }
public override ScriptResult Execute(string script, params string[] scriptArgs) { try { ScriptResult result; if (script.StartsWith("#") || script.StartsWith(":")) { if (!script.StartsWith("#r ") && !script.StartsWith("#load ")) { if (ProcessCoreCommand(script, out result)) { return(result); } result = ReplCommandService.ProcessCommand(script, ScriptPackSession); if (result.ExecuteExceptionInfo != null) { result.ExecuteExceptionInfo.Throw(); } else if (result.CompileExceptionInfo != null) { result.CompileExceptionInfo.Throw(); } else { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(result.ReturnValue.ToJsv()); Buffer = null; return(result); } } } var preProcessResult = FilePreProcessor.ProcessScript(script); ImportNamespaces(preProcessResult.Namespaces.ToArray()); foreach (var reference in preProcessResult.References) { var referencePath = FileSystem.GetFullPath(Path.Combine(Constants.BinFolder, reference)); AddReferences(FileSystem.FileExists(referencePath) ? referencePath : reference); } Console.ForegroundColor = ConsoleColor.Cyan; Buffer += preProcessResult.Code; result = ScriptEngine.Execute(Buffer, _scriptArgs, References, DefaultNamespaces, ScriptPackSession); if (result == null) { return(new ScriptResult()); } if (result.CompileExceptionInfo != null) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(result.CompileExceptionInfo.SourceException.Message); } if (result.ExecuteExceptionInfo != null) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(result.ExecuteExceptionInfo.SourceException.Message); } if (result.IsPendingClosingChar) { return(result); } if (result.ReturnValue != null) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(result.ReturnValue.ToJsv()); } Buffer = null; return(result); } catch (FileNotFoundException fileEx) { RemoveReferences(fileEx.FileName); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\r\n" + fileEx + "\r\n"); return(new ScriptResult { CompileExceptionInfo = ExceptionDispatchInfo.Capture(fileEx) }); } catch (Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\r\n" + ex + "\r\n"); return(new ScriptResult { ExecuteExceptionInfo = ExceptionDispatchInfo.Capture(ex) }); } finally { Console.ResetColor(); } }