Skip to content

Commit 3d51d8a

Browse files
Fix #3547: Fix duplicate key in PropertyAndEventBackingFieldLookup
1 parent 9a1ebfe commit 3d51d8a

File tree

2 files changed

+37
-10
lines changed

2 files changed

+37
-10
lines changed

ICSharpCode.Decompiler/Metadata/PropertyAndEventBackingFieldLookup.cs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
using System.Collections.Generic;
2020
using System.Reflection.Metadata;
2121

22+
using ICSharpCode.Decompiler.Util;
23+
2224
namespace ICSharpCode.Decompiler.Metadata
2325
{
2426
class PropertyAndEventBackingFieldLookup
@@ -33,7 +35,7 @@ public PropertyAndEventBackingFieldLookup(MetadataReader metadata)
3335
{
3436
this.metadata = metadata;
3537

36-
var nameToFieldMap = new Dictionary<string, FieldDefinitionHandle>();
38+
var nameToFieldMap = new MultiDictionary<string, FieldDefinitionHandle>();
3739

3840
foreach (var tdh in metadata.TypeDefinitions)
3941
{
@@ -51,28 +53,42 @@ public PropertyAndEventBackingFieldLookup(MetadataReader metadata)
5153
var property = metadata.GetPropertyDefinition(pdh);
5254
var name = metadata.GetString(property.Name);
5355
// default C# property backing field name is "<PropertyName>k__BackingField"
54-
if (nameToFieldMap.TryGetValue($"<{name}>k__BackingField", out var fieldHandle))
56+
if (nameToFieldMap.TryGetValues($"<{name}>k__BackingField", out var fieldHandles))
5557
{
56-
propertyLookup[fieldHandle] = pdh;
58+
foreach (var fieldHandle in fieldHandles)
59+
{
60+
propertyLookup[fieldHandle] = pdh;
61+
}
5762
}
58-
else if (nameToFieldMap.TryGetValue($"_{name}", out fieldHandle)
59-
&& fieldHandle.IsCompilerGenerated(metadata))
63+
else if (nameToFieldMap.TryGetValues($"_{name}", out fieldHandles))
6064
{
61-
propertyLookup[fieldHandle] = pdh;
65+
foreach (var fieldHandle in fieldHandles)
66+
{
67+
if (fieldHandle.IsCompilerGenerated(metadata))
68+
{
69+
propertyLookup[fieldHandle] = pdh;
70+
}
71+
}
6272
}
6373
}
6474

6575
foreach (var edh in type.GetEvents())
6676
{
6777
var ev = metadata.GetEventDefinition(edh);
6878
var name = metadata.GetString(ev.Name);
69-
if (nameToFieldMap.TryGetValue(name, out var fieldHandle))
79+
if (nameToFieldMap.TryGetValues(name, out var fieldHandles))
7080
{
71-
eventLookup[fieldHandle] = edh;
81+
foreach (var fieldHandle in fieldHandles)
82+
{
83+
eventLookup[fieldHandle] = edh;
84+
}
7285
}
73-
else if (nameToFieldMap.TryGetValue($"{name}Event", out fieldHandle))
86+
else if (nameToFieldMap.TryGetValues($"{name}Event", out fieldHandles))
7487
{
75-
eventLookup[fieldHandle] = edh;
88+
foreach (var fieldHandle in fieldHandles)
89+
{
90+
eventLookup[fieldHandle] = edh;
91+
}
7692
}
7793
}
7894

ICSharpCode.Decompiler/Util/MultiDictionary.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ public IReadOnlyList<TValue> this[TKey key] {
8686
}
8787
}
8888

89+
public bool TryGetValues(TKey key, out IReadOnlyList<TValue> values)
90+
{
91+
values = EmptyList<TValue>.Instance;
92+
if (dict.TryGetValue(key, out var list))
93+
{
94+
values = list;
95+
return true;
96+
}
97+
return false;
98+
}
99+
89100
/// <summary>
90101
/// Returns the number of different keys.
91102
/// </summary>

0 commit comments

Comments
 (0)