From c1fd6081fd9046ddad6755e873b4135751aec7f5 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Thu, 17 Jan 2019 18:34:58 +0100 Subject: [PATCH] Better handling of finding bottom node --- Upsilon/Binder/Binder.cs | 4 +-- .../BoundExpressions/BoundBadExpression.cs | 4 --- .../BoundExpressions/BoundBinaryExpression.cs | 19 ----------- .../BoundFunctionCallExpression.cs | 23 ------------- .../BoundFunctionExpression.cs | 17 ---------- .../BoundExpressions/BoundIndexExpression.cs | 25 -------------- .../BoundLiteralExpression.cs | 4 --- .../BoundExpressions/BoundTableExpression.cs | 11 ------ .../BoundExpressions/BoundUnaryExpression.cs | 9 ----- .../BoundVariableExpression.cs | 4 --- Upsilon/Binder/BoundNode.cs | 23 ++++++++++++- .../BoundStatements/BoundBlockStatement.cs | 14 -------- .../BoundStatements/BoundBreakStatement.cs | 4 --- .../BoundExpressionStatement.cs | 6 ---- .../BoundFunctionAssignmentStatement.cs | 8 ----- .../BoundGenericForStatement.cs | 22 ++++-------- .../BoundStatements/BoundIfStatement.cs | 34 ------------------- .../BoundMultiAssignmentStatement.cs | 8 ----- .../BoundNumericForStatement.cs | 16 --------- .../BoundStatements/BoundReturnStatement.cs | 7 ---- Upsilon/Binder/BoundStatements/BoundScript.cs | 4 --- .../BoundTableAssigmentStatement.cs | 10 ------ .../BoundVariableAssignment.cs | 10 ------ .../BoundStatements/BoundWhileStatement.cs | 10 ------ .../UnboundFunctionExpression.cs | 17 ---------- Upsilon/Evaluator/Evaluator.cs | 8 ++--- Upsilon/Text/TextSpan.cs | 6 ++-- 27 files changed, 38 insertions(+), 289 deletions(-) diff --git a/Upsilon/Binder/Binder.cs b/Upsilon/Binder/Binder.cs index 05ddedd..580398c 100644 --- a/Upsilon/Binder/Binder.cs +++ b/Upsilon/Binder/Binder.cs @@ -896,12 +896,12 @@ namespace Upsilon.Binder private BoundStatement BindGenericForStatement(GenericForStatementSyntax e) { Scope = new BoundScope(Scope); - var array = ImmutableArray.CreateBuilder(); + var array = ImmutableArray.CreateBuilder(); foreach (var variableIdentifier in e.Variables) { var variable = new VariableSymbol(variableIdentifier.Name, Type.Unknown, true); Scope.DefineLocalVariable(variable); - array.Add(variable); + array.Add(new BoundVariableSymbol(variable, true, variableIdentifier.Span)); } var boundEnumerableExpression = BindExpression(e.EnumerableExpression); var block = BindBlockStatement(e.Block); diff --git a/Upsilon/Binder/BoundExpressions/BoundBadExpression.cs b/Upsilon/Binder/BoundExpressions/BoundBadExpression.cs index 3f3df68..de7c972 100644 --- a/Upsilon/Binder/BoundExpressions/BoundBadExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundBadExpression.cs @@ -11,10 +11,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundBadExpression; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - yield break; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundExpressions/BoundBinaryExpression.cs b/Upsilon/Binder/BoundExpressions/BoundBinaryExpression.cs index 588628a..28b736c 100644 --- a/Upsilon/Binder/BoundExpressions/BoundBinaryExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundBinaryExpression.cs @@ -17,25 +17,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundBinaryExpression; - public override IEnumerable GetNodeAtPosition(int line, int character) - { - if (LeftExpression.Span.Contains(line, character)) - { - foreach (var exp in LeftExpression.GetNodeAtPosition(line, character)) - { - yield return exp; - } - } - if (RightExpression.Span.Contains(line, character)) - { - foreach (var exp in RightExpression.GetNodeAtPosition(line, character)) - { - yield return exp; - } - } - yield return this; - } - public override IEnumerable GetChildren() { yield return LeftExpression; diff --git a/Upsilon/Binder/BoundExpressions/BoundFunctionCallExpression.cs b/Upsilon/Binder/BoundExpressions/BoundFunctionCallExpression.cs index 5ca4684..c98b876 100644 --- a/Upsilon/Binder/BoundExpressions/BoundFunctionCallExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundFunctionCallExpression.cs @@ -19,29 +19,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundFunctionCallExpression; - public override IEnumerable GetNodeAtPosition(int line, int character) - { - if (Identifier.Span.Contains(line, character)) - { - foreach (var exp in Identifier.GetNodeAtPosition(line, character)) - { - yield return exp; - } - - } - foreach (var parameter in Parameters) - { - if (parameter.Span.Contains(line, character)) - { - foreach (var exp in parameter.GetNodeAtPosition(line, character)) - { - yield return exp; - } - - } - } - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundExpressions/BoundFunctionExpression.cs b/Upsilon/Binder/BoundExpressions/BoundFunctionExpression.cs index 10fecd2..853fbb3 100644 --- a/Upsilon/Binder/BoundExpressions/BoundFunctionExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundFunctionExpression.cs @@ -21,23 +21,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundFunctionExpression; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - foreach (var parameter in Parameters) - { - if (parameter.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in parameter.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - } - if (Block.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in Block.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundExpressions/BoundIndexExpression.cs b/Upsilon/Binder/BoundExpressions/BoundIndexExpression.cs index c2057ea..4fe3ae3 100644 --- a/Upsilon/Binder/BoundExpressions/BoundIndexExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundIndexExpression.cs @@ -18,20 +18,6 @@ namespace Upsilon.Binder public BoundExpression Index { get; } public override BoundKind Kind => BoundKind.BoundIndexExpression; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Identifier.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in Identifier.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - if (Index.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in Index.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - yield return this; - } public override IEnumerable GetChildren() { @@ -55,17 +41,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundFullstopIndexExpression; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Expression.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in Expression.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - - } - - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundExpressions/BoundLiteralExpression.cs b/Upsilon/Binder/BoundExpressions/BoundLiteralExpression.cs index 9452bea..b6d1978 100644 --- a/Upsilon/Binder/BoundExpressions/BoundLiteralExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundLiteralExpression.cs @@ -12,10 +12,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundLiteralExpression; - public override IEnumerable GetNodeAtPosition(int line, int character) - { - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundExpressions/BoundTableExpression.cs b/Upsilon/Binder/BoundExpressions/BoundTableExpression.cs index a91604a..d6bc072 100644 --- a/Upsilon/Binder/BoundExpressions/BoundTableExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundTableExpression.cs @@ -18,17 +18,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundTableExpression; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - foreach (var statement in Statements) - { - if (statement.Span.Contains(linePosition, characterPosition)) - { - yield return statement; - } - } - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundExpressions/BoundUnaryExpression.cs b/Upsilon/Binder/BoundExpressions/BoundUnaryExpression.cs index eb97626..6e167ca 100644 --- a/Upsilon/Binder/BoundExpressions/BoundUnaryExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundUnaryExpression.cs @@ -7,15 +7,6 @@ namespace Upsilon.Binder public class BoundUnaryExpression : BoundExpression { public override BoundKind Kind => BoundKind.BoundUnaryExpression; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (InExpression.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in InExpression.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundExpressions/BoundVariableExpression.cs b/Upsilon/Binder/BoundExpressions/BoundVariableExpression.cs index b792e57..19937e0 100644 --- a/Upsilon/Binder/BoundExpressions/BoundVariableExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundVariableExpression.cs @@ -14,10 +14,6 @@ namespace Upsilon.Binder public BoundVariableSymbol Variable { get; } public override BoundKind Kind => BoundKind.VariableExpression; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - yield return Variable; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundNode.cs b/Upsilon/Binder/BoundNode.cs index 1978b24..fd10e24 100644 --- a/Upsilon/Binder/BoundNode.cs +++ b/Upsilon/Binder/BoundNode.cs @@ -13,7 +13,28 @@ namespace Upsilon.Binder public abstract BoundKind Kind { get; } public TextSpan Span { get; } - public abstract IEnumerable GetNodeAtPosition(int linePosition, int characterPosition); + public virtual IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) + { + var e = GetChildren().GetEnumerator(); + while (e.MoveNext()) + { + var current = e.Current; + if (current == null) + continue; + if (current.Span.Contains(linePosition, characterPosition)) + { + var children = current.GetNodeAtPosition(linePosition, characterPosition); + foreach (var child in children) + { + yield return child; + } + } + } + e.Dispose(); + + if (Span.Contains(linePosition, characterPosition)) + yield return this; + } public abstract IEnumerable GetChildren(); } } \ No newline at end of file diff --git a/Upsilon/Binder/BoundStatements/BoundBlockStatement.cs b/Upsilon/Binder/BoundStatements/BoundBlockStatement.cs index c8dfbf1..4b15179 100644 --- a/Upsilon/Binder/BoundStatements/BoundBlockStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundBlockStatement.cs @@ -13,20 +13,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundBlockStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - foreach (var statement in Statements) - { - if (statement.Span.Contains(linePosition, characterPosition)) - { - foreach (var node in statement.GetNodeAtPosition(linePosition, characterPosition)) - { - yield return node; - } - } - } - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundBreakStatement.cs b/Upsilon/Binder/BoundStatements/BoundBreakStatement.cs index ec9ba87..acc08c7 100644 --- a/Upsilon/Binder/BoundStatements/BoundBreakStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundBreakStatement.cs @@ -10,10 +10,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundBreakStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundExpressionStatement.cs b/Upsilon/Binder/BoundStatements/BoundExpressionStatement.cs index afd175c..0ce8699 100644 --- a/Upsilon/Binder/BoundStatements/BoundExpressionStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundExpressionStatement.cs @@ -7,12 +7,6 @@ namespace Upsilon.Binder { public BoundExpression Expression { get; } public override BoundKind Kind => BoundKind.BoundExpressionStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - foreach (var boundNode in Expression.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundFunctionAssignmentStatement.cs b/Upsilon/Binder/BoundStatements/BoundFunctionAssignmentStatement.cs index de57fc9..186df83 100644 --- a/Upsilon/Binder/BoundStatements/BoundFunctionAssignmentStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundFunctionAssignmentStatement.cs @@ -16,14 +16,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundFunctionAssignmentStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Func.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in Func.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundGenericForStatement.cs b/Upsilon/Binder/BoundStatements/BoundGenericForStatement.cs index f175efd..8aa0d07 100644 --- a/Upsilon/Binder/BoundStatements/BoundGenericForStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundGenericForStatement.cs @@ -7,11 +7,11 @@ namespace Upsilon.Binder { public class BoundGenericForStatement : BoundStatement { - public ImmutableArray Variables { get; } + public ImmutableArray Variables { get; } public BoundExpression BoundEnumerableExpression { get; } public BoundStatement Block { get; } - public BoundGenericForStatement(ImmutableArray variables, + public BoundGenericForStatement(ImmutableArray variables, BoundExpression boundEnumerableExpression, BoundStatement block, TextSpan span) : base(span) { Variables = variables; @@ -20,23 +20,13 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundGenericForStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (BoundEnumerableExpression.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in BoundEnumerableExpression.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - if (Block.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in Block.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - yield return this; - } public override IEnumerable GetChildren() { + foreach (var variable in Variables) + { + yield return variable; + } yield return BoundEnumerableExpression; yield return Block; } diff --git a/Upsilon/Binder/BoundStatements/BoundIfStatement.cs b/Upsilon/Binder/BoundStatements/BoundIfStatement.cs index f8e5306..5e54c07 100644 --- a/Upsilon/Binder/BoundStatements/BoundIfStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundIfStatement.cs @@ -25,31 +25,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundIfStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Condition.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in Condition.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - if (Block.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in Block.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - if (NextElseIf != null && NextElseIf.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in NextElseIf.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - if (ElseStatement != null && ElseStatement.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in ElseStatement.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - yield return this; - } - public override IEnumerable GetChildren() { yield return Condition; @@ -74,15 +49,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundElseStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Block.Span.Contains(linePosition, characterPosition)) - { - foreach (var boundNode in Block.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundMultiAssignmentStatement.cs b/Upsilon/Binder/BoundStatements/BoundMultiAssignmentStatement.cs index 3d97f66..540479c 100644 --- a/Upsilon/Binder/BoundStatements/BoundMultiAssignmentStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundMultiAssignmentStatement.cs @@ -18,14 +18,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundMultiAssignmentStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Assignment.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in Assignment.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundNumericForStatement.cs b/Upsilon/Binder/BoundStatements/BoundNumericForStatement.cs index 489f278..3363bdc 100644 --- a/Upsilon/Binder/BoundStatements/BoundNumericForStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundNumericForStatement.cs @@ -23,22 +23,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundNumericForStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (BoundStart.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in BoundStart.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - if (BoundStop.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in BoundStop.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - if (BoundStep.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in BoundStep.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - if (Block.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in Block.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundReturnStatement.cs b/Upsilon/Binder/BoundStatements/BoundReturnStatement.cs index 2121f69..fb9f0de 100644 --- a/Upsilon/Binder/BoundStatements/BoundReturnStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundReturnStatement.cs @@ -12,13 +12,6 @@ namespace Upsilon.Binder public BoundExpression Expression { get; } public override BoundKind Kind => BoundKind.BoundReturnStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Expression.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in Expression.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundScript.cs b/Upsilon/Binder/BoundStatements/BoundScript.cs index 75644a8..e807895 100644 --- a/Upsilon/Binder/BoundStatements/BoundScript.cs +++ b/Upsilon/Binder/BoundStatements/BoundScript.cs @@ -18,10 +18,6 @@ namespace Upsilon.Binder public string FileName { get; set; } public override BoundKind Kind => BoundKind.BoundScript; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - foreach (var boundNode in Statement.GetNodeAtPosition(linePosition, characterPosition)) yield return boundNode; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundTableAssigmentStatement.cs b/Upsilon/Binder/BoundStatements/BoundTableAssigmentStatement.cs index 0f427ff..e0a16d7 100644 --- a/Upsilon/Binder/BoundStatements/BoundTableAssigmentStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundTableAssigmentStatement.cs @@ -16,16 +16,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundTableAssigmentStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (TableIndexExpression.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in TableIndexExpression.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - if (Value.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in Value.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundVariableAssignment.cs b/Upsilon/Binder/BoundStatements/BoundVariableAssignment.cs index 3ab0e94..bf20c88 100644 --- a/Upsilon/Binder/BoundStatements/BoundVariableAssignment.cs +++ b/Upsilon/Binder/BoundStatements/BoundVariableAssignment.cs @@ -18,16 +18,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundAssignmentStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Variable.Span.Contains(linePosition, characterPosition)) - yield return Variable; - if (BoundExpression.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in BoundExpression.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/BoundWhileStatement.cs b/Upsilon/Binder/BoundStatements/BoundWhileStatement.cs index e5e6a38..e5ef10f 100644 --- a/Upsilon/Binder/BoundStatements/BoundWhileStatement.cs +++ b/Upsilon/Binder/BoundStatements/BoundWhileStatement.cs @@ -17,16 +17,6 @@ namespace Upsilon.Binder } public override BoundKind Kind => BoundKind.BoundWhileStatement; - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - if (Condition.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in Condition.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - if (Block.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in Block.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - yield return this; - } public override IEnumerable GetChildren() { diff --git a/Upsilon/Binder/BoundStatements/UnboundFunctionExpression.cs b/Upsilon/Binder/BoundStatements/UnboundFunctionExpression.cs index b48e65e..6c1532e 100644 --- a/Upsilon/Binder/BoundStatements/UnboundFunctionExpression.cs +++ b/Upsilon/Binder/BoundStatements/UnboundFunctionExpression.cs @@ -19,22 +19,5 @@ namespace Upsilon.Binder public BlockStatementSyntax UnboundBlock { get; } - public override IEnumerable GetNodeAtPosition(int linePosition, int characterPosition) - { - foreach (var parameter in Parameters) - { - if (parameter.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in parameter.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - - if (Block != null) - { - if (Block.Span.Contains(linePosition, characterPosition)) - foreach (var boundNode in Block.GetNodeAtPosition(linePosition, characterPosition)) - yield return boundNode; - } - yield return this; - } } } \ No newline at end of file diff --git a/Upsilon/Evaluator/Evaluator.cs b/Upsilon/Evaluator/Evaluator.cs index 882dccc..f9913af 100644 --- a/Upsilon/Evaluator/Evaluator.cs +++ b/Upsilon/Evaluator/Evaluator.cs @@ -733,10 +733,10 @@ namespace Upsilon.Evaluator } var table = (SimpleScriptTable)current; - if (e.Variables[0].Name != "_") - innerEvaluator.Scope.CreateLocal(e.Variables[0], table[0].ToScriptType()); - if (e.Variables[1].Name != "_") - innerEvaluator.Scope.CreateLocal(e.Variables[1], table[1]); + if (e.Variables[0].VariableSymbol.Name != "_") + innerEvaluator.Scope.CreateLocal(e.Variables[0].VariableSymbol, table[0].ToScriptType()); + if (e.Variables[1].VariableSymbol.Name != "_") + innerEvaluator.Scope.CreateLocal(e.Variables[1].VariableSymbol, table[1]); innerEvaluator.EvaluateBoundBlockStatement((BoundBlockStatement) e.Block); if (innerEvaluator.HasBroken || innerEvaluator.HasReturned) { diff --git a/Upsilon/Text/TextSpan.cs b/Upsilon/Text/TextSpan.cs index 968cb3e..a8dbf5c 100644 --- a/Upsilon/Text/TextSpan.cs +++ b/Upsilon/Text/TextSpan.cs @@ -27,8 +27,10 @@ namespace Upsilon.Text public bool Contains(int linePosition, int characterPosition) { - return StartLine >= linePosition && EndLine <= linePosition && characterPosition >= StartPosition && - characterPosition <= EndPosition; + if (StartLine == linePosition && StartPosition <= characterPosition) return true; + if (StartLine < linePosition && EndLine > linePosition) return true; + if (EndLine == linePosition && EndPosition >= characterPosition) return true; + return false; } } } \ No newline at end of file