public async Task <IEnumerable <CoverageFile> > ParseSourceFiles() { return(await options.MonoCov.SelectMany(ParseFile)); async Task <IEnumerable <CoverageFile> > ParseFile(string directoryName) { var directory = fileProvider.GetDirectoryContents(directoryName); if (!directory.Exists) { throw new PublishCoverallsException($"{directoryName} was not found when parsing monocover report"); } var documents = await LoadXDocuments(); return(GenerateSourceFiles()); async Task <Dictionary <string, XDocument> > LoadXDocuments() { var result = new Dictionary <string, XDocument>(); foreach (var file in directory.Where(f => f.Name.EndsWith(".xml", StringComparison.InvariantCultureIgnoreCase))) { result.Add(file.Name, await file.ReadXml()); } return(result); } IEnumerable <CoverageFile> GenerateSourceFiles() => documents .Where(kv => kv.Key.StartsWith("class-") && kv.Key.EndsWith(".xml")) .Select(kv => kv.Value.Root?.Element("source")) .Where(sourceElement => sourceElement != null) .Select(sourceElement => { var coverage = new List <int?>(); var source = new List <string>(); var filePath = sourceElement.Attribute("sourceFile").Value; filePath = pathProcessor.NormalizePath(filePath); foreach (var line in sourceElement.Elements("l")) { if (!int.TryParse(line.Attribute("count").Value, out var coverageCount)) { coverage.Add(null); } else { coverage.Add(coverageCount); } source.Add(line.Value); } return(new CoverageFile(filePath, source, coverage.ToArray())); }); } }
public async Task <IEnumerable <CoverageFile> > Build(IEnumerable <FileCoverageData> coverageData) { return(await coverageData.Select(BuildCoverageFile)); async Task <CoverageFile> BuildCoverageFile(FileCoverageData coverageFileData) { var path = coverageFileData.FullPath; path = pathProcessor.NormalizePath(path); var fileInfo = fileProvider.GetFileInfo(coverageFileData.FullPath); var lines = new List <string>(); if (fileInfo.Exists) { var readAllText = await fileInfo.ReadToEnd(); if (!string.IsNullOrWhiteSpace(readAllText)) { // this is kind of dumb, but ReadLine will work for any line ending, and string.split // can possibly generate extra blank lines (or have extra line ending chars) depending // on the approach. using (var sr = new StringReader(readAllText)) { string nextLine; while ((nextLine = sr.ReadLine()) != null) { lines.Add(nextLine); } } } } var length = lines.Count; var coverage = coverageFileData.Coverage; if (length > coverage.Length) { coverage = new int?[length]; coverageFileData.Coverage.CopyTo(coverage, 0); } return(new CoverageFile(path, lines, coverage)); } }