private static (string originFilename, int originLineNumber) MapLineNumber(int lineNumber, string[] csSourceText) { for (var i = lineNumber; i >= 1; i--) { if (OriginLabels.TryParse(csSourceText[i - 1], out var originFilename, out var originStartLineNumber)) { return(originFilename, originStartLineNumber + (lineNumber - i) - 1); } } throw new InvalidOperationException($"Missing //#origin label for line number {lineNumber}!"); }
static string[] Render_section(string[] csTemplate, Sourcecode csrunSection) { var regionStartLineNumber = csTemplate.Select((line, index) => new { LineNumber = index + 1, Text = line }) .First(line => line.Text.IndexOf(Regionname()) >= 0) .LineNumber; var csBeforeSection = csTemplate.Take(regionStartLineNumber); var csAfterSection = csTemplate.Skip(regionStartLineNumber); var originLabels = new OriginLabels(csrunSection.Filename, csrunSection.OriginLineNumber); return(csBeforeSection.Concat(new[] { originLabels.StartLabel }) .Concat(Render_source()) .Concat(new[] { originLabels.EndLabel }) .Concat(csAfterSection) .ToArray()); string Regionname() { switch (csrunSection.Section) { case Sourcecode.Sections.CSRunMain: return("#region main"); case Sourcecode.Sections.CSRunFunctions: return("#region functions"); case Sourcecode.Sections.CSRunTest: return("#region test"); default: throw new InvalidOperationException($"Cannot render section type {csrunSection.Section}!"); } } string[] Render_source() { switch (csrunSection.Section) { case Sourcecode.Sections.CSRunTest: return(new[] { $"[NUnit.Framework.Test(Description=\"{csrunSection.Label}\")]public void {CreateTestMethodName()}()" + "{" } .Concat(csrunSection.Text) .Concat(new[] { "}" }) .ToArray()); default: return(csrunSection.Text); } string CreateTestMethodName() => $"Test{Guid.NewGuid().ToString().Replace("-", "")}"; } }