Support more in tables, including local variables that are hidden from the outside
This commit is contained in:
parent
44a2048153
commit
5a52c235c5
|
@ -1,27 +1,31 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Upsilon.Binder;
|
||||
|
||||
namespace Upsilon.BaseTypes
|
||||
{
|
||||
public class LuaTable : LuaType
|
||||
{
|
||||
private Dictionary<string, LuaType> _map;
|
||||
private Dictionary<string, VariableSymbol> _variableLookup;
|
||||
private Dictionary<VariableSymbol, LuaType> _map;
|
||||
|
||||
public LuaTable()
|
||||
{
|
||||
_map = new Dictionary<string, LuaType>();
|
||||
_map = new Dictionary<VariableSymbol, LuaType>();
|
||||
_variableLookup = new Dictionary<string, VariableSymbol>();
|
||||
}
|
||||
|
||||
public LuaTable(Dictionary<string, LuaType> map)
|
||||
public LuaTable(Dictionary<VariableSymbol, LuaType> map)
|
||||
{
|
||||
_map = map;
|
||||
_variableLookup = map.ToDictionary(x => x.Key.Name, x => x.Key);
|
||||
}
|
||||
|
||||
|
||||
public override Type Type => Type.Table;
|
||||
public override object ToCSharpObject()
|
||||
{
|
||||
return _map.ToDictionary(x => x.Key, x => x.Value.ToCSharpObject());
|
||||
return _map.Where(x => !x.Key.Local).ToDictionary(x => x.Key.Name, x => x.Value.ToCSharpObject());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -249,9 +249,11 @@ namespace Upsilon.Evaluator
|
|||
if (boundFunctionStatement.Identifier.Local)
|
||||
Scope.Set(boundFunctionStatement.Identifier, func);
|
||||
else
|
||||
{
|
||||
Scope.SetGlobal(boundFunctionStatement.Identifier, func);
|
||||
_lastValue = func;
|
||||
}
|
||||
}
|
||||
|
||||
private void EvaluateUnboundFunctionStatement(UnboundFunctionStatement unboundFunctionStatement)
|
||||
{
|
||||
|
@ -293,7 +295,7 @@ namespace Upsilon.Evaluator
|
|||
|
||||
private LuaType EvaluateTableExpression(BoundTableExpression e)
|
||||
{
|
||||
var dic = new Dictionary<string, LuaType>();
|
||||
var dic = new Dictionary<VariableSymbol, LuaType>();
|
||||
var innerEvaluator = new Evaluator(_diagnostics, Scope);
|
||||
var currentPos = 1;
|
||||
foreach (var boundStatement in e.Statements)
|
||||
|
@ -301,14 +303,17 @@ namespace Upsilon.Evaluator
|
|||
if (boundStatement.Kind == BoundKind.BoundAssignmentStatement)
|
||||
{
|
||||
var assignment = (BoundVariableAssignment)boundStatement;
|
||||
var key = assignment.Variable.Name;
|
||||
var key = assignment.Variable;
|
||||
var value = EvaluateExpression(assignment.BoundExpression);
|
||||
dic.Add(key, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
innerEvaluator.EvaluateStatement(boundStatement);
|
||||
dic.Add(currentPos.ToString(), innerEvaluator._lastValue);
|
||||
if (innerEvaluator._lastValue != null)
|
||||
dic.Add(new VariableSymbol(currentPos.ToString(), innerEvaluator._lastValue.Type, false),
|
||||
innerEvaluator._lastValue);
|
||||
innerEvaluator._lastValue = null;
|
||||
}
|
||||
currentPos++;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue