public static NonEscapedString Render(Job job) { if (job == null) { return(new NonEscapedString("<em>Can not find the target method.</em>")); } var builder = new StringBuilder(); builder.Append(WrapKeyword("using")); builder.Append(" "); builder.Append(Encode(job.Type.Namespace)); builder.Append(";"); builder.AppendLine(); builder.AppendLine(); if (!job.Method.IsStatic) { var serviceName = GetNameWithoutGenericArity(job.Type); if (job.Type.IsInterface && serviceName[0] == 'I' && Char.IsUpper(serviceName[1])) { serviceName = serviceName.Substring(1); } serviceName = Char.ToLower(serviceName[0]) + serviceName.Substring(1); builder.Append(WrapType(job.Type.ToGenericTypeString())); builder.AppendFormat( " {0} = Activate<{1}>();", Encode(serviceName), WrapType(Encode(job.Type.ToGenericTypeString()))); builder.AppendLine(); builder.Append(Encode(serviceName)); } else { builder.Append(WrapType(Encode(job.Type.ToGenericTypeString()))); } builder.Append("."); builder.Append(Encode(job.Method.Name)); builder.Append("("); var parameters = job.Method.GetParameters(); var renderedArguments = new List <string>(parameters.Length); var renderedArgumentsTotalLength = 0; const int splitStringMinLength = 100; for (var i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; if (i < job.Arguments.Length) { var argument = job.Arguments[i]; // TODO: check bounds string renderedArgument; var enumerableArgument = GetIEnumerableGenericArgument(parameter.ParameterType); object argumentValue; bool isJson = true; try { argumentValue = JobHelper.FromJson(argument, parameter.ParameterType); } catch (Exception) { // If argument value is not encoded as JSON (an old // way using TypeConverter), we should display it as is. argumentValue = argument; isJson = false; } if (argumentValue == null) { renderedArgument = WrapKeyword("null"); } else { if (enumerableArgument == null) { var argumentRenderer = ArgumentRenderer.GetRenderer(parameter.ParameterType); renderedArgument = argumentRenderer.Render(isJson, argumentValue.ToString(), argument); } else { var renderedItems = new List <string>(); foreach (var item in (IEnumerable)argumentValue) { var argumentRenderer = ArgumentRenderer.GetRenderer(enumerableArgument); renderedItems.Add(argumentRenderer.Render(isJson, item.ToString(), JobHelper.ToJson(item))); } renderedArgument = String.Format( WrapKeyword("new") + "{0} {{ {1} }}", parameter.ParameterType.IsArray ? " []" : "", String.Join(", ", renderedItems)); } } renderedArguments.Add(renderedArgument); renderedArgumentsTotalLength += renderedArgument.Length; } else { renderedArguments.Add(Encode("<NO VALUE>")); } } for (int i = 0; i < renderedArguments.Count; i++) { // TODO: be aware of out of range var parameter = parameters[i]; var tooltipPosition = "top"; var renderedArgument = renderedArguments[i]; if (renderedArgumentsTotalLength > splitStringMinLength) { builder.AppendLine(); builder.Append(" "); tooltipPosition = "left"; } else if (i > 0) { builder.Append(" "); } builder.AppendFormat( "<span title=\"{0}:\" data-placement=\"{1}\">", parameter.Name, tooltipPosition); builder.Append(renderedArgument); builder.Append("</span>"); if (i < renderedArguments.Count - 1) { builder.Append(","); } } builder.Append(");"); return(new NonEscapedString(builder.ToString())); }
public static NonEscapedString Render(Job job) { if (job == null) { return(new NonEscapedString($"<em>{Encode(Strings.Common_CannotFindTargetMethod)}</em>")); } var builder = new StringBuilder(); builder.Append(WrapKeyword("using")); builder.Append(" "); builder.Append(Encode(job.Type.Namespace)); builder.Append(";"); builder.AppendLine(); builder.AppendLine(); string serviceName = null; if (!job.Method.IsStatic) { serviceName = GetNameWithoutGenericArity(job.Type); if (job.Type.GetTypeInfo().IsInterface&& serviceName[0] == 'I' && Char.IsUpper(serviceName[1])) { serviceName = serviceName.Substring(1); } serviceName = Char.ToLower(serviceName[0]) + serviceName.Substring(1); builder.Append(WrapKeyword("var")); builder.Append( $" {Encode(serviceName)} = Activate<{WrapType(Encode(job.Type.ToGenericTypeString()))}>();"); builder.AppendLine(); } if (job.Method.GetCustomAttribute <AsyncStateMachineAttribute>() != null || job.Method.ReturnType.IsTaskLike(out _)) { builder.Append($"{WrapKeyword("await")} "); } builder.Append(!job.Method.IsStatic ? Encode(serviceName) : WrapType(Encode(job.Type.ToGenericTypeString()))); builder.Append("."); builder.Append(Encode(job.Method.Name)); if (job.Method.IsGenericMethod) { var genericArgumentTypes = job.Method.GetGenericArguments() .Select(x => WrapType(x.Name)) .ToArray(); builder.Append($"<{String.Join(", ", genericArgumentTypes)}>"); } builder.Append("("); var parameters = job.Method.GetParameters(); var renderedArguments = new List <string>(parameters.Length); var renderedArgumentsTotalLength = 0; const int splitStringMinLength = 100; for (var i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; #pragma warning disable 618 var arguments = job.Arguments; #pragma warning restore 618 if (i < arguments.Length) { var argument = arguments[i]; if (argument != null && argument.Length > MaxArgumentToRenderSize) { renderedArguments.Add(Encode("<VALUE IS TOO BIG>")); continue; } string renderedArgument; var enumerableArgument = GetIEnumerableGenericArgument(parameter.ParameterType); object argumentValue; bool isJson = true; try { argumentValue = SerializationHelper.Deserialize(argument, parameter.ParameterType, SerializationOption.User); } catch (Exception) { // If argument value is not encoded as JSON (an old // way using TypeConverter), we should display it as is. argumentValue = argument; isJson = false; } if (enumerableArgument == null || argumentValue == null) { var argumentRenderer = ArgumentRenderer.GetRenderer(parameter.ParameterType); renderedArgument = argumentRenderer.Render(isJson, argumentValue?.ToString(), argument); } else { var renderedItems = new List <string>(); // ReSharper disable once LoopCanBeConvertedToQuery foreach (var item in (IEnumerable)argumentValue) { var argumentRenderer = ArgumentRenderer.GetRenderer(enumerableArgument); renderedItems.Add(argumentRenderer.Render(isJson, item?.ToString(), SerializationHelper.Serialize(item, SerializationOption.User))); } // ReSharper disable once UseStringInterpolation renderedArgument = String.Format( "{0}{1} {{ {2} }}", WrapKeyword("new"), parameter.ParameterType.IsArray ? " []" : "", String.Join(", ", renderedItems)); } renderedArguments.Add(renderedArgument); renderedArgumentsTotalLength += renderedArgument.Length; } else { renderedArguments.Add(Encode("<NO VALUE>")); } } for (int i = 0; i < renderedArguments.Count; i++) { // TODO: be aware of out of range var parameter = parameters[i]; var tooltipPosition = "top"; var renderedArgument = renderedArguments[i]; if (renderedArgumentsTotalLength > splitStringMinLength) { builder.AppendLine(); builder.Append(" "); tooltipPosition = "left"; } else if (i > 0) { builder.Append(" "); } builder.Append($"<span title=\"{parameter.Name}\" data-placement=\"{tooltipPosition}\">"); builder.Append(renderedArgument); builder.Append("</span>"); if (i < renderedArguments.Count - 1) { builder.Append(","); } } builder.Append(");"); return(new NonEscapedString(builder.ToString())); }
public static IHtmlString Render(Job job) { if (job == null) { return(new HtmlString("<em>Can not find the target method.</em>")); } var builder = new StringBuilder(); builder.Append(WrapKeyword("using")); builder.Append(" "); builder.Append(Encode(job.Type.Namespace)); builder.Append(";"); builder.AppendLine(); builder.AppendLine(); if (!job.Method.IsStatic) { var serviceName = Char.ToLower(job.Type.Name[0]) + job.Type.Name.Substring(1); builder.Append(WrapType(job.Type.Name)); builder.AppendFormat( " {0} = Activate<{1}>();", Encode(serviceName), WrapType(Encode(job.Type.Name))); builder.AppendLine(); builder.Append(Encode(serviceName)); } else { builder.Append(WrapType(Encode(job.Type.Name))); } builder.Append("."); builder.Append(Encode(job.Method.Name)); builder.Append("("); var parameters = job.Method.GetParameters(); var renderedArguments = new List <string>(parameters.Length); var renderedArgumentsTotalLength = 0; const int splitStringMinLength = 200; for (var i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; if (i < job.Arguments.Length) { var argument = job.Arguments[i]; // TODO: check bounds var argumentRenderer = ArgumentRenderer.GetRenderer(parameter.ParameterType); var renderedArgument = argumentRenderer.Render(parameter.Name, argument); renderedArguments.Add(renderedArgument); renderedArgumentsTotalLength += renderedArgument.Length; } else { renderedArguments.Add(Encode("<NO VALUE>")); } } for (int i = 0; i < renderedArguments.Count; i++) { var renderedArgument = renderedArguments[i]; if (renderedArgumentsTotalLength > splitStringMinLength) { builder.AppendLine(); builder.Append(" "); } else if (i > 0) { builder.Append(" "); } builder.Append(renderedArgument); if (i < renderedArguments.Count - 1) { builder.Append(","); } } builder.Append(");"); return(new HtmlString(builder.ToString())); }