提交 490b39d6 编写于 作者: J Jonathon Marolf

fixing stack formatting per Cyrus' suggestions

上级 1bb068a7
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
......@@ -8,8 +9,6 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation
{
internal partial class VisualStudioErrorReportingService
{
private const string AsyncMethodPrefix = "async ";
private static string GetFormattedExceptionStack(Exception exception)
{
var aggregate = exception as AggregateException;
......@@ -26,7 +25,7 @@ private static string GetStackForAggregateException(Exception exception, Aggrega
var text = GetStackForException(exception, true);
for (int i = 0; i < aggregate.InnerExceptions.Count; i++)
{
text = string.Format(ServicesVSResources._0_1_InnerException_2_3_4_5, text,
text = string.Format("{0}{1}---> (Inner Exception #{2}) {3}{4}{5}", text,
Environment.NewLine, i, GetFormattedExceptionStack(aggregate.InnerExceptions[i]), "<---", Environment.NewLine);
}
......@@ -54,7 +53,7 @@ private static string GetStackForException(Exception exception, bool includeMess
else
{
stackText += " ---> " + GetFormattedExceptionStack(innerException) + Environment.NewLine +
" " + ServicesVSResources.End_of_inner_exception_stack;
" " + ServicesVSResources.End_of_inner_exception_stack;
}
}
......@@ -63,7 +62,7 @@ private static string GetStackForException(Exception exception, bool includeMess
private static string GetAsyncStackTrace(Exception exception)
{
var stackTrace = new StackTrace(exception, true);
var stackTrace = new StackTrace(exception);
var stackFrames = stackTrace.GetFrames();
if (stackFrames == null)
......@@ -72,21 +71,17 @@ private static string GetAsyncStackTrace(Exception exception)
}
var firstFrame = true;
var stringBuilder = new StringBuilder(255);
var stringBuilder = new StringBuilder();
foreach (var frame in stackFrames)
{
var method = frame.GetMethod();
if (method == null)
{
continue;
}
var declaringType = method.DeclaringType;
var declaringType = method?.DeclaringType;
if (declaringType != null && typeof(INotifyCompletion).IsAssignableFrom(declaringType))
{
continue;
}
if (firstFrame)
{
firstFrame = false;
......@@ -96,13 +91,13 @@ private static string GetAsyncStackTrace(Exception exception)
stringBuilder.Append(Environment.NewLine);
}
stringBuilder.AppendFormat(" {0} ", ServicesVSResources.at);
stringBuilder.AppendFormat(" at ");
var isAsync = FormatMethodName(stringBuilder, declaringType);
if (!isAsync)
{
stringBuilder.Append(method.Name);
stringBuilder.Append(method?.Name);
var methodInfo = method as MethodInfo;
if (methodInfo != null && methodInfo.IsGenericMethod)
if (methodInfo?.IsGenericMethod == true)
{
FormatGenericArguments(stringBuilder, methodInfo.GetGenericArguments());
}
......@@ -140,7 +135,7 @@ private static bool FormatMethodName(StringBuilder stringBuilder, Type declaring
if (typeof(IAsyncStateMachine).GetTypeInfo().IsAssignableFrom(declaringType))
{
isAsync = true;
stringBuilder.Append(AsyncMethodPrefix);
stringBuilder.Append("async ");
var start = fullName.LastIndexOf('<');
var end = fullName.LastIndexOf('>');
if (start >= 0 && end >= 0)
......@@ -168,43 +163,10 @@ private static void FormatGenericArguments(StringBuilder stringBuilder, Type[] g
return;
}
stringBuilder.Append("[");
var firstTypeParam = true;
foreach (var genericArgument in genericTypeArguments)
{
if (!firstTypeParam)
{
stringBuilder.Append(",");
}
else
{
firstTypeParam = false;
}
stringBuilder.Append(genericArgument.Name);
}
stringBuilder.Append("]");
stringBuilder.Append("[" + String.Join(",", genericTypeArguments.Select(args => args.Name)) + "]");
}
private static void FormatParameters(StringBuilder stringBuilder, MethodBase method)
{
var parameters = method.GetParameters();
var firstParam = true;
foreach (var t in parameters)
{
if (!firstParam)
{
stringBuilder.Append(", ");
}
else
{
firstParam = false;
}
var typeName = t.ParameterType?.Name ?? "<UnknownType>";
stringBuilder.Append(typeName + " " + t.Name);
}
}
private static void FormatParameters(StringBuilder stringBuilder, MethodBase method) =>
stringBuilder.Append(string.Join(",", method?.GetParameters().Select(t => (t.ParameterType?.Name ?? "<UnknownType>") + " " + t.Name) ?? Array.Empty<string>()));
}
}
......@@ -60,15 +60,6 @@ internal class ServicesVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to {0}{1}---&gt; (Inner Exception #{2}) {3}{4}{5}.
/// </summary>
internal static string _0_1_InnerException_2_3_4_5 {
get {
return ResourceManager.GetString("_0_1_InnerException_2_3_4_5", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to &apos;{0}&apos; encountered an error and has been disabled..
/// </summary>
......@@ -253,15 +244,6 @@ internal class ServicesVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to at.
/// </summary>
internal static string at {
get {
return ResourceManager.GetString("at", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Base Types.
/// </summary>
......
......@@ -705,18 +705,12 @@ Additional information: {1}</value>
<data name="Close" xml:space="preserve">
<value>Close</value>
</data>
<data name="at" xml:space="preserve">
<value>at</value>
</data>
<data name="End_of_inner_exception_stack" xml:space="preserve">
<value>--- End of inner exception stack trace ---</value>
</data>
<data name="in_0_line_1" xml:space="preserve">
<value>in {0}:line {1}</value>
</data>
<data name="_0_1_InnerException_2_3_4_5" xml:space="preserve">
<value>{0}{1}---&gt; (Inner Exception #{2}) {3}{4}{5}</value>
</data>
<data name="Unknown_parameters" xml:space="preserve">
<value>&lt;Unknown Parameters&gt;</value>
</data>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册