From 523f23fabc5812486630f8777336ef01ccfdf9fc Mon Sep 17 00:00:00 2001 From: Lex Li Date: Sat, 21 Jul 2012 12:58:20 +0800 Subject: [PATCH] Modified result parsing to meet OpenCover's format. --- .../Project/Src/CodeCoverageMethod.cs | 31 +++--- .../Project/Src/CodeCoverageResults.cs | 105 +++++++++--------- .../Project/Src/CodeCoverageSequencePoint.cs | 13 ++- .../Project/Src/PartCoverApplication.cs | 2 +- 4 files changed, 78 insertions(+), 73 deletions(-) diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethod.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethod.cs index 555dd83044..5693288318 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethod.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethod.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Reflection; using System.Xml; +using System.Xml.Linq; using ICSharpCode.Core; namespace ICSharpCode.CodeCoverage @@ -39,34 +40,34 @@ namespace ICSharpCode.CodeCoverage } } - public CodeCoverageMethod(string className, XmlReader reader) + public CodeCoverageMethod(string className, XElement reader) : this(GetMethodName(reader), className, GetMethodAttributes(reader)) { ReadMethodBodySize(reader); } - static string GetMethodName(XmlReader reader) + static string GetMethodName(XElement reader) { - return reader.GetAttribute("name"); + return reader.Element("Name").Value; } - static MethodAttributes GetMethodAttributes(XmlReader reader) + static MethodAttributes GetMethodAttributes(XElement reader) { - string flags = reader.GetAttribute("flags"); - if (flags != null) { - try { - return (MethodAttributes)Enum.Parse(typeof(MethodAttributes), flags); - } catch (ArgumentException) { } - } + //string flags = reader.GetAttribute("flags"); + //if (flags != null) { + // try { + // return (MethodAttributes)Enum.Parse(typeof(MethodAttributes), flags); + // } catch (ArgumentException) { } + //} return MethodAttributes.Public; } - void ReadMethodBodySize(XmlReader reader) + void ReadMethodBodySize(XElement reader) { - string bodySizeAsString = reader.GetAttribute("bodysize"); - if (bodySizeAsString != null) { - methodBodySize = Int32.Parse(bodySizeAsString); - } + //string bodySizeAsString = reader.GetAttribute("bodysize"); + //if (bodySizeAsString != null) { + // methodBodySize = Int32.Parse(bodySizeAsString); + //} } /// diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageResults.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageResults.cs index fcb4a202e9..208e59c6c0 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageResults.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageResults.cs @@ -3,9 +3,13 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; +using System.Linq; using System.Reflection; +using System.Threading.Tasks; using System.Xml; +using System.Xml.Linq; namespace ICSharpCode.CodeCoverage { @@ -23,13 +27,13 @@ namespace ICSharpCode.CodeCoverage { } - public CodeCoverageResults(XmlReader reader) + public CodeCoverageResults(XContainer reader) { ReadResults(reader); } public CodeCoverageResults(TextReader reader) - : this(new XmlTextReader(reader)) + : this(XDocument.Load(reader)) { } @@ -46,60 +50,59 @@ namespace ICSharpCode.CodeCoverage get { return modules; } } - void ReadResults(XmlReader reader) + void ReadResults(XContainer reader) { - CodeCoverageModule currentModule = null; - CodeCoverageMethod currentMethod = null; - string currentClassName = String.Empty; + IEnumerable modules = reader.Descendants("Module").Where(m => m.Attribute("skippedDueTo") == null); + foreach (XElement assembly in modules) { + AddAssembly(assembly); + } - while (reader.Read()) { - switch (reader.NodeType) { - case XmlNodeType.Element: - if (reader.Name == "Type") { - currentModule = AddModule(reader); - currentClassName = reader.GetAttribute("name"); - } else if ((reader.Name == "Method") && (currentModule != null)) { - currentMethod = AddMethod(currentModule, currentClassName, reader); - } else if ((reader.Name == "pt") && (currentMethod != null)) { - AddSequencePoint(currentMethod, reader); - } else if (reader.Name == "File") { - AddFileName(reader); - } else if (reader.Name == "Assembly") { - AddAssembly(reader); - } - break; - } + foreach (XElement file in reader.Descendants("File")) { + AddFileName(file); } - reader.Close(); + + Parallel.ForEach(modules, RegisterAssembly); + } + + private void RegisterAssembly(XElement assembly) + { + var classNames = + assembly.Elements("Classes").Elements("Class").Where( + c => + !c.Element("FullName").Value.Contains("__") && !c.Element("FullName").Value.Contains("<") && + !c.Element("FullName").Value.Contains("/") && c.Attribute("skippedDueTo") == null).Select( + c => c.Element("FullName").Value).Distinct().OrderBy(name => name); + Parallel.ForEach(classNames, className => AddModule(assembly, className)); } /// /// Add module if it does not already exist. /// - CodeCoverageModule AddModule(XmlReader reader) + CodeCoverageModule AddModule(XElement reader, string className) { - string assemblyName = GetAssemblyName(reader); - foreach (CodeCoverageModule existingModule in modules) { - if (existingModule.Name == assemblyName) { - return existingModule; - } - } - - CodeCoverageModule module = new CodeCoverageModule(assemblyName); + CodeCoverageModule module = new CodeCoverageModule(className); modules.Add(module); + + var methods = reader + .Elements("Classes") + .Elements("Class") + .Where(c => c.Element("FullName").Value.StartsWith(className, StringComparison.Ordinal)) + .Elements("Methods") + .Elements("Method"); + + Parallel.ForEach(methods, method => AddMethod(module, className, method)); return module; } - string GetAssemblyName(XmlReader reader) - { - string id = reader.GetAttribute("asmref"); - return GetAssembly(id); - } - - CodeCoverageMethod AddMethod(CodeCoverageModule module, string className, XmlReader reader) + CodeCoverageMethod AddMethod(CodeCoverageModule module, string className, XElement reader) { CodeCoverageMethod method = new CodeCoverageMethod(className, reader); module.Methods.Add(method); + + var seqpntsOfFile = reader + .Elements("SequencePoints") + .Elements("SequencePoint"); + Parallel.ForEach(seqpntsOfFile, sp => AddSequencePoint(method, sp, reader)); return method; } @@ -109,20 +112,20 @@ namespace ICSharpCode.CodeCoverage /// for types that are not part of the project but types from /// the .NET framework. /// - void AddSequencePoint(CodeCoverageMethod method, XmlReader reader) + void AddSequencePoint(CodeCoverageMethod method, XElement reader, XElement methodNode) { - string fileName = GetFileName(reader); + string fileName = GetFileName(methodNode); CodeCoverageSequencePoint sequencePoint = new CodeCoverageSequencePoint(fileName, reader); method.SequencePoints.Add(sequencePoint); } - string GetFileName(XmlReader reader) + string GetFileName(XElement reader) { - string fileId = reader.GetAttribute("fid"); + XElement fileId = reader.Element("FileRef"); if (fileId != null) { - return GetFileName(fileId); + return GetFileName(fileId.Attribute("uid").Value); } return String.Empty; } @@ -156,20 +159,20 @@ namespace ICSharpCode.CodeCoverage /// /// Saves the filename and its associated id for reference. /// - void AddFileName(XmlReader reader) + void AddFileName(XElement reader) { - string id = reader.GetAttribute("id"); - string fileName = reader.GetAttribute("url"); + string id = reader.Attribute("uid").Value; + string fileName = reader.Attribute("fullPath").Value; fileNames.Add(id, fileName); } /// /// Saves the assembly and its associated id for reference. /// - void AddAssembly(XmlReader reader) + void AddAssembly(XElement reader) { - string id = reader.GetAttribute("id"); - string name = reader.GetAttribute("name"); + string id = reader.Attribute("hash").Value; + string name = reader.Element("ModuleName").Value; assemblies.Add(id, name); } } diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageSequencePoint.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageSequencePoint.cs index f690fee695..488ec169a3 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageSequencePoint.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageSequencePoint.cs @@ -3,6 +3,7 @@ using System; using System.Xml; +using System.Xml.Linq; namespace ICSharpCode.CodeCoverage { @@ -28,25 +29,25 @@ namespace ICSharpCode.CodeCoverage this.Length = length; } - public CodeCoverageSequencePoint(string document, XmlReader reader) + public CodeCoverageSequencePoint(string document, XElement reader) { this.Document = document; Read(reader); } - void Read(XmlReader reader) + void Read(XElement reader) { - VisitCount = GetInteger(reader, "visit"); + VisitCount = GetInteger(reader, "vc"); Line = GetInteger(reader, "sl"); Column = GetInteger(reader, "sc"); EndLine = GetInteger(reader, "el"); EndColumn = GetInteger(reader, "ec"); - Length = GetInteger(reader, "len"); + Length = EndColumn - Column; //GetInteger(reader, "len"); } - int GetInteger(XmlReader reader, string attributeName) + int GetInteger(XElement reader, string attributeName) { - string attributeValue = reader.GetAttribute(attributeName); + string attributeValue = reader.Attribute(attributeName).Value; return GetInteger(attributeValue); } diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/PartCoverApplication.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/PartCoverApplication.cs index 993df93dab..d8b1c4ceac 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/PartCoverApplication.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/PartCoverApplication.cs @@ -119,7 +119,7 @@ namespace ICSharpCode.CodeCoverage { arguments.AppendFormat("-output:\"{0}\" ", CodeCoverageResultsFileName); } - + void AppendFilter() { arguments.Append("-filter:\"");