Better error handling
This commit is contained in:
parent
cd6384614b
commit
284ba2cf54
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Upsilon.Evaluator
|
|
||||||
{
|
|
||||||
public class EvaluationException : Exception
|
|
||||||
{
|
|
||||||
public EvaluationException(string message) : base(message)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue