From 90487aa4529b00132b4e879b80884f0791da7537 Mon Sep 17 00:00:00 2001 From: Robert Mills Date: Mon, 13 Nov 2017 16:15:55 -0500 Subject: [PATCH 1/2] Ensure there are custom attributes before attempting to resolve --- src/Ben.Demystifier/EnhancedStackTrace.Frames.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs b/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs index 97d0683..ac881ab 100644 --- a/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs +++ b/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs @@ -524,7 +524,7 @@ namespace System.Diagnostics var parameterTypeString = "?"; if (parameterType != null) { - if (parameterType.IsGenericType) + if (parameterType.IsGenericType && parameter.CustomAttributes.Any()) { var tupleNames = parameter.GetCustomAttributes().FirstOrDefault()?.TransformNames; if (tupleNames != null) From bc7a59b99bd73ec5ee4d98dd0a466b955bf2e51c Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 14 Nov 2017 02:27:02 +0000 Subject: [PATCH 2/2] Skip resolving ValueTuple names when no CustomAttributes --- .../EnhancedStackTrace.Frames.cs | 110 +++++++++++------- 1 file changed, 66 insertions(+), 44 deletions(-) diff --git a/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs b/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs index ac881ab..d37ae1c 100644 --- a/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs +++ b/src/Ben.Demystifier/EnhancedStackTrace.Frames.cs @@ -518,59 +518,42 @@ namespace System.Diagnostics private static ResolvedParameter GetParameter(ParameterInfo parameter) { var parameterType = parameter.ParameterType; - var prefix = GetPrefix(parameter, parameterType); - var parameterTypeString = "?"; - if (parameterType != null) + + if (parameterType == null) { - if (parameterType.IsGenericType && parameter.CustomAttributes.Any()) + return new ResolvedParameter { - var tupleNames = parameter.GetCustomAttributes().FirstOrDefault()?.TransformNames; - if (tupleNames != null) + Prefix = prefix, + Name = parameter.Name, + Type = parameterTypeString, + }; + } + + if (parameterType.IsGenericType) + { + var customAttribs = parameter.GetCustomAttributes(inherit: false); + + if ((customAttribs?.Length ?? 0) > 0) + { + var tupleNames = customAttribs + .OfType().FirstOrDefault()?.TransformNames; + + if (tupleNames?.Count > 0) { - var sb = new StringBuilder(); - sb.Append("("); - var args = parameterType.GetGenericArguments(); - for (var i = 0; i < args.Length; i++) - { - if (i > 0) - { - sb.Append(", "); - } - sb.Append(TypeNameHelper.GetTypeDisplayName(args[i], fullName: false, includeGenericParameterNames: true)); - - if (i >= tupleNames.Count) continue; - - var argName = tupleNames[i]; - if (argName != null) - { - sb.Append(" "); - sb.Append(argName); - } - } - - sb.Append(")"); - parameterTypeString = sb.ToString(); - - return new ResolvedParameter - { - Prefix = prefix, - Name = parameter.Name, - Type = parameterTypeString, - }; + return GetValueTupleParameter(tupleNames, prefix, parameter.Name, parameterType); } } - - if (parameterType.IsByRef) - { - parameterType = parameterType.GetElementType(); - } - - parameterTypeString = TypeNameHelper.GetTypeDisplayName(parameterType, fullName: false, includeGenericParameterNames: true); - } + if (parameterType.IsByRef) + { + parameterType = parameterType.GetElementType(); + } + + parameterTypeString = TypeNameHelper.GetTypeDisplayName(parameterType, fullName: false, includeGenericParameterNames: true); + return new ResolvedParameter { Prefix = prefix, @@ -579,6 +562,45 @@ namespace System.Diagnostics }; } + private static ResolvedParameter GetValueTupleParameter(IList tupleNames, string prefix, string name, Type parameterType) + { + var sb = new StringBuilder(); + sb.Append("("); + var args = parameterType.GetGenericArguments(); + for (var i = 0; i < args.Length; i++) + { + if (i > 0) + { + sb.Append(", "); + } + + sb.Append(TypeNameHelper.GetTypeDisplayName(args[i], fullName: false, includeGenericParameterNames: true)); + + if (i >= tupleNames.Count) + { + continue; + } + + var argName = tupleNames[i]; + if (argName == null) + { + continue; + } + + sb.Append(" "); + sb.Append(argName); + } + + sb.Append(")"); + + return new ResolvedParameter + { + Prefix = prefix, + Name = name, + Type = sb.ToString(), + }; + } + private static bool ShowInStackTrace(MethodBase method) { Debug.Assert(method != null);