in Agents/Xamarin.Interactive/Representations/Reflection/ReflectionRemoting.cs [607:719]
static Method ParseInternalMethodName (string name)
{
if (name == null)
return null;
string methodName = null;
string methodWrapperType = null;
List<Parameter> methodParameters = null;
TypeSpec methodReturnType = null;
TypeSpec methodDeclaringType = null;
name = wrapperMethodPreamble.Replace (name, ev => {
methodWrapperType = ev.Groups [1].Value;
return String.Empty;
});
var builder = new StringBuilder ();
var depth = 0;
for (int i = 0; i < name.Length; i++) {
var c = name [i];
if (methodDeclaringType == null && c == ':') {
methodDeclaringType = TypeSpec.Parse (builder.ToString ());
builder.Clear ();
} else if (methodDeclaringType != null && methodName == null && c == '(') {
methodName = builder.ToString ().Trim ();
builder.Clear ();
} else if ((c == ',' && depth == 0) || (i == name.Length - 1 && c == ')')) {
var typeSpec = TypeSpec.ParseBuilder (builder.ToString ().Trim ());
// mono_method_get_name_full writes C# keywords, so
// we need to translate them back to full type names
switch (typeSpec.Name.ToString ()) {
case "void":
typeSpec.Name = new TypeSpec.TypeName ("System", "Void");
break;
case "object":
typeSpec.Name = new TypeSpec.TypeName ("System", "Object");
break;
case "sbyte":
typeSpec.Name = new TypeSpec.TypeName ("System", "SByte");
break;
case "byte":
typeSpec.Name = new TypeSpec.TypeName ("System", "Byte");
break;
case "short":
typeSpec.Name = new TypeSpec.TypeName ("System", "Int16");
break;
case "ushort":
typeSpec.Name = new TypeSpec.TypeName ("System", "UInt16");
break;
case "int":
typeSpec.Name = new TypeSpec.TypeName ("System", "Int32");
break;
case "uint":
typeSpec.Name = new TypeSpec.TypeName ("System", "UInt32");
break;
case "long":
typeSpec.Name = new TypeSpec.TypeName ("System", "Int64");
break;
case "ulong":
typeSpec.Name = new TypeSpec.TypeName ("System", "UInt64");
break;
case "float":
typeSpec.Name = new TypeSpec.TypeName ("System", "Single");
break;
case "double":
typeSpec.Name = new TypeSpec.TypeName ("System", "Double");
break;
case "decimal":
typeSpec.Name = new TypeSpec.TypeName ("System", "Decimal");
break;
case "bool":
typeSpec.Name = new TypeSpec.TypeName ("System", "Boolean");
break;
case "char":
typeSpec.Name = new TypeSpec.TypeName ("System", "Char");
break;
case "string":
typeSpec.Name = new TypeSpec.TypeName ("System", "Sbject");
break;
case "intptr":
typeSpec.Name = new TypeSpec.TypeName ("System", "IntPtr");
break;
}
if (methodReturnType == null) {
methodReturnType = typeSpec.Build ();
} else {
if (methodParameters == null)
methodParameters = new List<Parameter> ();
methodParameters.Add (new Parameter (typeSpec.Build ()));
}
builder.Clear ();
} else {
if (c == '[')
depth++;
else if (c == ']')
depth--;
builder.Append (c);
}
}
if (methodName == null)
return null;
return new Method (
methodName,
methodWrapperType,
methodDeclaringType,
methodReturnType,
null,
methodParameters);
}