Skip to content

Commit 7b03606

Browse files
Fix #3575: Uses of compiler-generated events getting swapped with non-generated events of same type
1 parent 4ed7371 commit 7b03606

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

ICSharpCode.Decompiler.Tests/TestCases/Pretty/PropertiesAndEvents.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,23 @@ public event EventHandler CustomEvent {
192192
}
193193
}
194194

195+
public event EventHandler Issue3575_AutoEvent;
196+
public event EventHandler Issue3575_NonAuto;
197+
198+
public event EventHandler Issue3575_Auto {
199+
add {
200+
}
201+
remove {
202+
}
203+
}
204+
205+
public event EventHandler Issue3575_NonAutoEvent {
206+
add {
207+
}
208+
remove {
209+
}
210+
}
211+
195212
public int Getter(StringBuilder b)
196213
{
197214
return b.Length;

ICSharpCode.Decompiler/Metadata/PropertyAndEventBackingFieldLookup.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public PropertyAndEventBackingFieldLookup(MetadataReader metadata)
3737

3838
var nameToFieldMap = new MultiDictionary<string, FieldDefinitionHandle>();
3939

40+
HashSet<string> eventNames = new();
41+
4042
foreach (var tdh in metadata.TypeDefinitions)
4143
{
4244
var type = metadata.GetTypeDefinition(tdh);
@@ -72,6 +74,16 @@ public PropertyAndEventBackingFieldLookup(MetadataReader metadata)
7274
}
7375
}
7476

77+
// first get all names of events defined, so that we can make sure we don't accidentally
78+
// associate the wrong backing field with the event, in case there is an event called "Something"
79+
// without a backing field (i.e., custom event) as well as an auto/field event called "SomethingEvent"
80+
// declared in the same type.
81+
foreach (var edh in type.GetEvents())
82+
{
83+
var ev = metadata.GetEventDefinition(edh);
84+
eventNames.Add(metadata.GetString(ev.Name));
85+
}
86+
7587
foreach (var edh in type.GetEvents())
7688
{
7789
var ev = metadata.GetEventDefinition(edh);
@@ -83,15 +95,20 @@ public PropertyAndEventBackingFieldLookup(MetadataReader metadata)
8395
eventLookup[fieldHandle] = edh;
8496
}
8597
}
86-
else if (nameToFieldMap.TryGetValues($"{name}Event", out fieldHandles))
98+
else
8799
{
88-
foreach (var fieldHandle in fieldHandles)
100+
var nameWithSuffix = $"{name}Event";
101+
if (!eventNames.Contains(nameWithSuffix) && nameToFieldMap.TryGetValues(nameWithSuffix, out fieldHandles))
89102
{
90-
eventLookup[fieldHandle] = edh;
103+
foreach (var fieldHandle in fieldHandles)
104+
{
105+
eventLookup[fieldHandle] = edh;
106+
}
91107
}
92108
}
93109
}
94110

111+
eventNames.Clear();
95112
nameToFieldMap.Clear();
96113
}
97114
}

0 commit comments

Comments
 (0)