diff --git a/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs b/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs index 27f5b4af7..feef9b6e3 100644 --- a/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs +++ b/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs @@ -238,6 +238,24 @@ namespace ICSharpCode.Decompiler.Tests.Helpers } } + public static CSharpDecompiler GetDecompilerForSnippet(string csharpText) + { + var syntaxTree = SyntaxFactory.ParseSyntaxTree(csharpText); + var compilation = CSharpCompilation.Create( + "TestAssembly", + new[] { syntaxTree }, + defaultReferences.Value, + new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + var peStream = new MemoryStream(); + var emitResult = compilation.Emit(peStream); + peStream.Position = 0; + + var moduleDefinition = ModuleDefinition.ReadModule(peStream); + var decompiler = new CSharpDecompiler(moduleDefinition, new DecompilerSettings()); + + return decompiler; + } + internal static string GetSuffix(CompilerOptions cscOptions) { string suffix = ""; diff --git a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj index f92b8c612..8a9e88932 100644 --- a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj +++ b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj @@ -68,6 +68,7 @@ + diff --git a/ICSharpCode.Decompiler.Tests/Util/SequencePointTests.cs b/ICSharpCode.Decompiler.Tests/Util/SequencePointTests.cs new file mode 100644 index 000000000..0be27921e --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/Util/SequencePointTests.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using ICSharpCode.Decompiler.CSharp.OutputVisitor; +using ICSharpCode.Decompiler.Tests.Helpers; +using ICSharpCode.Decompiler.TypeSystem; +using NUnit.Framework; + +namespace ICSharpCode.Decompiler.Tests.Util +{ + [TestFixture] + public class SequencePointTests + { + [Test] + public void BasicSequencePoints() + { + TestCreateSequencePoints(@"class C { void M() { int i = 0; int j = 1; } }", + "int num = 0;", + "int num2 = 1;"); + } + + private void TestCreateSequencePoints(string code, params string[] expectedSequencePoints) + { + var decompiler = Tester.GetDecompilerForSnippet(code); + + var firstType = decompiler.TypeSystem.Compilation.GetTopLevelTypeDefinitons().First(t => code.Contains(t.Name)); + var tree = decompiler.DecompileType(firstType.FullTypeName); + + var output = new StringWriter(); + tree.AcceptVisitor(new InsertParenthesesVisitor { InsertParenthesesForReadability = true }); + TokenWriter tokenWriter = new TextWriterTokenWriter(output); + tokenWriter = new InsertMissingTokensDecorator(tokenWriter, (ILocatable)tokenWriter); + var formattingOptions = FormattingOptionsFactory.CreateSharpDevelop(); + tree.AcceptVisitor(new CSharpOutputVisitor(tokenWriter, formattingOptions)); + + var functionsWithSequencePoints = decompiler.CreateSequencePoints(tree); + var finalText = output.ToString(); + + var lines = finalText.Split(new[] { output.NewLine }, StringSplitOptions.None); + + var actualSequencePoints = new List(); + foreach (var sequencePoint in functionsWithSequencePoints.Values.First()) { + if (sequencePoint.IsHidden) { + continue; + } + + var line = lines[sequencePoint.StartLine - 1]; + var text = line.Substring(sequencePoint.StartColumn - 1, sequencePoint.EndColumn - sequencePoint.StartColumn); + actualSequencePoints.Add(text); + } + + Assert.True(Enumerable.SequenceEqual(expectedSequencePoints, actualSequencePoints)); + } + } +} \ No newline at end of file