-
Notifications
You must be signed in to change notification settings - Fork 526
/
Copy pathDiagnostics.cs
146 lines (123 loc) · 3.56 KB
/
Diagnostics.cs
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace CppSharp
{
/// <summary>
/// Represents the kind of the diagnostic.
/// </summary>
public enum DiagnosticKind
{
Debug,
Message,
Warning,
Error
}
/// <summary>
/// Keeps information related to a single diagnostic.
/// </summary>
public struct DiagnosticInfo
{
public DiagnosticKind Kind;
public string Message;
public string File;
public int Line;
public int Column;
}
public interface IDiagnostics
{
DiagnosticKind Level { get; set; }
void Emit(DiagnosticInfo info);
void PushIndent(int level = 4);
void PopIndent();
}
public static class Diagnostics
{
public static IDiagnostics Implementation { get; set; } = new ConsoleDiagnostics();
public static DiagnosticKind Level
{
get { return Implementation.Level; }
set { Implementation.Level = value; }
}
public static void PushIndent(int level = 4)
{
Implementation.PushIndent(level);
}
public static void PopIndent()
{
Implementation.PopIndent();
}
public static void Debug(string msg, params object[] args)
{
var diagInfo = new DiagnosticInfo
{
Kind = DiagnosticKind.Debug,
Message = args.Any() ? string.Format(msg, args) : msg
};
Implementation.Emit(diagInfo);
}
public static void Message(string msg, params object[] args)
{
var diagInfo = new DiagnosticInfo
{
Kind = DiagnosticKind.Message,
Message = args.Any() ? string.Format(msg, args) : msg
};
Implementation.Emit(diagInfo);
}
public static void Warning(string msg, params object[] args)
{
var diagInfo = new DiagnosticInfo
{
Kind = DiagnosticKind.Warning,
Message = args.Any() ? string.Format(msg, args) : msg
};
Implementation.Emit(diagInfo);
}
public static void Error(string msg, params object[] args)
{
var diagInfo = new DiagnosticInfo
{
Kind = DiagnosticKind.Error,
Message = args.Any() ? string.Format(msg, args) : msg
};
Implementation.Emit(diagInfo);
}
}
public class ConsoleDiagnostics : IDiagnostics
{
public Stack<int> Indents;
public DiagnosticKind Level { get; set; }
public ConsoleDiagnostics()
{
Indents = new Stack<int>();
Level = DiagnosticKind.Message;
}
public void Emit(DiagnosticInfo info)
{
if (info.Kind < Level)
return;
var currentIndentation = Indents.Sum();
var message = new string(' ', currentIndentation) + info.Message;
if (info.Kind == DiagnosticKind.Error)
{
Console.Error.WriteLine(message);
}
else
{
Console.WriteLine(message);
}
// Super slow, don't use this for now
// Debug.WriteLine(message);
}
public void PushIndent(int level)
{
Indents.Push(level);
}
public void PopIndent()
{
Indents.Pop();
}
}
}