private void AddMethod(Control parent, JsonRpcMethod method)
        {
            Control methodTerm = AddGeneric(parent, "dt", !method.IsObsolete ? "method" : "method obsolete-method");
            AddSpan(methodTerm, "method-name", method.Name);
            AddSignature(methodTerm, method);

            if (method.Description.Length > 0 || method.IsObsolete)
            {
                AddGeneric(parent, "dd", "method-summary", method.Description);

                if (method.IsObsolete)
                    AddSpan(parent, "obsolete-message", " This method has been obsoleted. " + method.ObsoletionMessage);
            }
        }
        private void AddMethod(Control parent, JsonRpcMethod method)
        {
            JsonRpcObsoleteAttribute obsolete = (JsonRpcObsoleteAttribute) method.FindFirstCustomAttribute(typeof(JsonRpcObsoleteAttribute));
            
            Control methodTerm = AddGeneric(parent, "dt", obsolete == null ? "method" : "method obsolete-method");
            AddSpan(methodTerm, "method-name", method.Name);
            AddSignature(methodTerm, method);

            if (method.Description.Length > 0 || obsolete != null)
            {
                AddGeneric(parent, "dd", "method-summary", method.Description);

                if (obsolete != null)
                    AddSpan(parent, "obsolete-message", " This method has been obsoleted. " + obsolete.Message);
            }
        }
        private static void AddSignature(Control parent, JsonRpcMethod method)
        {
            Control methodSignatureSpan = AddSpan(parent, "method-sig", null);
            AddSpan(methodSignatureSpan, "method-param-open", "(");
    
            JsonRpcParameter[] parameters = method.GetParameters();
            foreach (JsonRpcParameter parameter in parameters)
            {
                if (parameter.Position > 0)
                    AddSpan(methodSignatureSpan, "method-param-delim", ", ");

                AddSpan(methodSignatureSpan, "method-param", parameter.Name);
            }
    
            AddSpan(methodSignatureSpan, "method-param-close", ")");
        }
Example #4
0
 protected virtual void DescribeJsonRpcMethod(MethodBuilder builder, JsonRpcMethod jsonRpcMethod)
 {
     builder.Hint("jsonrpc-name", jsonRpcMethod.Name);
     builder.Hint("jsonrpc-module-name", jsonRpcMethod.ModuleName);
     builder.Hint("jsonrpc-method-name", jsonRpcMethod.MethodName);
 }
Example #5
0
        protected virtual void ImplementProxyMethod(MethodInfo baseMethod, JsonRpcMethod rpcMethod, int methodIndex,
                                                    MethodBuilder implBuilder, FieldInfo realProxyField)
        {
            var gen = implBuilder.GetILGenerator();

            gen.Emit(OpCodes.Ldarg_0);                  // this
            gen.Emit(OpCodes.Ldfld, realProxyField);    // this.realProxy
            gen.Emit(OpCodes.Ldc_I4, methodIndex);      // this.realProxy, methodIndex
            var args = baseMethod.GetParameters();

            if (args.Length == 0)
            {
                gen.Emit(OpCodes.Ldnull);
            }
            else
            {
                gen.Emit(OpCodes.Ldc_I4, args.Length);
                gen.Emit(OpCodes.Newarr, typeof(object));
                for (var i = 0; i < args.Length; i++)
                {
                    gen.Emit(OpCodes.Dup);          // array
                    gen.Emit(OpCodes.Ldc_I4, i);    // index
                    gen.Emit(OpCodes.Ldarg, i + 1); // value
                    if (args[i].ParameterType.GetTypeInfo().IsValueType)
                    {
                        gen.Emit(OpCodes.Box, args[i].ParameterType);
                    }
                    // this.realProxy, methodIndex, array, array, index, value
                    gen.Emit(OpCodes.Stelem_Ref);
                    // this.realProxy, methodIndex, array
                }
            }
            var TResult = rpcMethod.ReturnParameter.ParameterType;

            if (rpcMethod.ReturnParameter.IsTask)
            {
                gen.Emit(OpCodes.Call, JsonRpcRealProxy_SendAsync.MakeGenericMethod(
                             TResult == typeof(void) ? typeof(object) : TResult));
            }
            else
            {
                if (rpcMethod.IsNotification)
                {
                    // Notification. invoke and forget.
                    if (rpcMethod.ReturnParameter.ParameterType != typeof(void))
                    {
                        throw new InvalidOperationException("Notification method can only return void or Task.");
                    }
                    gen.Emit(OpCodes.Call, JsonRpcRealProxy_SendNotification);
                }
                else
                {
                    // Message. invoke and wait.
                    if (TResult == typeof(void))
                    {
                        gen.Emit(OpCodes.Call, JsonRpcRealProxy_Send.MakeGenericMethod(typeof(object)));
                        gen.Emit(OpCodes.Pop);
                    }
                    else
                    {
                        gen.Emit(OpCodes.Call, JsonRpcRealProxy_Send.MakeGenericMethod(TResult));
                    }
                }
            }
            gen.Emit(OpCodes.Ret);
        }