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