Show file name in error messages, to handle errors from modules easier
This commit is contained in:
parent
edd352e62a
commit
b0450d3bf5
|
@ -45,7 +45,7 @@ namespace Upsilon.Binder
|
|||
_unboundFunctions.Clear();
|
||||
}
|
||||
|
||||
public BoundScript BindScript(BlockStatementSyntax e)
|
||||
public BoundScript BindScript(string fileName, BlockStatementSyntax e)
|
||||
{
|
||||
var bound = BindStatement(e);
|
||||
foreach (var unboundFunctionStatement in _unboundFunctions)
|
||||
|
@ -68,7 +68,7 @@ namespace Upsilon.Binder
|
|||
variable.ResultType = resultType;
|
||||
}
|
||||
_unboundFunctions = new Dictionary<string, UnboundFunctionExpression>();
|
||||
return new BoundScript((BoundBlockStatement) bound, e.Span, Scope);
|
||||
return new BoundScript((BoundBlockStatement) bound, e.Span, Scope, fileName);
|
||||
}
|
||||
|
||||
private BoundStatement BindStatement(StatementSyntax s)
|
||||
|
|
|
@ -5,12 +5,14 @@ namespace Upsilon.Binder
|
|||
{
|
||||
public class BoundScript : BoundStatement
|
||||
{
|
||||
public BoundScript(BoundBlockStatement statement, TextSpan span, BoundScope scope) : base(span)
|
||||
public BoundScript(BoundBlockStatement statement, TextSpan span, BoundScope scope, string fileName) : base(span)
|
||||
{
|
||||
Statement = statement;
|
||||
Scope = scope;
|
||||
FileName = fileName;
|
||||
}
|
||||
|
||||
public string FileName { get; set; }
|
||||
public override BoundKind Kind => BoundKind.BoundScript;
|
||||
public override IEnumerable<BoundNode> GetNodeAtPosition(int characterPosition)
|
||||
{
|
||||
|
|
|
@ -8,15 +8,17 @@ namespace Upsilon
|
|||
{
|
||||
public class Diagnostics
|
||||
{
|
||||
public string FileName { get; }
|
||||
public SourceText ScriptString { get; }
|
||||
public readonly List<DiagnosticsMessage> Errors = new List<DiagnosticsMessage>();
|
||||
public readonly List<DiagnosticsMessage> Warnings = new List<DiagnosticsMessage>();
|
||||
public bool ThrowsOnError { get; }
|
||||
|
||||
public Diagnostics(SourceText scriptString, bool throwsOnError)
|
||||
public Diagnostics(SourceText scriptString, bool throwsOnError, string fileName)
|
||||
{
|
||||
ScriptString = scriptString;
|
||||
ThrowsOnError = throwsOnError;
|
||||
FileName = fileName;
|
||||
}
|
||||
|
||||
public void Log(DiagnosticLevel level, string message, TextSpan location)
|
||||
|
@ -33,7 +35,7 @@ namespace Upsilon
|
|||
{
|
||||
var linePos = ScriptString.GetLinePosition(location.Start);
|
||||
var line = ScriptString.GetLine(linePos.Line);
|
||||
throw new ParseException(message, linePos.Line, linePos.Pos, line);
|
||||
throw new ParseException(FileName, message, linePos.Line, linePos.Pos, line);
|
||||
}
|
||||
Log(DiagnosticLevel.Error, message, location);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using Upsilon.BaseTypes;
|
||||
using Upsilon.Binder;
|
||||
using Upsilon.Parser;
|
||||
|
@ -12,6 +11,7 @@ namespace Upsilon.Evaluator
|
|||
{
|
||||
public class Script : IDisposable
|
||||
{
|
||||
public string FileName { get; }
|
||||
public ScriptOptions Options { get; }
|
||||
private readonly string _scriptString;
|
||||
public SourceText ScriptString { get; }
|
||||
|
@ -22,12 +22,13 @@ namespace Upsilon.Evaluator
|
|||
private Binder.Binder Binder { get; }
|
||||
private EvaluationScope Scope { get; }
|
||||
|
||||
internal Script(string scriptString, ScriptOptions options )
|
||||
internal Script(string scriptString, string fileName, ScriptOptions options )
|
||||
{
|
||||
FileName = fileName;
|
||||
Options = options;
|
||||
_scriptString = scriptString;
|
||||
ScriptString = new SourceText(scriptString);
|
||||
Diagnostics = new Diagnostics(ScriptString, options.ThrowExceptionOnError);
|
||||
Diagnostics = new Diagnostics(ScriptString, options.ThrowExceptionOnError, fileName);
|
||||
|
||||
var staticBoundScope = options.OverrideStaticBoundScope ?? StaticScope.BoundScope;
|
||||
var boundScope = BoundScope.WithReadOnlyScope(staticBoundScope);
|
||||
|
@ -38,12 +39,12 @@ namespace Upsilon.Evaluator
|
|||
Evaluator = Evaluator.CreateWithSetScope(Diagnostics, Scope, this);
|
||||
}
|
||||
|
||||
private Script(string scriptString, Binder.Binder binder, Evaluator evaluator, ScriptOptions options)
|
||||
private Script(string fileName, string scriptString, Binder.Binder binder, Evaluator evaluator, ScriptOptions options)
|
||||
{
|
||||
ScriptString = new SourceText(scriptString);
|
||||
Options = options;
|
||||
_scriptString = scriptString;
|
||||
Diagnostics = new Diagnostics(ScriptString, options.ThrowExceptionOnError);
|
||||
Diagnostics = new Diagnostics(ScriptString, options.ThrowExceptionOnError, fileName);
|
||||
|
||||
Binder = Upsilon.Binder.Binder.CreateWithSetScope(Diagnostics, binder.Scope, this);
|
||||
Evaluator = Evaluator.CreateWithSetScope(Diagnostics, evaluator.Scope, this);
|
||||
|
@ -54,7 +55,7 @@ namespace Upsilon.Evaluator
|
|||
{
|
||||
Options = options;
|
||||
_bound = boundScript;
|
||||
Diagnostics = new Diagnostics(ScriptString, options.ThrowExceptionOnError);
|
||||
Diagnostics = new Diagnostics(ScriptString, options.ThrowExceptionOnError, boundScript.FileName);
|
||||
|
||||
Binder = Upsilon.Binder.Binder.CreateWithSetScope(Diagnostics, binder.Scope, this);
|
||||
Evaluator = Evaluator.CreateWithSetScope(Diagnostics, evaluator.Scope, this);
|
||||
|
@ -62,9 +63,9 @@ namespace Upsilon.Evaluator
|
|||
}
|
||||
|
||||
|
||||
internal static Script ContinueWith(Script previousScript, string scriptString)
|
||||
internal static Script ContinueWith(Script previousScript, string fileName, string scriptString)
|
||||
{
|
||||
var s = new Script(scriptString, previousScript.Binder, previousScript.Evaluator, previousScript.Options);
|
||||
var s = new Script(fileName, scriptString, previousScript.Binder, previousScript.Evaluator, previousScript.Options);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
@ -82,7 +83,7 @@ namespace Upsilon.Evaluator
|
|||
|
||||
public BoundScript Bind()
|
||||
{
|
||||
return _bound ?? (_bound = Binder.BindScript(_parsed));
|
||||
return _bound ?? (_bound = Binder.BindScript(FileName, _parsed));
|
||||
}
|
||||
|
||||
public object Evaluate()
|
||||
|
|
|
@ -5,13 +5,15 @@ namespace Upsilon.Exceptions
|
|||
{
|
||||
public class ParseException : Exception
|
||||
{
|
||||
public string FileName { get; }
|
||||
public string ErrorMessage { get; }
|
||||
public int Line { get; }
|
||||
public int Character { get; }
|
||||
public string ErrorLine { get; }
|
||||
|
||||
public ParseException(string errorMessage, int line, int character, string errorLine)
|
||||
public ParseException(string fileName, string errorMessage, int line, int character, string errorLine)
|
||||
{
|
||||
FileName = fileName;
|
||||
ErrorMessage = errorMessage;
|
||||
Line = line;
|
||||
Character = character;
|
||||
|
@ -20,7 +22,7 @@ namespace Upsilon.Exceptions
|
|||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{ErrorMessage} at ({Line}, {Character})\n{ErrorLine}";
|
||||
return $"[{FileName}] {ErrorMessage} at ({Line}, {Character})\n{ErrorLine}";
|
||||
}
|
||||
|
||||
public override string Message => ToString();
|
||||
|
|
|
@ -10,7 +10,7 @@ namespace Upsilon
|
|||
public static Script ParseInput(string input, ScriptOptions options = null)
|
||||
{
|
||||
if (options == null) options = DefaultOptions;
|
||||
var script = new Script(input, options);
|
||||
var script = new Script(input, "unnamed", options);
|
||||
script.Parse();
|
||||
return script;
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ namespace Upsilon
|
|||
{
|
||||
if (options == null) options = DefaultOptions;
|
||||
var input = options.ScriptLoader.LoadFile(fileName);
|
||||
var script = new Script(input, options);
|
||||
var script = new Script(input,fileName, options);
|
||||
script.Parse();
|
||||
return script;
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ namespace Upsilon
|
|||
public static Script ParseInputAndEvaluate(string input, ScriptOptions options = null)
|
||||
{
|
||||
if (options == null) options = DefaultOptions;
|
||||
var script = new Script(input, options);
|
||||
var script = new Script(input, "unnamed", options);
|
||||
script.Parse();
|
||||
script.Evaluate();
|
||||
return script;
|
||||
|
@ -37,19 +37,20 @@ namespace Upsilon
|
|||
{
|
||||
if (options == null) options = DefaultOptions;
|
||||
var input = options.ScriptLoader.LoadFile(fileName);
|
||||
var script = new Script(input, options);
|
||||
var script = new Script(input, fileName, options);
|
||||
script.Parse();
|
||||
script.Evaluate();
|
||||
return script;
|
||||
}
|
||||
|
||||
public static Script ContinueWith(Script script, string input)
|
||||
public static Script ContinueWith(Script script, string input, string fileName = "unnamed")
|
||||
{
|
||||
var s = Script.ContinueWith(script, input);
|
||||
var s = Script.ContinueWith(script, fileName, input);
|
||||
s.Parse();
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
public static Script ContinueWith(Script script, BoundScript bound)
|
||||
{
|
||||
var s = Script.ContinueWith(script, bound);
|
||||
|
|
|
@ -16,7 +16,7 @@ namespace Upsilon
|
|||
var moduleScript = script.Options.ScriptLoader.LoadModule(name);
|
||||
if (moduleScript == null)
|
||||
return null;
|
||||
var parsed = Executor.ContinueWith(script, moduleScript);
|
||||
var parsed = Executor.ContinueWith(script, moduleScript, name);
|
||||
module = parsed.Bind();
|
||||
_cachedModules.Add(name, module);
|
||||
return module;
|
||||
|
|
Loading…
Reference in New Issue