2006-06-21 Gonzalo Paniagua Javier <gonzalo@ximian.com>
* glade/HandlerNotFoundExeception.cs: * glade/XML.custom: provide a better error when the signature of a handler does not match the one of the event. svn path=/trunk/gtk-sharp/; revision=61911
This commit is contained in:
parent
7d9ac6ec4b
commit
1843575303
3 changed files with 75 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2006-06-21 Gonzalo Paniagua Javier <gonzalo@ximian.com>
|
||||
|
||||
* glade/HandlerNotFoundExeception.cs:
|
||||
* glade/XML.custom: provide a better error when the signature of a
|
||||
handler does not match the one of the event.
|
||||
|
||||
2006-05-10 Mike Kestner <mkestner@novell.com>
|
||||
|
||||
* bootstrap-2.10 : strap for the new 2.9.0 API.
|
||||
|
|
|
@ -52,6 +52,17 @@ namespace Glade {
|
|||
this.delegate_type = delegate_type;
|
||||
}
|
||||
|
||||
public HandlerNotFoundException (string message, string handler_name, string signal_name,
|
||||
EventInfo evnt, Type delegate_type)
|
||||
: base ((message != null) ? message : "No handler " + handler_name + " found for signal " + signal_name,
|
||||
null)
|
||||
{
|
||||
this.handler_name = handler_name;
|
||||
this.signal_name = signal_name;
|
||||
this.evnt = evnt;
|
||||
this.delegate_type = delegate_type;
|
||||
}
|
||||
|
||||
protected HandlerNotFoundException (SerializationInfo info, StreamingContext context)
|
||||
: base (info, context)
|
||||
{
|
||||
|
|
|
@ -257,12 +257,69 @@
|
|||
|
||||
if (!connected)
|
||||
{
|
||||
throw new HandlerNotFoundException (handler_name, signal_name, ei, delegate_type);
|
||||
string msg = ExplainError (ei.Name, delegate_type, handler_type, handler_name);
|
||||
throw new HandlerNotFoundException (msg, handler_name, signal_name, ei, delegate_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static string GetSignature (System.Reflection.MethodInfo method)
|
||||
{
|
||||
if (method == null)
|
||||
return null;
|
||||
|
||||
System.Reflection.ParameterInfo [] parameters = method.GetParameters ();
|
||||
System.Text.StringBuilder sb = new System.Text.StringBuilder ();
|
||||
sb.Append ('(');
|
||||
foreach (System.Reflection.ParameterInfo info in parameters) {
|
||||
sb.Append (info.ParameterType.ToString ());
|
||||
sb.Append (',');
|
||||
}
|
||||
if (sb.Length != 0)
|
||||
sb.Length--;
|
||||
|
||||
sb.Append (')');
|
||||
return sb.ToString ();
|
||||
}
|
||||
|
||||
static string GetSignature (Type delegate_type)
|
||||
{
|
||||
System.Reflection.MethodInfo method = delegate_type.GetMethod ("Invoke");
|
||||
return GetSignature (method);
|
||||
}
|
||||
|
||||
const System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.NonPublic |
|
||||
System.Reflection.BindingFlags.Public |
|
||||
System.Reflection.BindingFlags.Static |
|
||||
System.Reflection.BindingFlags.Instance;
|
||||
static string GetSignature (Type klass, string method_name)
|
||||
{
|
||||
try {
|
||||
System.Reflection.MethodInfo method = klass.GetMethod (method_name, flags);
|
||||
return GetSignature (method);
|
||||
} catch {
|
||||
// May be more than one method with that name and none matches
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static string ExplainError (string event_name, Type deleg, Type klass, string method)
|
||||
{
|
||||
if (deleg == null || klass == null || method == null)
|
||||
return null;
|
||||
|
||||
System.Text.StringBuilder sb = new System.Text.StringBuilder ();
|
||||
string expected = GetSignature (deleg);
|
||||
string actual = GetSignature (klass, method);
|
||||
if (actual == null)
|
||||
return null;
|
||||
sb.AppendFormat ("The handler for the event {0} should take '{1}', " +
|
||||
"but the signature of the provided handler ('{2}') is '{3}'\n",
|
||||
event_name, expected, method, actual);
|
||||
return sb.ToString ();
|
||||
}
|
||||
|
||||
System.Reflection.MemberFilter signalFilter = new System.Reflection.MemberFilter (SignalFilter);
|
||||
|
||||
|
|
Loading…
Reference in a new issue