From 78f9c3580009c137ec3896173dd4799dfd3a7110 Mon Sep 17 00:00:00 2001 From: breadbyte Date: Thu, 20 Oct 2022 20:05:36 +0800 Subject: [PATCH] Fix scripting system to provide more information in errors Also make log lines for scripting more uniform --- MinecraftClient/ChatBots/Script.cs | 2 +- MinecraftClient/Scripting/CSharpRunner.cs | 21 ++++++++++++++----- .../DynamicRun/Builder/CompileRunner.cs | 2 +- .../Scripting/DynamicRun/Builder/Compiler.cs | 8 +------ 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/MinecraftClient/ChatBots/Script.cs b/MinecraftClient/ChatBots/Script.cs index 3fc1acaf..c72be5a2 100644 --- a/MinecraftClient/ChatBots/Script.cs +++ b/MinecraftClient/ChatBots/Script.cs @@ -158,7 +158,7 @@ namespace MinecraftClient.ChatBots { try { - CSharpRunner.Run(this, lines, args, localVars); + CSharpRunner.Run(this, lines, args, localVars, scriptName: file!); } catch (CSharpException e) { diff --git a/MinecraftClient/Scripting/CSharpRunner.cs b/MinecraftClient/Scripting/CSharpRunner.cs index c3dd20f5..48f52a45 100644 --- a/MinecraftClient/Scripting/CSharpRunner.cs +++ b/MinecraftClient/Scripting/CSharpRunner.cs @@ -26,7 +26,7 @@ namespace MinecraftClient /// Set to false to compile and cache the script without launching it /// Thrown if an error occured /// Result of the execution, returned by the script - public static object? Run(ChatBot apiHandler, string[] lines, string[] args, Dictionary? localVars, bool run = true) + public static object? Run(ChatBot apiHandler, string[] lines, string[] args, Dictionary? localVars, bool run = true, string scriptName = "Unknown Script") { //Script compatibility check for handling future versions differently if (lines.Length < 1 || lines[0] != "//MCCScript 1.0") @@ -102,13 +102,24 @@ namespace MinecraftClient "}}", }); + ConsoleIO.WriteLogLine($"[Script] Starting compilation for {scriptName}..."); + //Compile the C# class in memory using all the currently loaded assemblies var result = compiler.Compile(code, Guid.NewGuid().ToString()); //Process compile warnings and errors - if (result.Failures != null) - throw new CSharpException(CSErrorType.LoadError, - new InvalidOperationException(result.Failures[0].GetMessage())); + if (result.Failures != null) { + + ConsoleIO.WriteLogLine("[Script] Compilation failed with error(s):"); + + foreach (var failure in result.Failures) { + ConsoleIO.WriteLogLine($"[Script] Error in {scriptName}, line:col{failure.Location.GetMappedLineSpan()}: [{failure.Id}] {failure.GetMessage()}"); + } + + throw new CSharpException(CSErrorType.InvalidScript, new InvalidProgramException("Compilation failed due to error.")); + } + + ConsoleIO.WriteLogLine("[Script] Compilation done with no errors."); //Retrieve compiled assembly assembly = result.Assembly; @@ -385,7 +396,7 @@ namespace MinecraftClient { throw new CSharpException(CSErrorType.FileReadError, e); } - return CSharpRunner.Run(this, lines, args, localVars); + return CSharpRunner.Run(this, lines, args, localVars, scriptName: script); } } } \ No newline at end of file diff --git a/MinecraftClient/Scripting/DynamicRun/Builder/CompileRunner.cs b/MinecraftClient/Scripting/DynamicRun/Builder/CompileRunner.cs index 555622fc..8a1e492c 100644 --- a/MinecraftClient/Scripting/DynamicRun/Builder/CompileRunner.cs +++ b/MinecraftClient/Scripting/DynamicRun/Builder/CompileRunner.cs @@ -24,7 +24,7 @@ namespace DynamicRun.Builder GC.WaitForPendingFinalizers(); } - ConsoleIO.WriteLogLine(assemblyLoadContextWeakRef.Item1.IsAlive ? "Script continues to run." : "Script finished!"); + ConsoleIO.WriteLogLine(assemblyLoadContextWeakRef.Item1.IsAlive ? "[Script] Script continues to run." : "[Script] Script finished!"); return assemblyLoadContextWeakRef.Item2; } diff --git a/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs b/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs index 0ade609f..5da4f15d 100644 --- a/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs +++ b/MinecraftClient/Scripting/DynamicRun/Builder/Compiler.cs @@ -23,15 +23,11 @@ namespace DynamicRun.Builder { public CompileResult Compile(string filepath, string fileName) { - ConsoleIO.WriteLogLine($"Starting compilation..."); - using var peStream = new MemoryStream(); var result = GenerateCode(filepath, fileName).Emit(peStream); if (!result.Success) { - ConsoleIO.WriteLogLine("Compilation done with error."); - var failures = result.Diagnostics.Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error); return new CompileResult() @@ -41,9 +37,7 @@ namespace DynamicRun.Builder Failures = failures.ToList() }; } - - ConsoleIO.WriteLogLine("Compilation done without any error."); - + peStream.Seek(0, SeekOrigin.Begin); return new CompileResult()