diff --git a/Upsilon/BaseTypes/ScriptFunction.cs b/Upsilon/BaseTypes/ScriptFunction.cs index b4d0a2b..4c15a78 100644 --- a/Upsilon/BaseTypes/ScriptFunction.cs +++ b/Upsilon/BaseTypes/ScriptFunction.cs @@ -28,10 +28,10 @@ namespace Upsilon.BaseTypes internal class ScriptInternalFunction : ScriptFunction, IScopeOwner { public BoundBlockStatement Block { get; } - public ImmutableArray Parameters { get; } + public ImmutableArray Parameters { get; } public EvaluationScope EvaluationScope { get; } - public ScriptInternalFunction(ImmutableArray parameters, BoundBlockStatement block, + public ScriptInternalFunction(ImmutableArray parameters, BoundBlockStatement block, EvaluationScope evaluationScope) { Parameters = parameters; @@ -46,7 +46,7 @@ namespace Upsilon.BaseTypes { var parameterVariable = Parameters[i]; var parameterValue = variables[i]; - innerEvaluator.Scope.CreateLocal(parameterVariable, parameterValue); + innerEvaluator.Scope.CreateLocal(parameterVariable.VariableSymbol, parameterValue); } return innerEvaluator.EvaluateNode(Block); } diff --git a/Upsilon/Binder/Binder.cs b/Upsilon/Binder/Binder.cs index de4b621..94a6cd9 100644 --- a/Upsilon/Binder/Binder.cs +++ b/Upsilon/Binder/Binder.cs @@ -44,7 +44,7 @@ namespace Upsilon.Binder Scope = new BoundScope(Scope); foreach (var valueParameter in unboundFunctionStatement.Value.Parameters) { - Scope.AssignToNearest(valueParameter); + Scope.AssignToNearest(valueParameter.VariableSymbol); } unboundFunctionStatement.Value.Block = (BoundBlockStatement) BindBlockStatement(unboundFunctionStatement.Value.UnboundBlock); @@ -377,11 +377,11 @@ namespace Upsilon.Binder private BoundExpression BindFunctionExpression(FunctionExpressionSyntax e, string variableSymbol = null) { var innerScope = new BoundScope(Scope); - var parameters = ImmutableArray.CreateBuilder(); + var parameters = ImmutableArray.CreateBuilder(); foreach (var identifierToken in e.Parameters) { var vari = new VariableSymbol(identifierToken.Name, Type.Unknown, true); - parameters.Add(vari); + parameters.Add(new BoundVariableSymbol(vari, identifierToken.Span)); innerScope.DefineLocalVariable(vari); } @@ -417,9 +417,9 @@ namespace Upsilon.Binder var func = (BoundFunctionExpression)BindFunctionExpression(e.FunctionExpression, name); var parameters = ImmutableArray.CreateBuilder(); - foreach (var identifierToken in func.Parameters) + foreach (var parameter in func.Parameters) { - var vari = new VariableSymbol(identifierToken.Name, Type.Unknown, true); + var vari = new VariableSymbol(parameter.VariableSymbol.Name, Type.Unknown, true); parameters.Add(vari); innerScope.DefineLocalVariable(vari); } diff --git a/Upsilon/Binder/BoundExpressions/BoundFunctionExpression.cs b/Upsilon/Binder/BoundExpressions/BoundFunctionExpression.cs index 68f3e58..24716be 100644 --- a/Upsilon/Binder/BoundExpressions/BoundFunctionExpression.cs +++ b/Upsilon/Binder/BoundExpressions/BoundFunctionExpression.cs @@ -6,10 +6,10 @@ namespace Upsilon.Binder { public class BoundFunctionExpression : BoundExpression { - public ImmutableArray Parameters { get; } + public ImmutableArray Parameters { get; } public BoundBlockStatement Block { get; set; } - public BoundFunctionExpression(ImmutableArray parameters, BoundBlockStatement block, TextSpan span) : base(span) + public BoundFunctionExpression(ImmutableArray parameters, BoundBlockStatement block, TextSpan span) : base(span) { Parameters = parameters; Block = block; @@ -18,6 +18,11 @@ namespace Upsilon.Binder public override BoundKind Kind => BoundKind.BoundFunctionExpression; public override BoundNode GetNodeAtPosition(int characterPosition) { + foreach (var parameter in Parameters) + { + if (characterPosition >= parameter.Span.Start && characterPosition <= parameter.Span.End) + return parameter.GetNodeAtPosition(characterPosition); + } if (characterPosition >= Block.Span.Start && characterPosition <= Block.Span.End) return Block.GetNodeAtPosition(characterPosition); return this; diff --git a/Upsilon/Binder/BoundExpressions/UnboundFunctionExpression.cs b/Upsilon/Binder/BoundExpressions/UnboundFunctionExpression.cs deleted file mode 100644 index 98d5e50..0000000 --- a/Upsilon/Binder/BoundExpressions/UnboundFunctionExpression.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Immutable; -using Upsilon.Parser; -using Upsilon.Text; - -namespace Upsilon.Binder -{ - public class UnboundFunctionExpression : BoundFunctionExpression - { - public UnboundFunctionExpression(ImmutableArray parameters, - BlockStatementSyntax unboundBlock, TextSpan span) : base(parameters, null, span) - { - UnboundBlock = unboundBlock; - } - - public override BoundKind Kind => BoundKind.BoundPromise; - - public BlockStatementSyntax UnboundBlock { get; } - } -} \ No newline at end of file diff --git a/Upsilon/Binder/BoundStatements/UnboundFunctionExpression.cs b/Upsilon/Binder/BoundStatements/UnboundFunctionExpression.cs new file mode 100644 index 0000000..6ffa9af --- /dev/null +++ b/Upsilon/Binder/BoundStatements/UnboundFunctionExpression.cs @@ -0,0 +1,36 @@ +using System.Collections.Immutable; +using Upsilon.Parser; +using Upsilon.Text; + +namespace Upsilon.Binder +{ + public class UnboundFunctionExpression : BoundFunctionExpression + { + public UnboundFunctionExpression(ImmutableArray parameters, + BlockStatementSyntax unboundBlock, TextSpan span) : base(parameters, null, span) + { + UnboundBlock = unboundBlock; + } + + public override BoundKind Kind => BoundKind.BoundPromise; + + public BlockStatementSyntax UnboundBlock { get; } + + public override BoundNode GetNodeAtPosition(int characterPosition) + { + foreach (var parameter in Parameters) + { + if (characterPosition >= parameter.Span.Start && characterPosition <= parameter.Span.End) + return parameter.GetNodeAtPosition(characterPosition); + } + + if (Block != null) + { + if (characterPosition >= Block.Span.Start && characterPosition <= Block.Span.End) + return Block.GetNodeAtPosition(characterPosition); + + } + return this; + } + } +} \ No newline at end of file diff --git a/Upsilon/Binder/BoundVariableSymbol.cs b/Upsilon/Binder/BoundVariableSymbol.cs index f13e970..91402f0 100644 --- a/Upsilon/Binder/BoundVariableSymbol.cs +++ b/Upsilon/Binder/BoundVariableSymbol.cs @@ -8,7 +8,6 @@ namespace Upsilon.Binder public BoundVariableSymbol(VariableSymbol variableSymbol, TextSpan span) : base(span) { VariableSymbol = variableSymbol; - Type = variableSymbol.Type; } public VariableSymbol VariableSymbol { get; } @@ -18,6 +17,6 @@ namespace Upsilon.Binder return this; } - public override Type Type { get; } + public override Type Type => VariableSymbol.Type; } } \ No newline at end of file diff --git a/Upsilon/Evaluator/Evaluator.cs b/Upsilon/Evaluator/Evaluator.cs index 10ca704..93961bc 100644 --- a/Upsilon/Evaluator/Evaluator.cs +++ b/Upsilon/Evaluator/Evaluator.cs @@ -66,7 +66,7 @@ namespace Upsilon.Evaluator { var parameter = parameters[index]; var parameterName = function.Parameters[index]; - innerEvaluator.Scope.CreateLocal(parameterName, parameter); + innerEvaluator.Scope.CreateLocal(parameterName.VariableSymbol, parameter); } var result = innerEvaluator.EvaluateNode(function.Block);