File size: 3,563 Bytes
1ae2e8e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using Microsoft.CodeAnalysis;

namespace RobloxCS
{
    internal static class Logger
    {
        public static void Ok(string message)
        {
            Log(message, ConsoleColor.Green, "OK");
        }

        public static void Info(string message)
        {
            Log(message, ConsoleColor.Cyan, "INFO");
        }

        public static void Error(string message)
        {
            Log(message, ConsoleColor.Red, "ERROR");
            Environment.Exit(1);
        }

        public static void CompilerError(string message)
        {
            Error($"{message} (roblox-cs compiler error)");
        }

        public static void CodegenError(SyntaxToken token, string message)
        {
            var lineSpan = token.GetLocation().GetLineSpan();
            Error($"{message}\n\t- {Utility.FormatLocation(lineSpan)}");
        }

        public static void CodegenWarning(SyntaxToken token, string message)
        {
            var lineSpan = token.GetLocation().GetLineSpan();
            Warn($"{message}\n\t- {Utility.FormatLocation(lineSpan)}");
        }

        public static void UnsupportedError(SyntaxNode node, string subject, bool useIs = false, bool useYet = true)
        {
            CodegenError(node, $"{subject} {(useIs == true ? "is" : "are")} not {(useYet ? "yet " : "")} supported, sorry!");
        }

        public static void CodegenError(SyntaxNode node, string message)
        {
            CodegenError(node.GetFirstToken(), message);
        }

        public static void CodegenWarning(SyntaxNode node, string message)
        {
            CodegenWarning(node.GetFirstToken(), message);
        }

        public static void HandleDiagnostic(Diagnostic diagnostic)
        {
            HashSet<string> ignoredCodes = ["CS7022", "CS0017" /* more than one entry point */];
            if (ignoredCodes.Contains(diagnostic.Id)) return;

            var lineSpan = diagnostic.Location.GetLineSpan();
            var diagnosticMessage = $"{diagnostic.Id}: {diagnostic.GetMessage()}";
            var location = $"\n\t- {Utility.FormatLocation(lineSpan)}";
            switch (diagnostic.Severity)
            {
                case DiagnosticSeverity.Error:
                    {
                        Error(diagnosticMessage + location);
                        break;
                    }
                case DiagnosticSeverity.Warning:
                    {
                        if (diagnostic.IsWarningAsError)
                        {
                            Error(diagnosticMessage + location);
                        }
                        else
                        {
                            Warn(diagnosticMessage + location);
                        }
                        break;
                    }
                case DiagnosticSeverity.Info:
                    {
                        Info(diagnosticMessage);
                        break;
                    }
            }

        }

        public static void Warn(string message)
        {
            Log(message, ConsoleColor.Yellow, "WARN");
        }

        public static void Debug(string message)
        {
            Log(message, ConsoleColor.Magenta, "DEBUG");
        }

        private static void Log(string message, ConsoleColor color, string level)
        {
            var originalColor = Console.ForegroundColor;
            Console.ForegroundColor = color;
            Console.WriteLine($"[{level}] {message}");
            Console.ForegroundColor = originalColor;
        }
    }
}