diff --git a/FodyHelpers.Tests/CecilExtensionsTests.cs b/FodyHelpers.Tests/CecilExtensionsTests.cs new file mode 100644 index 000000000..322efb704 --- /dev/null +++ b/FodyHelpers.Tests/CecilExtensionsTests.cs @@ -0,0 +1,46 @@ +using System; +using System.IO; +using System.Linq; +using Fody; +using Mono.Cecil; +using Mono.Cecil.Cil; +using VerifyXunit; +using Xunit; +using Xunit.Abstractions; + +public class CecilExtensionsTests : + VerifyBase +{ + [Fact] + public void GetSequencePointWithNoSymbols() + { + var sequencePoint = ReadSequencePoint(false); + Assert.Null(sequencePoint); + } + + [Fact] + public void GetSequencePointWithSymbols() + { + var sequencePoint = ReadSequencePoint(true); + Assert.NotNull(sequencePoint); + } + + static SequencePoint? ReadSequencePoint(bool readSymbols) + { + var assemblyPath = Path.Combine(Environment.CurrentDirectory, "DummyAssembly.dll"); + var parameters = new ReaderParameters + { + ReadSymbols = readSymbols + }; + var module = ModuleDefinition.ReadModule(assemblyPath, parameters); + + return module.GetType("DummyAssembly.Class1").Methods + .Single(x => x.Name == "Method") + .GetSequencePoint(); + } + + public CecilExtensionsTests(ITestOutputHelper output) : + base(output) + { + } +} \ No newline at end of file diff --git a/FodyHelpers/CecilExtensions.cs b/FodyHelpers/CecilExtensions.cs new file mode 100644 index 000000000..3375adf1f --- /dev/null +++ b/FodyHelpers/CecilExtensions.cs @@ -0,0 +1,17 @@ +using System.Linq; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Fody +{ + public static class CecilExtensions + { + public static SequencePoint? GetSequencePoint(this MethodDefinition method) + { + Guard.AgainstNull(nameof(method), method); + return method.Body.Instructions + .Select(instruction => method.DebugInformation.GetSequencePoint(instruction)) + .FirstOrDefault(sequencePoint => sequencePoint != null); + } + } +} \ No newline at end of file