mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-01 01:25:27 +08:00 
			
		
		
		
	 Patrik Svensson
					Patrik Svensson
				
			
				
					committed by
					
						 Patrik Svensson
						Patrik Svensson
					
				
			
			
				
	
			
			
			 Patrik Svensson
						Patrik Svensson
					
				
			
						parent
						
							a5125d640c
						
					
				
				
					commit
					4f6eca4fcb
				
			| @@ -8,6 +8,9 @@ namespace Spectre.Console.Tests.Data | |||||||
|         [SuppressMessage("Usage", "CA1801:Review unused parameters", Justification = "<Pending>")] |         [SuppressMessage("Usage", "CA1801:Review unused parameters", Justification = "<Pending>")] | ||||||
|         public static bool MethodThatThrows(int? number) => throw new InvalidOperationException("Throwing!"); |         public static bool MethodThatThrows(int? number) => throw new InvalidOperationException("Throwing!"); | ||||||
|  |  | ||||||
|  |         [SuppressMessage("Usage", "CA1801:Review unused parameters", Justification = "<Pending>")] | ||||||
|  |         public static bool GenericMethodThatThrows<T0, T1, TRet>(int? number) => throw new InvalidOperationException("Throwing!"); | ||||||
|  |  | ||||||
|         public static void ThrowWithInnerException() |         public static void ThrowWithInnerException() | ||||||
|         { |         { | ||||||
|             try |             try | ||||||
| @@ -19,5 +22,17 @@ namespace Spectre.Console.Tests.Data | |||||||
|                 throw new InvalidOperationException("Something threw!", ex); |                 throw new InvalidOperationException("Something threw!", ex); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         public static void ThrowWithGenericInnerException() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 GenericMethodThatThrows<int, float, double>(null); | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 throw new InvalidOperationException("Something threw!", ex); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,7 @@ | |||||||
|  | System.InvalidOperationException: Something threw! | ||||||
|  |      System.InvalidOperationException: Throwing! | ||||||
|  |        at Spectre.Console.Tests.Data.TestExceptions.GenericMethodThatThrows[[T0,T1,TRet]](Nullable`1 number) in /xyz/Exceptions.cs:nn | ||||||
|  |        at Spectre.Console.Tests.Data.TestExceptions.ThrowWithGenericInnerException() in /xyz/Exceptions.cs:nn | ||||||
|  |   at Spectre.Console.Tests.Data.TestExceptions.ThrowWithGenericInnerException() in /xyz/Exceptions.cs:nn | ||||||
|  |   at Spectre.Console.Tests.Unit.ExceptionTests.<>c.<Should_Write_Exceptions_With_Generic_Type_Parameters_In_Callsite_As_Expected>b__4_0() in /xyz/ExceptionTests.cs:nn | ||||||
|  |   at Spectre.Console.Tests.Unit.ExceptionTests.GetException(Action action) in /xyz/ExceptionTests.cs:nn | ||||||
| @@ -65,6 +65,20 @@ namespace Spectre.Console.Tests.Unit | |||||||
|             return Verifier.Verify(result); |             return Verifier.Verify(result); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         [Fact] | ||||||
|  |         public Task Should_Write_Exceptions_With_Generic_Type_Parameters_In_Callsite_As_Expected() | ||||||
|  |         { | ||||||
|  |             // Given | ||||||
|  |             var console = new PlainConsole(width: 1024); | ||||||
|  |             var dex = GetException(() => TestExceptions.ThrowWithGenericInnerException()); | ||||||
|  |  | ||||||
|  |             // When | ||||||
|  |             var result = console.WriteNormalizedException(dex); | ||||||
|  |  | ||||||
|  |             // Then | ||||||
|  |             return Verifier.Verify(result); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public static Exception GetException(Action action) |         public static Exception GetException(Action action) | ||||||
|         { |         { | ||||||
|             try |             try | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								src/Spectre.Console/Extensions/StringBuilderExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/Spectre.Console/Extensions/StringBuilderExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | using System.Globalization; | ||||||
|  | using System.Text; | ||||||
|  |  | ||||||
|  | namespace Spectre.Console | ||||||
|  | { | ||||||
|  |     internal static class StringBuilderExtensions | ||||||
|  |     { | ||||||
|  |         public static StringBuilder AppendWithStyle(this StringBuilder builder, Style? style, int? value) | ||||||
|  |         { | ||||||
|  |             return AppendWithStyle(builder, style, value?.ToString(CultureInfo.InvariantCulture)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public static StringBuilder AppendWithStyle(this StringBuilder builder, Style? style, string? value) | ||||||
|  |         { | ||||||
|  |             value ??= string.Empty; | ||||||
|  |  | ||||||
|  |             if (style != null) | ||||||
|  |             { | ||||||
|  |                 return builder.Append('[') | ||||||
|  |                 .Append(style.ToMarkup()) | ||||||
|  |                 .Append(']') | ||||||
|  |                 .Append(value.EscapeMarkup()) | ||||||
|  |                 .Append("[/]"); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return builder.Append(value); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -41,12 +41,15 @@ namespace Spectre.Console.Internal | |||||||
|         { |         { | ||||||
|             var shortenTypes = (settings.Format & ExceptionFormats.ShortenTypes) != 0; |             var shortenTypes = (settings.Format & ExceptionFormats.ShortenTypes) != 0; | ||||||
|             var type = Emphasize(ex.Type, new[] { '.' }, settings.Style.Exception, shortenTypes, settings); |             var type = Emphasize(ex.Type, new[] { '.' }, settings.Style.Exception, shortenTypes, settings); | ||||||
|  |  | ||||||
|             var message = $"[{settings.Style.Message.ToMarkup()}]{ex.Message.EscapeMarkup()}[/]"; |             var message = $"[{settings.Style.Message.ToMarkup()}]{ex.Message.EscapeMarkup()}[/]"; | ||||||
|             return new Markup(string.Concat(type, ": ", message)); |             return new Markup(string.Concat(type, ": ", message)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private static Grid GetStackFrames(ExceptionInfo ex, ExceptionSettings settings) |         private static Grid GetStackFrames(ExceptionInfo ex, ExceptionSettings settings) | ||||||
|         { |         { | ||||||
|  |             var styles = settings.Style; | ||||||
|  |  | ||||||
|             var grid = new Grid(); |             var grid = new Grid(); | ||||||
|             grid.AddColumn(new GridColumn().PadLeft(2).PadRight(0).NoWrap()); |             grid.AddColumn(new GridColumn().PadLeft(2).PadRight(0).NoWrap()); | ||||||
|             grid.AddColumn(new GridColumn().PadLeft(1).PadRight(0)); |             grid.AddColumn(new GridColumn().PadLeft(1).PadRight(0)); | ||||||
| @@ -66,14 +69,16 @@ namespace Spectre.Console.Internal | |||||||
|  |  | ||||||
|                 // Method |                 // Method | ||||||
|                 var shortenMethods = (settings.Format & ExceptionFormats.ShortenMethods) != 0; |                 var shortenMethods = (settings.Format & ExceptionFormats.ShortenMethods) != 0; | ||||||
|                 builder.Append(Emphasize(frame.Method, new[] { '.' }, settings.Style.Method, shortenMethods, settings)); |                 builder.Append(Emphasize(frame.Method, new[] { '.' }, styles.Method, shortenMethods, settings)); | ||||||
|                 builder.Append('[').Append(settings.Style.Parenthesis.ToMarkup()).Append(']').Append('(').Append("[/]"); |                 builder.AppendWithStyle(styles.Parenthesis, "("); | ||||||
|                 AppendParameters(builder, frame, settings); |                 AppendParameters(builder, frame, settings); | ||||||
|                 builder.Append('[').Append(settings.Style.Parenthesis.ToMarkup()).Append(']').Append(')').Append("[/]"); |                 builder.AppendWithStyle(styles.Parenthesis, ")"); | ||||||
|  |  | ||||||
|                 if (frame.Path != null) |                 if (frame.Path != null) | ||||||
|                 { |                 { | ||||||
|                     builder.Append(" [").Append(settings.Style.Dimmed.ToMarkup()).Append("]in[/] "); |                     builder.Append(' '); | ||||||
|  |                     builder.AppendWithStyle(styles.Dimmed, "in"); | ||||||
|  |                     builder.Append(' '); | ||||||
|  |  | ||||||
|                     // Path |                     // Path | ||||||
|                     AppendPath(builder, frame, settings); |                     AppendPath(builder, frame, settings); | ||||||
| @@ -81,13 +86,13 @@ namespace Spectre.Console.Internal | |||||||
|                     // Line number |                     // Line number | ||||||
|                     if (frame.LineNumber != null) |                     if (frame.LineNumber != null) | ||||||
|                     { |                     { | ||||||
|                         builder.Append('[').Append(settings.Style.Dimmed.ToMarkup()).Append("]:[/]"); |                         builder.AppendWithStyle(styles.Dimmed, ":"); | ||||||
|                         builder.Append('[').Append(settings.Style.LineNumber.ToMarkup()).Append(']').Append(frame.LineNumber).Append("[/]"); |                         builder.AppendWithStyle(styles.LineNumber, frame.LineNumber); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 grid.AddRow( |                 grid.AddRow( | ||||||
|                     $"[{settings.Style.Dimmed.ToMarkup()}]at[/]", |                     $"[{styles.Dimmed.ToMarkup()}]at[/]", | ||||||
|                     builder.ToString()); |                     builder.ToString()); | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -98,7 +103,7 @@ namespace Spectre.Console.Internal | |||||||
|         { |         { | ||||||
|             var typeColor = settings.Style.ParameterType.ToMarkup(); |             var typeColor = settings.Style.ParameterType.ToMarkup(); | ||||||
|             var nameColor = settings.Style.ParameterName.ToMarkup(); |             var nameColor = settings.Style.ParameterName.ToMarkup(); | ||||||
|             var parameters = frame.Parameters.Select(x => $"[{typeColor}]{x.Type.EscapeMarkup()}[/] [{nameColor}]{x.Name}[/]"); |             var parameters = frame.Parameters.Select(x => $"[{typeColor}]{x.Type.EscapeMarkup()}[/] [{nameColor}]{x.Name.EscapeMarkup()}[/]"); | ||||||
|             builder.Append(string.Join(", ", parameters)); |             builder.Append(string.Join(", ", parameters)); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -146,16 +151,18 @@ namespace Spectre.Console.Internal | |||||||
|             { |             { | ||||||
|                 if (!compact) |                 if (!compact) | ||||||
|                 { |                 { | ||||||
|                     builder.Append('[').Append(settings.Style.NonEmphasized.ToMarkup()).Append(']') |                     builder.AppendWithStyle( | ||||||
|                         .Append(type, 0, index + 1).Append("[/]"); |                         settings.Style.NonEmphasized, | ||||||
|  |                         type.Substring(0, index + 1).EscapeMarkup()); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 builder.Append('[').Append(color.ToMarkup()).Append(']') |                 builder.AppendWithStyle( | ||||||
|                     .Append(type, index + 1, type.Length - index - 1).Append("[/]"); |                     color, | ||||||
|  |                     type.Substring(index + 1, type.Length - index - 1).EscapeMarkup()); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 builder.Append(type); |                 builder.Append(type.EscapeMarkup()); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             return builder.ToString(); |             return builder.ToString(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user