Better evaluation error handling
This commit is contained in:
parent
575889bed1
commit
7e50111724
|
@ -28,7 +28,7 @@ namespace Upsilon.BaseTypes.ScriptFunction
|
||||||
if (option == null)
|
if (option == null)
|
||||||
{
|
{
|
||||||
throw new EvaluationException(script.FileName,
|
throw new EvaluationException(script.FileName,
|
||||||
$"No valid function found");
|
$"No valid function found", span);
|
||||||
}
|
}
|
||||||
return option.Run(diagnostics, variables, script, scope, span);
|
return option.Run(diagnostics, variables, script, scope, span);
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,7 +89,8 @@ namespace Upsilon.Evaluator
|
||||||
var option = function.GetValidOption(parameters);
|
var option = function.GetValidOption(parameters);
|
||||||
if (option == null)
|
if (option == null)
|
||||||
throw new EvaluationException(_script.FileName,
|
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}"))}",
|
||||||
|
e.Span);
|
||||||
|
|
||||||
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());
|
||||||
return result;
|
return result;
|
||||||
|
@ -625,9 +626,14 @@ namespace Upsilon.Evaluator
|
||||||
private ScriptType EvaluateFullStopIndexExpression(BoundFullStopIndexExpression e)
|
private ScriptType EvaluateFullStopIndexExpression(BoundFullStopIndexExpression e)
|
||||||
{
|
{
|
||||||
var variable = EvaluateExpression(e.Expression);
|
var variable = EvaluateExpression(e.Expression);
|
||||||
|
if (variable.Type == Type.Nil)
|
||||||
|
{
|
||||||
|
throw new EvaluationException(_script.FileName, $"Nil variable can't be indexed", e.Span);
|
||||||
|
}
|
||||||
if (!(variable is IIndexable indexable))
|
if (!(variable is IIndexable indexable))
|
||||||
{
|
{
|
||||||
throw new Exception("Variable is not indexable.");
|
throw new EvaluationException(_script.FileName,
|
||||||
|
$"Variable of type '{variable.Type}' is not indexable.", e.Span);
|
||||||
}
|
}
|
||||||
|
|
||||||
var scope = Scope;
|
var scope = Scope;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using Upsilon.Text;
|
||||||
|
|
||||||
namespace Upsilon.Exceptions
|
namespace Upsilon.Exceptions
|
||||||
{
|
{
|
||||||
|
@ -6,16 +7,18 @@ namespace Upsilon.Exceptions
|
||||||
{
|
{
|
||||||
public string FileName { get; }
|
public string FileName { get; }
|
||||||
public string ErrorMessage { get; }
|
public string ErrorMessage { get; }
|
||||||
|
public TextSpan Span { get; }
|
||||||
|
|
||||||
public EvaluationException(string fileName, string message)
|
public EvaluationException(string fileName, string message, TextSpan span)
|
||||||
{
|
{
|
||||||
FileName = fileName;
|
FileName = fileName;
|
||||||
ErrorMessage = message;
|
ErrorMessage = message;
|
||||||
|
Span = span;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return $"[{FileName}] {ErrorMessage}";
|
return $"[{FileName}] ({Span.StartLine},{Span.StartPosition}) {ErrorMessage}";
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Message => ToString();
|
public override string Message => ToString();
|
||||||
|
|
Loading…
Reference in New Issue