From 3d9b7a53e9047d3cc86ce05508eef13397700803 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 9 Dec 2018 20:53:07 +0100 Subject: [PATCH] Changes and tweaks for the binder --- .../BaseTypes/UserData/DictionaryUserData.cs | 13 ++++- Upsilon/BaseTypes/UserData/ListUserData.cs | 2 +- Upsilon/BaseTypes/UserData/UpsilonBinder.cs | 58 +++++++++++++------ 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/Upsilon/BaseTypes/UserData/DictionaryUserData.cs b/Upsilon/BaseTypes/UserData/DictionaryUserData.cs index 4b0a5f0..10c865a 100644 --- a/Upsilon/BaseTypes/UserData/DictionaryUserData.cs +++ b/Upsilon/BaseTypes/UserData/DictionaryUserData.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using System.Linq; using Upsilon.BaseTypes.Number; using Upsilon.BaseTypes.ScriptTypeInterfaces; using Upsilon.Evaluator; @@ -7,7 +8,7 @@ using Upsilon.Text; namespace Upsilon.BaseTypes.UserData { - internal class DictionaryUserData : ScriptType, IUserData, ILengthType + internal class DictionaryUserData : ScriptType, IUserData, ILengthType, IIterable { public IDictionary Dictionary { get; } @@ -73,5 +74,15 @@ namespace Upsilon.BaseTypes.UserData return Equals((DictionaryUserData) obj); } + public ScriptType GetValueFromIndex(ScriptType index) + { + return Dictionary[index.ToCSharpObject()].ToScriptType(); + } + + public IEnumerator GetScriptEnumerator() + { + return (from object key in Dictionary.Keys + select key.ToScriptType()).GetEnumerator(); + } } } \ No newline at end of file diff --git a/Upsilon/BaseTypes/UserData/ListUserData.cs b/Upsilon/BaseTypes/UserData/ListUserData.cs index b6cd1d0..4c0cf41 100644 --- a/Upsilon/BaseTypes/UserData/ListUserData.cs +++ b/Upsilon/BaseTypes/UserData/ListUserData.cs @@ -11,7 +11,7 @@ namespace Upsilon.BaseTypes.UserData { internal class ListUserData : ScriptType, IUserData, IIterable, ILengthType { - private IList List { get; } + public IList List { get; } public ListUserData(IList list) { diff --git a/Upsilon/BaseTypes/UserData/UpsilonBinder.cs b/Upsilon/BaseTypes/UserData/UpsilonBinder.cs index 6f88859..9e4f7a8 100644 --- a/Upsilon/BaseTypes/UserData/UpsilonBinder.cs +++ b/Upsilon/BaseTypes/UserData/UpsilonBinder.cs @@ -1,6 +1,8 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Globalization; +using System.Linq; using System.Reflection; using Upsilon.BaseTypes.Number; using Upsilon.BaseTypes.ScriptTypeInterfaces; @@ -141,12 +143,6 @@ namespace Upsilon.BaseTypes.UserData return Convert.ChangeType(numeric.ToCSharpObject(), typeCode); } break; - case TypeCode.Object: - if (value is ScriptType t) - { - return t.ToCSharpObject(); - } - break; } if (value is ScriptNull) @@ -154,6 +150,44 @@ namespace Upsilon.BaseTypes.UserData return null; } + var valueType = value.GetType(); + if (type == typeof(IIterable)) + { + if (typeof(IDictionary).IsAssignableFrom(valueType)) + { + return new DictionaryUserData((IDictionary) value); + } + if (typeof(IList).IsAssignableFrom(valueType)) + { + return new ListUserData((IList) value); + } + } + + if (typeof(IDictionary).IsAssignableFrom(type)) + { + if (value is DictionaryUserData d) + return d.Dictionary; + if (value is ScriptTable.ScriptTable table) + { + var generics = type.GetGenericArguments(); + var d1 = typeof(Dictionary<,>); + var requiredDictionaryType = d1.MakeGenericType(typeof(string), generics[1]); + var dictionary = (IDictionary)Activator.CreateInstance(requiredDictionaryType); + foreach (var variable in table.EvaluationScope.Variables) + { + dictionary.Add(variable.Key, variable.Value.ToCSharpObject()); + } + return dictionary; + } + } + if (typeof(IList).IsAssignableFrom(type)) + { + if (value is ListUserData d) + return d.List; + if (value is ScriptTable.ScriptTable table) + return table.EvaluationScope.Variables.Select(x => x.Value.ToCSharpObject()); + } + var isScriptTypeRequired = typeof(ScriptType).IsAssignableFrom(type); var isScriptType = value is ScriptType; if (!isScriptTypeRequired && isScriptType) @@ -166,18 +200,6 @@ namespace Upsilon.BaseTypes.UserData return value.ToScriptType(); } - if (type == typeof(IIterable)) - { - var valueType = value.GetType(); - if (typeof(IDictionary).IsAssignableFrom(valueType)) - { - return new DictionaryUserData((IDictionary) value); - } - if (typeof(IList).IsAssignableFrom(valueType)) - { - return new ListUserData((IList) value); - } - } return value; }