static Method ParseInternalMethodName()

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);
        }