Changes and tweaks for the binder
This commit is contained in:
parent
796f82e823
commit
3d9b7a53e9
|
@ -1,5 +1,6 @@
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Upsilon.BaseTypes.Number;
|
using Upsilon.BaseTypes.Number;
|
||||||
using Upsilon.BaseTypes.ScriptTypeInterfaces;
|
using Upsilon.BaseTypes.ScriptTypeInterfaces;
|
||||||
using Upsilon.Evaluator;
|
using Upsilon.Evaluator;
|
||||||
|
@ -7,7 +8,7 @@ using Upsilon.Text;
|
||||||
|
|
||||||
namespace Upsilon.BaseTypes.UserData
|
namespace Upsilon.BaseTypes.UserData
|
||||||
{
|
{
|
||||||
internal class DictionaryUserData : ScriptType, IUserData, ILengthType
|
internal class DictionaryUserData : ScriptType, IUserData, ILengthType, IIterable
|
||||||
{
|
{
|
||||||
public IDictionary Dictionary { get; }
|
public IDictionary Dictionary { get; }
|
||||||
|
|
||||||
|
@ -73,5 +74,15 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
return Equals((DictionaryUserData) obj);
|
return Equals((DictionaryUserData) obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ScriptType GetValueFromIndex(ScriptType index)
|
||||||
|
{
|
||||||
|
return Dictionary[index.ToCSharpObject()].ToScriptType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<ScriptType> GetScriptEnumerator()
|
||||||
|
{
|
||||||
|
return (from object key in Dictionary.Keys
|
||||||
|
select key.ToScriptType()).GetEnumerator();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -11,7 +11,7 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
{
|
{
|
||||||
internal class ListUserData : ScriptType, IUserData, IIterable, ILengthType
|
internal class ListUserData : ScriptType, IUserData, IIterable, ILengthType
|
||||||
{
|
{
|
||||||
private IList List { get; }
|
public IList List { get; }
|
||||||
|
|
||||||
public ListUserData(IList list)
|
public ListUserData(IList list)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Upsilon.BaseTypes.Number;
|
using Upsilon.BaseTypes.Number;
|
||||||
using Upsilon.BaseTypes.ScriptTypeInterfaces;
|
using Upsilon.BaseTypes.ScriptTypeInterfaces;
|
||||||
|
@ -141,12 +143,6 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
return Convert.ChangeType(numeric.ToCSharpObject(), typeCode);
|
return Convert.ChangeType(numeric.ToCSharpObject(), typeCode);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TypeCode.Object:
|
|
||||||
if (value is ScriptType t)
|
|
||||||
{
|
|
||||||
return t.ToCSharpObject();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value is ScriptNull)
|
if (value is ScriptNull)
|
||||||
|
@ -154,6 +150,44 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
return null;
|
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 isScriptTypeRequired = typeof(ScriptType).IsAssignableFrom(type);
|
||||||
var isScriptType = value is ScriptType;
|
var isScriptType = value is ScriptType;
|
||||||
if (!isScriptTypeRequired && isScriptType)
|
if (!isScriptTypeRequired && isScriptType)
|
||||||
|
@ -166,18 +200,6 @@ namespace Upsilon.BaseTypes.UserData
|
||||||
return value.ToScriptType();
|
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;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue