mirror of https://github.com/icsharpcode/ILSpy.git
13 changed files with 1292 additions and 18 deletions
@ -0,0 +1,55 @@
@@ -0,0 +1,55 @@
|
||||
using System; |
||||
|
||||
namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty |
||||
{ |
||||
internal class CS6_StringInterpolation |
||||
{ |
||||
public static void Main(string[] args) |
||||
{ |
||||
} |
||||
|
||||
public static void General(string[] args) |
||||
{ |
||||
Console.WriteLine($"{args.Length}"); |
||||
Console.WriteLine($"a{{0{args.Length}"); |
||||
Console.WriteLine($"{args.Length:x}"); |
||||
Console.WriteLine($"\ta{args.Length}b"); |
||||
Console.WriteLine($"\ta{args.Length}ba{args[0]}a{args[args.Length]}a{args.Length}"); |
||||
Console.WriteLine($"\ta{((args.Length != 0) ? 5 : 0)}"); |
||||
Console.WriteLine($"\ta{(object)(args ?? args)}"); |
||||
Console.WriteLine($"\ta{args[0][0] == 'a'}"); |
||||
// This is legal, but we cannot create a pretty test for it, as it would require us
|
||||
// to convert string literals to string interpolation literals even without a string.Format call.
|
||||
// I do not think, this is worth the effort.
|
||||
//Console.WriteLine($"\ta{$"a" == args[0]}");
|
||||
} |
||||
|
||||
public static void InvalidFormatString(string[] args) |
||||
{ |
||||
Console.WriteLine(string.Format("", args.Length)); |
||||
Console.WriteLine(string.Format("a", args.Length)); |
||||
Console.WriteLine(string.Format("}", args.Length)); |
||||
Console.WriteLine(string.Format("{", args.Length)); |
||||
Console.WriteLine(string.Format(":", args.Length)); |
||||
Console.WriteLine(string.Format("\t", args.Length)); |
||||
Console.WriteLine(string.Format("\\", args.Length)); |
||||
Console.WriteLine(string.Format("\"", args.Length)); |
||||
Console.WriteLine(string.Format("aa", args.Length)); |
||||
Console.WriteLine(string.Format("a}", args.Length)); |
||||
Console.WriteLine(string.Format("a{", args.Length)); |
||||
Console.WriteLine(string.Format("a:", args.Length)); |
||||
Console.WriteLine(string.Format("a\t", args.Length)); |
||||
Console.WriteLine(string.Format("a\\", args.Length)); |
||||
Console.WriteLine(string.Format("a\"", args.Length)); |
||||
Console.WriteLine(string.Format("a{:", args.Length)); |
||||
Console.WriteLine(string.Format("a{0", args.Length)); |
||||
Console.WriteLine(string.Format("a{{0", args.Length)); |
||||
Console.WriteLine(string.Format("}a{{0", args.Length)); |
||||
Console.WriteLine(string.Format("}{", args.Length)); |
||||
Console.WriteLine(string.Format("{}", args.Length)); |
||||
Console.WriteLine(string.Format("{0:}", args.Length)); |
||||
Console.WriteLine(string.Format("{0{a}0}", args.Length)); |
||||
Console.WriteLine(string.Format("test: {0}", string.Join(",", args))); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,373 @@
@@ -0,0 +1,373 @@
|
||||
|
||||
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 |
||||
// Copyright (c) Microsoft Corporation. All rights reserved. |
||||
|
||||
|
||||
|
||||
// Metadata version: v4.0.30319 |
||||
.assembly extern mscorlib |
||||
{ |
||||
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. |
||||
.ver 4:0:0:0 |
||||
} |
||||
.assembly CS6_StringInterpolation |
||||
{ |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx |
||||
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. |
||||
|
||||
// --- The following custom attribute is added automatically, do not uncomment ------- |
||||
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 ) |
||||
|
||||
.permissionset reqmin |
||||
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} |
||||
.hash algorithm 0x00008004 |
||||
.ver 0:0:0:0 |
||||
} |
||||
.module CS6_StringInterpolation.exe |
||||
// MVID: {EAC42E43-E444-4B60-84F6-6239B79599C4} |
||||
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.imagebase 0x00400000 |
||||
.file alignment 0x00000200 |
||||
.stackreserve 0x00100000 |
||||
.subsystem 0x0003 // WINDOWS_CUI |
||||
.corflags 0x00000001 // ILONLY |
||||
// Image base: 0x03670000 |
||||
|
||||
|
||||
// =============== CLASS MEMBERS DECLARATION =================== |
||||
|
||||
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.CS6_StringInterpolation |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.method public hidebysig static void Main(string[] args) cil managed |
||||
{ |
||||
.entrypoint |
||||
// Code size 1 (0x1) |
||||
.maxstack 8 |
||||
IL_0000: ret |
||||
} // end of method CS6_StringInterpolation::Main |
||||
|
||||
.method public hidebysig static void General(string[] args) cil managed |
||||
{ |
||||
// Code size 232 (0xe8) |
||||
.maxstack 6 |
||||
IL_0000: ldstr "{0}" |
||||
IL_0005: ldarg.0 |
||||
IL_0006: ldlen |
||||
IL_0007: conv.i4 |
||||
IL_0008: box [mscorlib]System.Int32 |
||||
IL_000d: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0012: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0017: ldstr "a{{0{0}" |
||||
IL_001c: ldarg.0 |
||||
IL_001d: ldlen |
||||
IL_001e: conv.i4 |
||||
IL_001f: box [mscorlib]System.Int32 |
||||
IL_0024: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0029: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002e: ldstr "{0:x}" |
||||
IL_0033: ldarg.0 |
||||
IL_0034: ldlen |
||||
IL_0035: conv.i4 |
||||
IL_0036: box [mscorlib]System.Int32 |
||||
IL_003b: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0040: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0045: ldstr "\ta{0}b" |
||||
IL_004a: ldarg.0 |
||||
IL_004b: ldlen |
||||
IL_004c: conv.i4 |
||||
IL_004d: box [mscorlib]System.Int32 |
||||
IL_0052: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0057: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_005c: ldstr "\ta{0}ba{1}a{2}a{3}" |
||||
IL_0061: ldc.i4.4 |
||||
IL_0062: newarr [mscorlib]System.Object |
||||
IL_0067: dup |
||||
IL_0068: ldc.i4.0 |
||||
IL_0069: ldarg.0 |
||||
IL_006a: ldlen |
||||
IL_006b: conv.i4 |
||||
IL_006c: box [mscorlib]System.Int32 |
||||
IL_0071: stelem.ref |
||||
IL_0072: dup |
||||
IL_0073: ldc.i4.1 |
||||
IL_0074: ldarg.0 |
||||
IL_0075: ldc.i4.0 |
||||
IL_0076: ldelem.ref |
||||
IL_0077: stelem.ref |
||||
IL_0078: dup |
||||
IL_0079: ldc.i4.2 |
||||
IL_007a: ldarg.0 |
||||
IL_007b: ldarg.0 |
||||
IL_007c: ldlen |
||||
IL_007d: conv.i4 |
||||
IL_007e: ldelem.ref |
||||
IL_007f: stelem.ref |
||||
IL_0080: dup |
||||
IL_0081: ldc.i4.3 |
||||
IL_0082: ldarg.0 |
||||
IL_0083: ldlen |
||||
IL_0084: conv.i4 |
||||
IL_0085: box [mscorlib]System.Int32 |
||||
IL_008a: stelem.ref |
||||
IL_008b: call string [mscorlib]System.String::Format(string, |
||||
object[]) |
||||
IL_0090: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0095: ldstr "\ta{0}" |
||||
IL_009a: ldarg.0 |
||||
IL_009b: ldlen |
||||
IL_009c: brtrue.s IL_00a1 |
||||
|
||||
IL_009e: ldc.i4.0 |
||||
IL_009f: br.s IL_00a2 |
||||
|
||||
IL_00a1: ldc.i4.5 |
||||
IL_00a2: box [mscorlib]System.Int32 |
||||
IL_00a7: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00ac: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00b1: ldstr "\ta{0}" |
||||
IL_00b6: ldarg.0 |
||||
IL_00b7: dup |
||||
IL_00b8: brtrue.s IL_00bc |
||||
|
||||
IL_00ba: pop |
||||
IL_00bb: ldarg.0 |
||||
IL_00bc: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00c1: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00c6: ldstr "\ta{0}" |
||||
IL_00cb: ldarg.0 |
||||
IL_00cc: ldc.i4.0 |
||||
IL_00cd: ldelem.ref |
||||
IL_00ce: ldc.i4.0 |
||||
IL_00cf: callvirt instance char [mscorlib]System.String::get_Chars(int32) |
||||
IL_00d4: ldc.i4.s 97 |
||||
IL_00d6: ceq |
||||
IL_00d8: box [mscorlib]System.Boolean |
||||
IL_00dd: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00e2: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00e7: ret |
||||
} // end of method CS6_StringInterpolation::General |
||||
|
||||
.method public hidebysig static void InvalidFormatString(string[] args) cil managed |
||||
{ |
||||
// Code size 556 (0x22c) |
||||
.maxstack 3 |
||||
IL_0000: ldstr "" |
||||
IL_0005: ldarg.0 |
||||
IL_0006: ldlen |
||||
IL_0007: conv.i4 |
||||
IL_0008: box [mscorlib]System.Int32 |
||||
IL_000d: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0012: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0017: ldstr "a" |
||||
IL_001c: ldarg.0 |
||||
IL_001d: ldlen |
||||
IL_001e: conv.i4 |
||||
IL_001f: box [mscorlib]System.Int32 |
||||
IL_0024: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0029: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_002e: ldstr "}" |
||||
IL_0033: ldarg.0 |
||||
IL_0034: ldlen |
||||
IL_0035: conv.i4 |
||||
IL_0036: box [mscorlib]System.Int32 |
||||
IL_003b: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0040: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0045: ldstr "{" |
||||
IL_004a: ldarg.0 |
||||
IL_004b: ldlen |
||||
IL_004c: conv.i4 |
||||
IL_004d: box [mscorlib]System.Int32 |
||||
IL_0052: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0057: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_005c: ldstr ":" |
||||
IL_0061: ldarg.0 |
||||
IL_0062: ldlen |
||||
IL_0063: conv.i4 |
||||
IL_0064: box [mscorlib]System.Int32 |
||||
IL_0069: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_006e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0073: ldstr "\t" |
||||
IL_0078: ldarg.0 |
||||
IL_0079: ldlen |
||||
IL_007a: conv.i4 |
||||
IL_007b: box [mscorlib]System.Int32 |
||||
IL_0080: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0085: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_008a: ldstr "\\" |
||||
IL_008f: ldarg.0 |
||||
IL_0090: ldlen |
||||
IL_0091: conv.i4 |
||||
IL_0092: box [mscorlib]System.Int32 |
||||
IL_0097: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_009c: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00a1: ldstr "\"" |
||||
IL_00a6: ldarg.0 |
||||
IL_00a7: ldlen |
||||
IL_00a8: conv.i4 |
||||
IL_00a9: box [mscorlib]System.Int32 |
||||
IL_00ae: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00b3: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00b8: ldstr "aa" |
||||
IL_00bd: ldarg.0 |
||||
IL_00be: ldlen |
||||
IL_00bf: conv.i4 |
||||
IL_00c0: box [mscorlib]System.Int32 |
||||
IL_00c5: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00ca: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00cf: ldstr "a}" |
||||
IL_00d4: ldarg.0 |
||||
IL_00d5: ldlen |
||||
IL_00d6: conv.i4 |
||||
IL_00d7: box [mscorlib]System.Int32 |
||||
IL_00dc: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00e1: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00e6: ldstr "a{" |
||||
IL_00eb: ldarg.0 |
||||
IL_00ec: ldlen |
||||
IL_00ed: conv.i4 |
||||
IL_00ee: box [mscorlib]System.Int32 |
||||
IL_00f3: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00f8: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00fd: ldstr "a:" |
||||
IL_0102: ldarg.0 |
||||
IL_0103: ldlen |
||||
IL_0104: conv.i4 |
||||
IL_0105: box [mscorlib]System.Int32 |
||||
IL_010a: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_010f: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0114: ldstr "a\t" |
||||
IL_0119: ldarg.0 |
||||
IL_011a: ldlen |
||||
IL_011b: conv.i4 |
||||
IL_011c: box [mscorlib]System.Int32 |
||||
IL_0121: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0126: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_012b: ldstr "a\\" |
||||
IL_0130: ldarg.0 |
||||
IL_0131: ldlen |
||||
IL_0132: conv.i4 |
||||
IL_0133: box [mscorlib]System.Int32 |
||||
IL_0138: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_013d: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0142: ldstr "a\"" |
||||
IL_0147: ldarg.0 |
||||
IL_0148: ldlen |
||||
IL_0149: conv.i4 |
||||
IL_014a: box [mscorlib]System.Int32 |
||||
IL_014f: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0154: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0159: ldstr "a{:" |
||||
IL_015e: ldarg.0 |
||||
IL_015f: ldlen |
||||
IL_0160: conv.i4 |
||||
IL_0161: box [mscorlib]System.Int32 |
||||
IL_0166: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_016b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0170: ldstr "a{0" |
||||
IL_0175: ldarg.0 |
||||
IL_0176: ldlen |
||||
IL_0177: conv.i4 |
||||
IL_0178: box [mscorlib]System.Int32 |
||||
IL_017d: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0182: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0187: ldstr "a{{0" |
||||
IL_018c: ldarg.0 |
||||
IL_018d: ldlen |
||||
IL_018e: conv.i4 |
||||
IL_018f: box [mscorlib]System.Int32 |
||||
IL_0194: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0199: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_019e: ldstr "}a{{0" |
||||
IL_01a3: ldarg.0 |
||||
IL_01a4: ldlen |
||||
IL_01a5: conv.i4 |
||||
IL_01a6: box [mscorlib]System.Int32 |
||||
IL_01ab: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_01b0: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_01b5: ldstr "}{" |
||||
IL_01ba: ldarg.0 |
||||
IL_01bb: ldlen |
||||
IL_01bc: conv.i4 |
||||
IL_01bd: box [mscorlib]System.Int32 |
||||
IL_01c2: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_01c7: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_01cc: ldstr "{}" |
||||
IL_01d1: ldarg.0 |
||||
IL_01d2: ldlen |
||||
IL_01d3: conv.i4 |
||||
IL_01d4: box [mscorlib]System.Int32 |
||||
IL_01d9: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_01de: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_01e3: ldstr "{0:}" |
||||
IL_01e8: ldarg.0 |
||||
IL_01e9: ldlen |
||||
IL_01ea: conv.i4 |
||||
IL_01eb: box [mscorlib]System.Int32 |
||||
IL_01f0: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_01f5: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_01fa: ldstr "{0{a}0}" |
||||
IL_01ff: ldarg.0 |
||||
IL_0200: ldlen |
||||
IL_0201: conv.i4 |
||||
IL_0202: box [mscorlib]System.Int32 |
||||
IL_0207: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_020c: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0211: ldstr "test: {0}" |
||||
IL_0216: ldstr "," |
||||
IL_021b: ldarg.0 |
||||
IL_021c: call string [mscorlib]System.String::Join(string, |
||||
string[]) |
||||
IL_0221: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0226: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_022b: ret |
||||
} // end of method CS6_StringInterpolation::InvalidFormatString |
||||
|
||||
.method public hidebysig specialname rtspecialname |
||||
instance void .ctor() cil managed |
||||
{ |
||||
// Code size 7 (0x7) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: call instance void [mscorlib]System.Object::.ctor() |
||||
IL_0006: ret |
||||
} // end of method CS6_StringInterpolation::.ctor |
||||
|
||||
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.CS6_StringInterpolation |
||||
|
||||
|
||||
// ============================================================= |
||||
|
||||
// *********** DISASSEMBLY COMPLETE *********************** |
@ -0,0 +1,409 @@
@@ -0,0 +1,409 @@
|
||||
|
||||
// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 |
||||
// Copyright (c) Microsoft Corporation. All rights reserved. |
||||
|
||||
|
||||
|
||||
// Metadata version: v4.0.30319 |
||||
.assembly extern mscorlib |
||||
{ |
||||
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. |
||||
.ver 4:0:0:0 |
||||
} |
||||
.assembly CS6_StringInterpolation |
||||
{ |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) |
||||
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx |
||||
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. |
||||
|
||||
// --- The following custom attribute is added automatically, do not uncomment ------- |
||||
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 ) |
||||
|
||||
.permissionset reqmin |
||||
= {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} |
||||
.hash algorithm 0x00008004 |
||||
.ver 0:0:0:0 |
||||
} |
||||
.module CS6_StringInterpolation.exe |
||||
// MVID: {AA7B0A68-2032-492A-914B-49D8291C620F} |
||||
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 ) |
||||
.imagebase 0x00400000 |
||||
.file alignment 0x00000200 |
||||
.stackreserve 0x00100000 |
||||
.subsystem 0x0003 // WINDOWS_CUI |
||||
.corflags 0x00000001 // ILONLY |
||||
// Image base: 0x00C60000 |
||||
|
||||
|
||||
// =============== CLASS MEMBERS DECLARATION =================== |
||||
|
||||
.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.CS6_StringInterpolation |
||||
extends [mscorlib]System.Object |
||||
{ |
||||
.method public hidebysig static void Main(string[] args) cil managed |
||||
{ |
||||
.entrypoint |
||||
// Code size 2 (0x2) |
||||
.maxstack 8 |
||||
IL_0000: nop |
||||
IL_0001: ret |
||||
} // end of method CS6_StringInterpolation::Main |
||||
|
||||
.method public hidebysig static void General(string[] args) cil managed |
||||
{ |
||||
// Code size 241 (0xf1) |
||||
.maxstack 6 |
||||
IL_0000: nop |
||||
IL_0001: ldstr "{0}" |
||||
IL_0006: ldarg.0 |
||||
IL_0007: ldlen |
||||
IL_0008: conv.i4 |
||||
IL_0009: box [mscorlib]System.Int32 |
||||
IL_000e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0013: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0018: nop |
||||
IL_0019: ldstr "a{{0{0}" |
||||
IL_001e: ldarg.0 |
||||
IL_001f: ldlen |
||||
IL_0020: conv.i4 |
||||
IL_0021: box [mscorlib]System.Int32 |
||||
IL_0026: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_002b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0030: nop |
||||
IL_0031: ldstr "{0:x}" |
||||
IL_0036: ldarg.0 |
||||
IL_0037: ldlen |
||||
IL_0038: conv.i4 |
||||
IL_0039: box [mscorlib]System.Int32 |
||||
IL_003e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0043: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0048: nop |
||||
IL_0049: ldstr "\ta{0}b" |
||||
IL_004e: ldarg.0 |
||||
IL_004f: ldlen |
||||
IL_0050: conv.i4 |
||||
IL_0051: box [mscorlib]System.Int32 |
||||
IL_0056: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_005b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0060: nop |
||||
IL_0061: ldstr "\ta{0}ba{1}a{2}a{3}" |
||||
IL_0066: ldc.i4.4 |
||||
IL_0067: newarr [mscorlib]System.Object |
||||
IL_006c: dup |
||||
IL_006d: ldc.i4.0 |
||||
IL_006e: ldarg.0 |
||||
IL_006f: ldlen |
||||
IL_0070: conv.i4 |
||||
IL_0071: box [mscorlib]System.Int32 |
||||
IL_0076: stelem.ref |
||||
IL_0077: dup |
||||
IL_0078: ldc.i4.1 |
||||
IL_0079: ldarg.0 |
||||
IL_007a: ldc.i4.0 |
||||
IL_007b: ldelem.ref |
||||
IL_007c: stelem.ref |
||||
IL_007d: dup |
||||
IL_007e: ldc.i4.2 |
||||
IL_007f: ldarg.0 |
||||
IL_0080: ldarg.0 |
||||
IL_0081: ldlen |
||||
IL_0082: conv.i4 |
||||
IL_0083: ldelem.ref |
||||
IL_0084: stelem.ref |
||||
IL_0085: dup |
||||
IL_0086: ldc.i4.3 |
||||
IL_0087: ldarg.0 |
||||
IL_0088: ldlen |
||||
IL_0089: conv.i4 |
||||
IL_008a: box [mscorlib]System.Int32 |
||||
IL_008f: stelem.ref |
||||
IL_0090: call string [mscorlib]System.String::Format(string, |
||||
object[]) |
||||
IL_0095: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_009a: nop |
||||
IL_009b: ldstr "\ta{0}" |
||||
IL_00a0: ldarg.0 |
||||
IL_00a1: ldlen |
||||
IL_00a2: brtrue.s IL_00a7 |
||||
|
||||
IL_00a4: ldc.i4.0 |
||||
IL_00a5: br.s IL_00a8 |
||||
|
||||
IL_00a7: ldc.i4.5 |
||||
IL_00a8: box [mscorlib]System.Int32 |
||||
IL_00ad: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00b2: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00b7: nop |
||||
IL_00b8: ldstr "\ta{0}" |
||||
IL_00bd: ldarg.0 |
||||
IL_00be: dup |
||||
IL_00bf: brtrue.s IL_00c3 |
||||
|
||||
IL_00c1: pop |
||||
IL_00c2: ldarg.0 |
||||
IL_00c3: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00c8: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00cd: nop |
||||
IL_00ce: ldstr "\ta{0}" |
||||
IL_00d3: ldarg.0 |
||||
IL_00d4: ldc.i4.0 |
||||
IL_00d5: ldelem.ref |
||||
IL_00d6: ldc.i4.0 |
||||
IL_00d7: callvirt instance char [mscorlib]System.String::get_Chars(int32) |
||||
IL_00dc: ldc.i4.s 97 |
||||
IL_00de: ceq |
||||
IL_00e0: box [mscorlib]System.Boolean |
||||
IL_00e5: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00ea: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00ef: nop |
||||
IL_00f0: ret |
||||
} // end of method CS6_StringInterpolation::General |
||||
|
||||
.method public hidebysig static void InvalidFormatString(string[] args) cil managed |
||||
{ |
||||
// Code size 581 (0x245) |
||||
.maxstack 3 |
||||
IL_0000: nop |
||||
IL_0001: ldstr "" |
||||
IL_0006: ldarg.0 |
||||
IL_0007: ldlen |
||||
IL_0008: conv.i4 |
||||
IL_0009: box [mscorlib]System.Int32 |
||||
IL_000e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0013: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0018: nop |
||||
IL_0019: ldstr "a" |
||||
IL_001e: ldarg.0 |
||||
IL_001f: ldlen |
||||
IL_0020: conv.i4 |
||||
IL_0021: box [mscorlib]System.Int32 |
||||
IL_0026: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_002b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0030: nop |
||||
IL_0031: ldstr "}" |
||||
IL_0036: ldarg.0 |
||||
IL_0037: ldlen |
||||
IL_0038: conv.i4 |
||||
IL_0039: box [mscorlib]System.Int32 |
||||
IL_003e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0043: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0048: nop |
||||
IL_0049: ldstr "{" |
||||
IL_004e: ldarg.0 |
||||
IL_004f: ldlen |
||||
IL_0050: conv.i4 |
||||
IL_0051: box [mscorlib]System.Int32 |
||||
IL_0056: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_005b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0060: nop |
||||
IL_0061: ldstr ":" |
||||
IL_0066: ldarg.0 |
||||
IL_0067: ldlen |
||||
IL_0068: conv.i4 |
||||
IL_0069: box [mscorlib]System.Int32 |
||||
IL_006e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0073: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0078: nop |
||||
IL_0079: ldstr "\t" |
||||
IL_007e: ldarg.0 |
||||
IL_007f: ldlen |
||||
IL_0080: conv.i4 |
||||
IL_0081: box [mscorlib]System.Int32 |
||||
IL_0086: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_008b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0090: nop |
||||
IL_0091: ldstr "\\" |
||||
IL_0096: ldarg.0 |
||||
IL_0097: ldlen |
||||
IL_0098: conv.i4 |
||||
IL_0099: box [mscorlib]System.Int32 |
||||
IL_009e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00a3: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00a8: nop |
||||
IL_00a9: ldstr "\"" |
||||
IL_00ae: ldarg.0 |
||||
IL_00af: ldlen |
||||
IL_00b0: conv.i4 |
||||
IL_00b1: box [mscorlib]System.Int32 |
||||
IL_00b6: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00bb: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00c0: nop |
||||
IL_00c1: ldstr "aa" |
||||
IL_00c6: ldarg.0 |
||||
IL_00c7: ldlen |
||||
IL_00c8: conv.i4 |
||||
IL_00c9: box [mscorlib]System.Int32 |
||||
IL_00ce: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00d3: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00d8: nop |
||||
IL_00d9: ldstr "a}" |
||||
IL_00de: ldarg.0 |
||||
IL_00df: ldlen |
||||
IL_00e0: conv.i4 |
||||
IL_00e1: box [mscorlib]System.Int32 |
||||
IL_00e6: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_00eb: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_00f0: nop |
||||
IL_00f1: ldstr "a{" |
||||
IL_00f6: ldarg.0 |
||||
IL_00f7: ldlen |
||||
IL_00f8: conv.i4 |
||||
IL_00f9: box [mscorlib]System.Int32 |
||||
IL_00fe: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0103: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0108: nop |
||||
IL_0109: ldstr "a:" |
||||
IL_010e: ldarg.0 |
||||
IL_010f: ldlen |
||||
IL_0110: conv.i4 |
||||
IL_0111: box [mscorlib]System.Int32 |
||||
IL_0116: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_011b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0120: nop |
||||
IL_0121: ldstr "a\t" |
||||
IL_0126: ldarg.0 |
||||
IL_0127: ldlen |
||||
IL_0128: conv.i4 |
||||
IL_0129: box [mscorlib]System.Int32 |
||||
IL_012e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0133: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0138: nop |
||||
IL_0139: ldstr "a\\" |
||||
IL_013e: ldarg.0 |
||||
IL_013f: ldlen |
||||
IL_0140: conv.i4 |
||||
IL_0141: box [mscorlib]System.Int32 |
||||
IL_0146: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_014b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0150: nop |
||||
IL_0151: ldstr "a\"" |
||||
IL_0156: ldarg.0 |
||||
IL_0157: ldlen |
||||
IL_0158: conv.i4 |
||||
IL_0159: box [mscorlib]System.Int32 |
||||
IL_015e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0163: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0168: nop |
||||
IL_0169: ldstr "a{:" |
||||
IL_016e: ldarg.0 |
||||
IL_016f: ldlen |
||||
IL_0170: conv.i4 |
||||
IL_0171: box [mscorlib]System.Int32 |
||||
IL_0176: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_017b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0180: nop |
||||
IL_0181: ldstr "a{0" |
||||
IL_0186: ldarg.0 |
||||
IL_0187: ldlen |
||||
IL_0188: conv.i4 |
||||
IL_0189: box [mscorlib]System.Int32 |
||||
IL_018e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0193: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0198: nop |
||||
IL_0199: ldstr "a{{0" |
||||
IL_019e: ldarg.0 |
||||
IL_019f: ldlen |
||||
IL_01a0: conv.i4 |
||||
IL_01a1: box [mscorlib]System.Int32 |
||||
IL_01a6: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_01ab: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_01b0: nop |
||||
IL_01b1: ldstr "}a{{0" |
||||
IL_01b6: ldarg.0 |
||||
IL_01b7: ldlen |
||||
IL_01b8: conv.i4 |
||||
IL_01b9: box [mscorlib]System.Int32 |
||||
IL_01be: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_01c3: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_01c8: nop |
||||
IL_01c9: ldstr "}{" |
||||
IL_01ce: ldarg.0 |
||||
IL_01cf: ldlen |
||||
IL_01d0: conv.i4 |
||||
IL_01d1: box [mscorlib]System.Int32 |
||||
IL_01d6: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_01db: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_01e0: nop |
||||
IL_01e1: ldstr "{}" |
||||
IL_01e6: ldarg.0 |
||||
IL_01e7: ldlen |
||||
IL_01e8: conv.i4 |
||||
IL_01e9: box [mscorlib]System.Int32 |
||||
IL_01ee: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_01f3: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_01f8: nop |
||||
IL_01f9: ldstr "{0:}" |
||||
IL_01fe: ldarg.0 |
||||
IL_01ff: ldlen |
||||
IL_0200: conv.i4 |
||||
IL_0201: box [mscorlib]System.Int32 |
||||
IL_0206: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_020b: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0210: nop |
||||
IL_0211: ldstr "{0{a}0}" |
||||
IL_0216: ldarg.0 |
||||
IL_0217: ldlen |
||||
IL_0218: conv.i4 |
||||
IL_0219: box [mscorlib]System.Int32 |
||||
IL_021e: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_0223: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0228: nop |
||||
IL_0229: ldstr "test: {0}" |
||||
IL_022e: ldstr "," |
||||
IL_0233: ldarg.0 |
||||
IL_0234: call string [mscorlib]System.String::Join(string, |
||||
string[]) |
||||
IL_0239: call string [mscorlib]System.String::Format(string, |
||||
object) |
||||
IL_023e: call void [mscorlib]System.Console::WriteLine(string) |
||||
IL_0243: nop |
||||
IL_0244: ret |
||||
} // end of method CS6_StringInterpolation::InvalidFormatString |
||||
|
||||
.method public hidebysig specialname rtspecialname |
||||
instance void .ctor() cil managed |
||||
{ |
||||
// Code size 8 (0x8) |
||||
.maxstack 8 |
||||
IL_0000: ldarg.0 |
||||
IL_0001: call instance void [mscorlib]System.Object::.ctor() |
||||
IL_0006: nop |
||||
IL_0007: ret |
||||
} // end of method CS6_StringInterpolation::.ctor |
||||
|
||||
} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.CS6_StringInterpolation |
||||
|
||||
|
||||
// ============================================================= |
||||
|
||||
// *********** DISASSEMBLY COMPLETE *********************** |
@ -0,0 +1,169 @@
@@ -0,0 +1,169 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Text; |
||||
using ICSharpCode.Decompiler.CSharp.Syntax.PatternMatching; |
||||
|
||||
namespace ICSharpCode.Decompiler.CSharp.Syntax |
||||
{ |
||||
public class InterpolatedStringExpression : Expression |
||||
{ |
||||
public AstNodeCollection<InterpolatedStringContent> Content { |
||||
get { return GetChildrenByRole(InterpolatedStringContent.Role); } |
||||
} |
||||
|
||||
public InterpolatedStringExpression() |
||||
{ |
||||
|
||||
} |
||||
|
||||
public override void AcceptVisitor(IAstVisitor visitor) |
||||
{ |
||||
visitor.VisitInterpolatedStringExpression(this); |
||||
} |
||||
|
||||
public override T AcceptVisitor<T>(IAstVisitor<T> visitor) |
||||
{ |
||||
return visitor.VisitInterpolatedStringExpression(this); |
||||
} |
||||
|
||||
public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data) |
||||
{ |
||||
return visitor.VisitInterpolatedStringExpression(this, data); |
||||
} |
||||
|
||||
protected internal override bool DoMatch(AstNode other, Match match) |
||||
{ |
||||
InterpolatedStringExpression o = other as InterpolatedStringExpression; |
||||
return o != null && !o.IsNull && this.Content.DoMatch(o.Content, match); |
||||
} |
||||
} |
||||
|
||||
public abstract class InterpolatedStringContent : AstNode |
||||
{ |
||||
#region Null
|
||||
public new static readonly InterpolatedStringContent Null = new NullInterpolatedStringContent(); |
||||
|
||||
sealed class NullInterpolatedStringContent : InterpolatedStringContent |
||||
{ |
||||
public override bool IsNull { |
||||
get { |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
public override void AcceptVisitor(IAstVisitor visitor) |
||||
{ |
||||
visitor.VisitNullNode(this); |
||||
} |
||||
|
||||
public override T AcceptVisitor<T>(IAstVisitor<T> visitor) |
||||
{ |
||||
return visitor.VisitNullNode(this); |
||||
} |
||||
|
||||
public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data) |
||||
{ |
||||
return visitor.VisitNullNode(this, data); |
||||
} |
||||
|
||||
protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) |
||||
{ |
||||
return other == null || other.IsNull; |
||||
} |
||||
} |
||||
#endregion
|
||||
|
||||
public new static readonly Role<InterpolatedStringContent> Role = new Role<InterpolatedStringContent>("InterpolatedStringContent", Syntax.InterpolatedStringContent.Null); |
||||
|
||||
public override NodeType NodeType => NodeType.Unknown; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// { Expression }
|
||||
/// </summary>
|
||||
public class Interpolation : InterpolatedStringContent |
||||
{ |
||||
public CSharpTokenNode LBraceToken { |
||||
get { return GetChildByRole(Roles.LBrace); } |
||||
} |
||||
|
||||
public Expression Expression { |
||||
get { return GetChildByRole(Roles.Expression); } |
||||
set { SetChildByRole(Roles.Expression, value); } |
||||
} |
||||
|
||||
public string Suffix { get; } |
||||
|
||||
public CSharpTokenNode RBraceToken { |
||||
get { return GetChildByRole(Roles.RBrace); } |
||||
} |
||||
|
||||
public Interpolation() |
||||
{ |
||||
|
||||
} |
||||
|
||||
public Interpolation(Expression expression, string suffix = null) |
||||
{ |
||||
Expression = expression; |
||||
Suffix = suffix; |
||||
} |
||||
|
||||
public override void AcceptVisitor(IAstVisitor visitor) |
||||
{ |
||||
visitor.VisitInterpolation(this); |
||||
} |
||||
|
||||
public override T AcceptVisitor<T>(IAstVisitor<T> visitor) |
||||
{ |
||||
return visitor.VisitInterpolation(this); |
||||
} |
||||
|
||||
public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data) |
||||
{ |
||||
return visitor.VisitInterpolation(this, data); |
||||
} |
||||
|
||||
protected internal override bool DoMatch(AstNode other, Match match) |
||||
{ |
||||
Interpolation o = other as Interpolation; |
||||
return o != null && this.Expression.DoMatch(o.Expression, match); |
||||
} |
||||
} |
||||
|
||||
public class InterpolatedStringText : InterpolatedStringContent |
||||
{ |
||||
public string Text { get; set; } |
||||
|
||||
public InterpolatedStringText() |
||||
{ |
||||
|
||||
} |
||||
|
||||
public InterpolatedStringText(string text) |
||||
{ |
||||
Text = text; |
||||
} |
||||
|
||||
public override void AcceptVisitor(IAstVisitor visitor) |
||||
{ |
||||
visitor.VisitInterpolatedStringText(this); |
||||
} |
||||
|
||||
public override T AcceptVisitor<T>(IAstVisitor<T> visitor) |
||||
{ |
||||
return visitor.VisitInterpolatedStringText(this); |
||||
} |
||||
|
||||
public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data) |
||||
{ |
||||
return visitor.VisitInterpolatedStringText(this, data); |
||||
} |
||||
|
||||
protected internal override bool DoMatch(AstNode other, Match match) |
||||
{ |
||||
InterpolatedStringText o = other as InterpolatedStringText; |
||||
return o != null && o.Text == this.Text; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue