Browse Source

Fix #1837: auto events with tuples are not recognized.

pull/1843/head
Siegfried Pammer 6 years ago
parent
commit
b836f0b859
  1. 6
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/PropertiesAndEvents.cs
  2. 22
      ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs

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

@ -191,6 +191,12 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
public event EventHandler AutomaticEventWithInitializer = delegate { public event EventHandler AutomaticEventWithInitializer = delegate {
}; };
#if ROSLYN
// Legacy csc has a bug where EventHandler<dynamic> is only used for the backing field
public event EventHandler<dynamic> DynamicAutoEvent;
public event EventHandler<(int A, string B)> AutoEventWithTuple;
#endif
public event EventHandler CustomEvent { public event EventHandler CustomEvent {
add { add {
AutomaticEvent += value; AutomaticEvent += value;

22
ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs

@ -810,16 +810,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
default: default:
return false; return false;
} }
if (!ev.ReturnType.IsMatch(m.Get("type").Single())) { var returnType = ev.ReturnType.GetResolveResult().Type;
// Variable types must match event type, var eventType = m.Get<AstType>("type").Single().GetResolveResult().Type;
// except that the event type may have an additional nullability annotation // ignore tuple element names, dynamic and nullability
if (ev.ReturnType is ComposedType ct && ct.HasOnlyNullableSpecifier) { if (!NormalizeTypeVisitor.TypeErasure.EquivalentTypes(returnType, eventType))
if (!ct.BaseType.IsMatch(m.Get("type").Single())) return false;
return false;
} else {
return false;
}
}
var combineMethod = m.Get<AstNode>("delegateCombine").Single().Parent.GetSymbol() as IMethod; var combineMethod = m.Get<AstNode>("delegateCombine").Single().Parent.GetSymbol() as IMethod;
if (combineMethod == null || combineMethod.Name != (isAddAccessor ? "Combine" : "Remove")) if (combineMethod == null || combineMethod.Name != (isAddAccessor ? "Combine" : "Remove"))
return false; return false;
@ -889,9 +884,8 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
ed.Modifiers = ev.Modifiers; ed.Modifiers = ev.Modifiers;
ed.Variables.Add(new VariableInitializer(ev.Name)); ed.Variables.Add(new VariableInitializer(ev.Name));
ed.CopyAnnotationsFrom(ev); ed.CopyAnnotationsFrom(ev);
IEvent eventDef = ev.GetSymbol() as IEvent; if (ev.GetSymbol() is IEvent eventDef) {
if (eventDef != null) {
IField field = eventDef.DeclaringType.GetFields(f => f.Name == ev.Name, GetMemberOptions.IgnoreInheritedMembers).SingleOrDefault(); IField field = eventDef.DeclaringType.GetFields(f => f.Name == ev.Name, GetMemberOptions.IgnoreInheritedMembers).SingleOrDefault();
if (field != null) { if (field != null) {
ed.AddAnnotation(field); ed.AddAnnotation(field);
@ -907,7 +901,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
} }
} }
} }
ev.ReplaceWith(ed); ev.ReplaceWith(ed);
return ed; return ed;
} }

Loading…
Cancel
Save