Better error handling for setting userdata values

This commit is contained in:
2018-11-21 14:04:43 +01:00
parent 605b98284d
commit 8dd2be8c67
3 changed files with 45 additions and 7 deletions

View File

@@ -37,10 +37,10 @@ namespace Upsilon.BaseTypes.UserData
public void Set(Diagnostics diagnostics, TextSpan span, string s, LuaType value)
{
var failed = _typeInfo.Set(Value, s, value);
var (failed, error) = _typeInfo.Set(Value, s, value);
if (failed)
{
diagnostics.LogError($"Cannot find member '{s}' on type '{Value.GetType()}'", span);
diagnostics.LogError(error, span);
}
}

View File

@@ -53,23 +53,27 @@ namespace Upsilon.BaseTypes.UserData
return (null, true);
}
public bool Set(object value, string member, LuaType newValue)
public (bool failed, string error) Set(object value, string member, LuaType newValue)
{
member = member.ToLowerInvariant();
if (value.GetType() != Type)
return true;
return (true, "Invalid Type");
if (Variables.TryGetValue(member, out var info))
{
info.SetValue(value, newValue.ToCSharpObject());
return false;
return (false, null);
}
if (Properties.TryGetValue(member, out var property))
{
if (property.SetMethod == null || property.SetMethod.IsPrivate)
{
return (true, $"Property '{member}' on type '{Type}' does not have a publicly available setter.");
}
property.SetValue(value, newValue.ToCSharpObject());
return false;
return (false, null);
}
return true;
return (true, $"Cannot find member '{member}' on type '{Type}'");
}
public (LuaType Type, bool Failed) BinaryOperator(object value, LuaType par1, OperatorType op, LuaType par2)