Work on Diagnostics

This commit is contained in:
2018-11-11 10:26:52 +01:00
parent ab61a01573
commit 699377cdfc
10 changed files with 244 additions and 45 deletions

86
Upsilon/Diagnostics.cs Normal file
View 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,
}
}