Work on Diagnostics
This commit is contained in:
86
Upsilon/Diagnostics.cs
Normal file
86
Upsilon/Diagnostics.cs
Normal file
@@ -0,0 +1,86 @@
|
||||
using System.Collections.Generic;
|
||||
using Upsilon.Text;
|
||||
|
||||
namespace Upsilon
|
||||
{
|
||||
public class Diagnostics
|
||||
{
|
||||
public SourceText ScriptString { get; }
|
||||
public readonly List<DiagnosticsMessage> Messages = new List<DiagnosticsMessage>();
|
||||
|
||||
public Diagnostics(SourceText scriptString)
|
||||
{
|
||||
ScriptString = scriptString;
|
||||
}
|
||||
|
||||
public void Log(DiagnosticLevel level, string message, TextSpan location)
|
||||
{
|
||||
Messages.Add(new DiagnosticsMessage(this, level, message, location));
|
||||
}
|
||||
|
||||
public void LogError(string message, TextSpan location)
|
||||
{
|
||||
Log(DiagnosticLevel.Error, message, location);
|
||||
}
|
||||
|
||||
public void LogBadCharacter(TextSpan location)
|
||||
{
|
||||
LogError($"Invalid character found", location);
|
||||
}
|
||||
|
||||
public void LogUnknownVariable(TextSpan span, string variable)
|
||||
{
|
||||
LogError($"Unknown variable '{variable}'", span);
|
||||
}
|
||||
|
||||
public void LogNullReferenceError(TextSpan span)
|
||||
{
|
||||
LogError($"Null Reference Encountered", span);
|
||||
}
|
||||
}
|
||||
|
||||
public class DiagnosticsMessage
|
||||
{
|
||||
public Diagnostics Diagnostics { get; }
|
||||
private readonly DiagnosticLevel _diagnosticLevel;
|
||||
public string Message { get; }
|
||||
public TextSpan Span { get; }
|
||||
|
||||
public DiagnosticsMessage(Diagnostics diagnostics, DiagnosticLevel diagnosticLevel, string message, TextSpan span)
|
||||
{
|
||||
_diagnosticLevel = diagnosticLevel;
|
||||
Diagnostics = diagnostics;
|
||||
Message = message;
|
||||
Span = span;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Message} at {Span.Start}\n{Diagnostics.ScriptString.GetSpan(Span)}";
|
||||
}
|
||||
|
||||
public string BeforeError(int i = 5)
|
||||
{
|
||||
return Diagnostics.ScriptString.GetSpan(Span.Start - i, i);
|
||||
}
|
||||
|
||||
public string AtError()
|
||||
{
|
||||
return Diagnostics.ScriptString.GetSpan(Span);
|
||||
}
|
||||
|
||||
public string AfterError(int i = 5)
|
||||
{
|
||||
return Diagnostics.ScriptString.GetSpan(Span.Start + 1, i);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public enum DiagnosticLevel
|
||||
{
|
||||
Information,
|
||||
Warning,
|
||||
Error,
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user