diff --git a/src/CodeGeneration.Roslyn.Tasks/GenerateCodeFromAttributes.cs b/src/CodeGeneration.Roslyn.Tasks/GenerateCodeFromAttributes.cs index 714cdb98d..83296bff8 100644 --- a/src/CodeGeneration.Roslyn.Tasks/GenerateCodeFromAttributes.cs +++ b/src/CodeGeneration.Roslyn.Tasks/GenerateCodeFromAttributes.cs @@ -91,12 +91,51 @@ protected override string GenerateResponseFileCommands() argBuilder.AppendLine(this.generatedCompileItemsFilePath); argBuilder.AppendLine("--"); - foreach(var item in this.Compile) + foreach (var item in this.Compile) { argBuilder.AppendLine(item.ItemSpec); } return argBuilder.ToString(); } + + protected override void LogEventsFromTextOutput(string singleLine, MessageImportance messageImportance) + { + MessageImportance newImportance; + if (DidExtractPrefix("High")) + { + newImportance = MessageImportance.High; + } + else if (DidExtractPrefix("Normal")) + { + newImportance = MessageImportance.Normal; + } + else if (DidExtractPrefix("Low")) + { + newImportance = MessageImportance.Low; + } + else + { + newImportance = messageImportance; + } + + if (newImportance < messageImportance) + { + messageImportance = newImportance; // Lower value => higher importance + } + + base.LogEventsFromTextOutput(singleLine, messageImportance); + + bool DidExtractPrefix(string importanceString) + { + var prefix = $"::{importanceString}::"; + if (singleLine.StartsWith(prefix)) + { + singleLine = singleLine.Substring(prefix.Length); + return true; + } + return false; + } + } } } diff --git a/src/CodeGeneration.Roslyn.Tool/Program.cs b/src/CodeGeneration.Roslyn.Tool/Program.cs index f1b02e8d0..142983693 100644 --- a/src/CodeGeneration.Roslyn.Tool/Program.cs +++ b/src/CodeGeneration.Roslyn.Tool/Program.cs @@ -53,8 +53,10 @@ static int Main(string[] args) { generator.Generate(progress); } - catch + catch (Exception e) { + Logger.Log(LogLevel.High, $"{e.GetType().Name}: {e.Message}"); + Logger.Log(LogLevel.High, e.ToString()); return 3; } @@ -65,7 +67,7 @@ static int Main(string[] args) foreach (var file in generator.GeneratedFiles) { - Console.WriteLine(file); + Logger.Log(LogLevel.Normal, file); } return 0; diff --git a/src/CodeGeneration.Roslyn/Logger.cs b/src/CodeGeneration.Roslyn/Logger.cs new file mode 100644 index 000000000..d70126613 --- /dev/null +++ b/src/CodeGeneration.Roslyn/Logger.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CodeGeneration.Roslyn +{ + public enum LogLevel + { + /// + /// High importance, appears in less verbose logs + /// + High = 0, + + /// + /// Normal importance + /// + Normal = 1, + + /// + /// Low importance, appears in more verbose logs + /// + Low = 2, + } + public static class Logger + { + public static void Log(LogLevel logLevel, string message) + { + // Prefix every Line with loglevel + var begin = 0; + var end = message.IndexOf('\n'); + bool foundR = end > 0 && message[end - 1] == '\r'; + if(foundR) + end--; + while (end != -1) + { + Print(message.Substring(begin, end - begin)); + begin = end + (foundR ? 2 : 1); + end = message.IndexOf('\n', begin); + foundR = end > 0 && message[end - 1] == '\r'; + if(foundR) + end--; + } + Print(message.Substring(begin, message.Length - begin)); + + void Print(string toPrint) => Console.WriteLine($"::{logLevel}::{toPrint}"); + } + } +}