Skip to content

Commit 78a1a92

Browse files
committed
#690 Fixed handling of history files for classes with not unique names
1 parent 2a2ed5d commit 78a1a92

File tree

5 files changed

+34
-14
lines changed

5 files changed

+34
-14
lines changed

src/Readme.txt

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ For further details take a look at LICENSE.txt.
6767

6868
CHANGELOG
6969

70+
5.3.10.0
71+
72+
* Fix: #690 Fixed handling of history files for classes with not unique names
73+
7074
5.3.9.0
7175

7276
* New: #685 Extended "raw mode" for dotCover format (settings:rawMode=true) to disable that coverage data of nested or compiler generated

src/ReportGenerator.Core/Parser/Analysis/Class.cs

+18-1
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,20 @@ public class Class
3737
/// <param name="name">The name of the class.</param>
3838
/// <param name="assembly">The assembly.</param>
3939
internal Class(string name, Assembly assembly)
40+
: this(name, name, assembly)
41+
{
42+
}
43+
44+
45+
/// <summary>
46+
/// Initializes a new instance of the <see cref="Class"/> class.
47+
/// </summary>
48+
/// <param name="name">The name of the class.</param>
49+
/// <param name="assembly">The assembly.</param>
50+
internal Class(string name, string rawName, Assembly assembly)
4051
{
4152
this.Name = name ?? throw new ArgumentNullException(nameof(name));
53+
this.RawName = rawName ?? throw new ArgumentNullException(nameof(rawName));
4254
this.Assembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
4355

4456
this.DisplayName = name;
@@ -95,6 +107,11 @@ internal Class(string name, Assembly assembly)
95107
/// </summary>
96108
public string DisplayName { get; }
97109

110+
/// <summary>
111+
/// Gets the raw name of the class.
112+
/// </summary>
113+
public string RawName { get; }
114+
98115
/// <summary>
99116
/// Gets the assembly.
100117
/// </summary>
@@ -214,7 +231,7 @@ public override bool Equals(object obj)
214231
else
215232
{
216233
var @class = (Class)obj;
217-
return @class.Name.Equals(this.Name) && @class.Assembly.Equals(this.Assembly);
234+
return @class.RawName.Equals(this.RawName) && @class.Assembly.Equals(this.Assembly);
218235
}
219236
}
220237

src/ReportGenerator.Core/Parser/CoberturaParser.cs

+10-11
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ private Assembly ProcessAssembly(XElement[] modules, string assemblyName)
129129

130130
var assembly = new Assembly(assemblyName);
131131

132-
Parallel.ForEach(classNames, c => this.ProcessClass(classes, assembly, c.Name, c.DisplayName));
132+
Parallel.ForEach(classNames, c => this.ProcessClass(classes, assembly, c));
133133

134134
return assembly;
135135
}
@@ -139,20 +139,19 @@ private Assembly ProcessAssembly(XElement[] modules, string assemblyName)
139139
/// </summary>
140140
/// <param name="allClasses">All class elements.</param>
141141
/// <param name="assembly">The assembly.</param>
142-
/// <param name="className">Name of the class.</param>
143-
/// <param name="classDisplayName">Diesplay name of the class.</param>
144-
private void ProcessClass(XElement[] allClasses, Assembly assembly, string className, string classDisplayName)
142+
/// <param name="classNameParserResult">Name of the class.</param>
143+
private void ProcessClass(XElement[] allClasses, Assembly assembly, ClassNameParserResult classNameParserResult)
145144
{
146145
bool FilterClass(XElement element)
147146
{
148147
var name = element.Attribute("name").Value;
149148

150-
return name.Equals(className)
149+
return name.Equals(classNameParserResult.Name)
151150
|| (!this.RawMode
152-
&& name.StartsWith(className, StringComparison.Ordinal)
153-
&& (name[className.Length] == '$'
154-
|| name[className.Length] == '/'
155-
|| name[className.Length] == '.'));
151+
&& name.StartsWith(classNameParserResult.Name, StringComparison.Ordinal)
152+
&& (name[classNameParserResult.Name.Length] == '$'
153+
|| name[classNameParserResult.Name.Length] == '/'
154+
|| name[classNameParserResult.Name.Length] == '.'));
156155
}
157156

158157
var classes = allClasses
@@ -171,14 +170,14 @@ bool FilterClass(XElement element)
171170
// If all files are removed by filters, then the whole class is omitted
172171
if ((files.Length == 0 && !this.FileFilter.HasCustomFilters) || filteredFiles.Length > 0)
173172
{
174-
var @class = new Class(classDisplayName, assembly);
173+
var @class = new Class(classNameParserResult.DisplayName, classNameParserResult.RawName, assembly);
175174

176175
foreach (var file in filteredFiles)
177176
{
178177
var fileClasses = classes
179178
.Where(c => c.Attribute("filename").Value.Equals(file))
180179
.ToArray();
181-
@class.AddFile(this.ProcessFile(fileClasses, @class, className, file));
180+
@class.AddFile(this.ProcessFile(fileClasses, @class, classNameParserResult.Name, file));
182181
}
183182

184183
assembly.AddClass(@class);

src/ReportGenerator.Core/Reporting/History/HistoryParser.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ internal void ApplyHistoricCoverage(IEnumerable<Assembly> assemblies, List<Histo
9090

9191
foreach (var item in assemblies.SelectMany(t => t.Classes))
9292
{
93-
classes[this.GetFullClassName(item.Assembly.Name, item.Name)] = item;
93+
classes[this.GetFullClassName(item.Assembly.Name, item.RawName)] = item;
9494
}
9595

9696
Parallel.ForEach(

src/ReportGenerator.Core/Reporting/History/HistoryReportGenerator.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ internal void CreateReport(IEnumerable<Assembly> assemblies, DateTime executionT
7777
{
7878
var classElement = new XElement(
7979
"class",
80-
new XAttribute("name", @class.Name),
80+
new XAttribute("name", @class.RawName),
8181
new XAttribute("coveredlines", @class.CoveredLines.ToString(CultureInfo.InvariantCulture)),
8282
new XAttribute("coverablelines", @class.CoverableLines.ToString(CultureInfo.InvariantCulture)),
8383
new XAttribute("totallines", @class.TotalLines.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)),

0 commit comments

Comments
 (0)