Better error handling

This commit is contained in:
Deukhoofd 2019-01-22 12:28:21 +01:00
parent cd6384614b
commit 284ba2cf54
No known key found for this signature in database
GPG Key ID: B4C087AC81641654
8 changed files with 43 additions and 25 deletions

View File

@ -107,7 +107,7 @@ namespace Upsilon.BaseTypes.ScriptFunction
// if we haven't found a method, we throw an exception // if we haven't found a method, we throw an exception
if (method == null) if (method == null)
{ {
throw new ScriptRuntimeException( throw new ScriptRuntimeException(script.FileName,
$"Can't find method {Method.Name} with parameter types {string.Join(", ", convertedTypes.Select(x => x.Name))} on type {_object.GetType().Name}", $"Can't find method {Method.Name} with parameter types {string.Join(", ", convertedTypes.Select(x => x.Name))} on type {_object.GetType().Name}",
span, diagnostics.ScriptString.GetSpan(span)); span, diagnostics.ScriptString.GetSpan(span));
} }

View File

@ -6,6 +6,7 @@ using Upsilon.BaseTypes.ScriptTypeInterfaces;
using Upsilon.Binder; using Upsilon.Binder;
using Upsilon.Binder.VariableSymbols; using Upsilon.Binder.VariableSymbols;
using Upsilon.Evaluator; using Upsilon.Evaluator;
using Upsilon.Exceptions;
using Upsilon.Text; using Upsilon.Text;
namespace Upsilon.BaseTypes.ScriptFunction namespace Upsilon.BaseTypes.ScriptFunction
@ -25,7 +26,7 @@ namespace Upsilon.BaseTypes.ScriptFunction
var option = GetValidOption(variables); var option = GetValidOption(variables);
if (option == null) if (option == null)
{ {
throw new EvaluationException( throw new EvaluationException(script.FileName,
$"No valid function found"); $"No valid function found");
} }
return option.Run(diagnostics, variables, script, scope, span); return option.Run(diagnostics, variables, script, scope, span);

View File

@ -64,7 +64,7 @@ namespace Upsilon.BaseTypes.UserData
} }
else else
{ {
throw new ScriptRuntimeException( throw new ScriptRuntimeException(null,
$"Tried indexing a CSharp list with a value that's not an integer. Value: {scriptIndex.ToCSharpObject()}", $"Tried indexing a CSharp list with a value that's not an integer. Value: {scriptIndex.ToCSharpObject()}",
span, diagnostics.ScriptString.GetSpan(span)); span, diagnostics.ScriptString.GetSpan(span));
} }

View File

@ -375,6 +375,8 @@ namespace Upsilon.Binder
{ {
return new UserDataVariableSymbol(fullStopIndexExpression.Index, boundDef, true, parent); return new UserDataVariableSymbol(fullStopIndexExpression.Index, boundDef, true, parent);
} }
diagnostics?.LogWarning($"Can't resolve type '{bDefProperty.ToString()}'", fullStopIndexExpression.Span);
return new VariableSymbol(fullStopIndexExpression.Index, Type.Unknown, true);
} }
} }
else if (indexerVariable.TypeContainer == Type.Unknown) else if (indexerVariable.TypeContainer == Type.Unknown)
@ -887,14 +889,16 @@ namespace Upsilon.Binder
} }
else else
{ {
var functionParameter = (UserDataVariableSymbol) variableSymbol; if (variableSymbol is UserDataVariableSymbol functionParameter)
var udBoundDef = (UserDataBoundTypeDefinition)functionParameter.BoundTypeDefinition;
if (udBoundDef.Properties.TryGetValue(index.ToLowerInvariant(), out var property))
{ {
return new BoundFullStopIndexExpression(expression, index, property.Type, e.Span); var udBoundDef = (UserDataBoundTypeDefinition)functionParameter.BoundTypeDefinition;
if (udBoundDef.Properties.TryGetValue(index.ToLowerInvariant(), out var property))
{
return new BoundFullStopIndexExpression(expression, index, property.Type, e.Span);
}
_diagnostics.LogError($"No variable '{index}' found on type '{udBoundDef.Name}'.",
e.Span);
} }
_diagnostics.LogError($"No variable '{index}' found on type '{udBoundDef.Name}'.",
e.Span);
} }
return new BoundFullStopIndexExpression(expression, index, Type.Unknown, e.Span); return new BoundFullStopIndexExpression(expression, index, Type.Unknown, e.Span);
case Type.Unknown: case Type.Unknown:

View File

@ -1,12 +0,0 @@
using System;
namespace Upsilon.Evaluator
{
public class EvaluationException : Exception
{
public EvaluationException(string message) : base(message)
{
}
}
}

View File

@ -88,7 +88,7 @@ namespace Upsilon.Evaluator
var function = (ScriptRuntimeFunction) statement; var function = (ScriptRuntimeFunction) statement;
var option = function.GetValidOption(parameters); var option = function.GetValidOption(parameters);
if (option == null) if (option == null)
throw new EvaluationException( throw new EvaluationException(_script.FileName,
$"No function found with name '{functionName}' and available parameters {string.Join(", ", parameters.Select(x => $"{x.GetType().Name}"))}"); $"No function found with name '{functionName}' and available parameters {string.Join(", ", parameters.Select(x => $"{x.GetType().Name}"))}");
var result = option.Run(_diagnostics, parameters?.Select(x => x.ToScriptType()).ToArray(), _script, Scope, new TextSpan()); var result = option.Run(_diagnostics, parameters?.Select(x => x.ToScriptType()).ToArray(), _script, Scope, new TextSpan());
@ -399,7 +399,7 @@ namespace Upsilon.Evaluator
private void ThrowException(string message, TextSpan location) private void ThrowException(string message, TextSpan location)
{ {
throw new ScriptRuntimeException(message, location, _diagnostics.ScriptString.GetSpan(location)); throw new ScriptRuntimeException(_script.FileName, message, location, _diagnostics.ScriptString.GetSpan(location));
} }
private void EvaluateAssignmentStatement(BoundVariableAssignment e) private void EvaluateAssignmentStatement(BoundVariableAssignment e)

View File

@ -0,0 +1,23 @@
using System;
namespace Upsilon.Exceptions
{
public class EvaluationException : Exception
{
public string FileName { get; }
public string ErrorMessage { get; }
public EvaluationException(string fileName, string message)
{
FileName = fileName;
ErrorMessage = message;
}
public override string ToString()
{
return $"[{FileName}] {ErrorMessage}";
}
public override string Message => ToString();
}
}

View File

@ -5,13 +5,15 @@ namespace Upsilon.Exceptions
{ {
public class ScriptRuntimeException : Exception public class ScriptRuntimeException : Exception
{ {
public string FileName { get; }
public string ErrorMessage { get; } public string ErrorMessage { get; }
public int Line { get; } public int Line { get; }
public int Character { get; } public int Character { get; }
public string ErrorLine { get; } public string ErrorLine { get; }
public ScriptRuntimeException(string errorMessage, TextSpan position, string errorLine) public ScriptRuntimeException(string fileName, string errorMessage, TextSpan position, string errorLine)
{ {
FileName = fileName;
ErrorMessage = errorMessage; ErrorMessage = errorMessage;
Line = position.StartLine; Line = position.StartLine;
Character = position.StartPosition; Character = position.StartPosition;
@ -20,7 +22,7 @@ namespace Upsilon.Exceptions
public override string ToString() public override string ToString()
{ {
return $"{ErrorMessage} at ({Line}, {Character})\n{ErrorLine}"; return $"[{FileName}] {ErrorMessage} at ({Line}, {Character})\n{ErrorLine}";
} }
public override string Message => ToString(); public override string Message => ToString();