From dc359673f69cc4809cc57f4f15406fd5880b2f8b Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 26 Nov 2017 02:13:19 +0100 Subject: [PATCH] Fix implementation of ReplaceBackingFieldUsage and ReplaceEventFieldAnnotation (see #540) --- .../Transforms/PatternStatementTransform.cs | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs b/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs index 10e27db79..d789799a3 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs @@ -78,16 +78,6 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms result = TransformFor(expressionStatement); if (result != null) return result; - if (context.Settings.AutomaticProperties) { - result = ReplaceBackingFieldUsage(expressionStatement); - if (result != null) - return result; - } - if (context.Settings.AutomaticEvents) { - result = ReplaceEventFieldAnnotation(expressionStatement); - if (result != null) - return result; - } return base.VisitExpressionStatement(expressionStatement); } @@ -524,44 +514,59 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms section.Remove(); } } + #endregion - ExpressionStatement ReplaceBackingFieldUsage(ExpressionStatement expressionStatement) + public override AstNode VisitIdentifier(Identifier identifier) { - foreach (var identifier in expressionStatement.Descendants.OfType()) { - if (identifier.Name.StartsWith("<") && identifier.Name.EndsWith(">k__BackingField")) { - var parent = identifier.Parent; - var mrr = parent.Annotation(); - var field = mrr?.Member as IField; - if (field != null && field.IsCompilerGenerated()) { - var propertyName = identifier.Name.Substring(1, identifier.Name.Length - 1 - ">k__BackingField".Length); - var property = field.DeclaringTypeDefinition.GetProperties(p => p.Name == propertyName, GetMemberOptions.IgnoreInheritedMembers).FirstOrDefault(); - if (property != null) { - identifier.ReplaceWith(Identifier.Create(propertyName)); - parent.RemoveAnnotations(); - parent.AddAnnotation(new MemberResolveResult(mrr.TargetResult, property)); - } - } + if (context.Settings.AutomaticProperties) { + var newIdentifier = ReplaceBackingFieldUsage(identifier); + if (newIdentifier != null) { + identifier.ReplaceWith(newIdentifier); + return newIdentifier; } } - return null; + if (context.Settings.AutomaticEvents) { + var newIdentifier = ReplaceEventFieldAnnotation(identifier); + if (newIdentifier != null) + return newIdentifier; + } + return base.VisitIdentifier(identifier); } - ExpressionStatement ReplaceEventFieldAnnotation(ExpressionStatement expressionStatement) + Identifier ReplaceBackingFieldUsage(Identifier identifier) { - foreach (var identifier in expressionStatement.Descendants.OfType()) { + if (identifier.Name.StartsWith("<") && identifier.Name.EndsWith(">k__BackingField")) { var parent = identifier.Parent; var mrr = parent.Annotation(); var field = mrr?.Member as IField; - if (field == null) continue; - var @event = field.DeclaringType.GetEvents(ev => ev.Name == field.Name, GetMemberOptions.IgnoreInheritedMembers).SingleOrDefault(); - if (@event != null) { - parent.RemoveAnnotations(); - parent.AddAnnotation(new MemberResolveResult(mrr.TargetResult, @event)); + if (field != null && field.IsCompilerGenerated()) { + var propertyName = identifier.Name.Substring(1, identifier.Name.Length - 1 - ">k__BackingField".Length); + var property = field.DeclaringTypeDefinition.GetProperties(p => p.Name == propertyName, GetMemberOptions.IgnoreInheritedMembers).FirstOrDefault(); + if (property != null) { + parent.RemoveAnnotations(); + parent.AddAnnotation(new MemberResolveResult(mrr.TargetResult, property)); + return Identifier.Create(propertyName); + } } } return null; } - #endregion + + Identifier ReplaceEventFieldAnnotation(Identifier identifier) + { + var parent = identifier.Parent; + var mrr = parent.Annotation(); + var field = mrr?.Member as IField; + if (field == null) + return null; + var @event = field.DeclaringType.GetEvents(ev => ev.Name == field.Name, GetMemberOptions.IgnoreInheritedMembers).SingleOrDefault(); + if (@event != null) { + parent.RemoveAnnotations(); + parent.AddAnnotation(new MemberResolveResult(mrr.TargetResult, @event)); + return identifier; + } + return null; + } #region Automatic Events static readonly Accessor automaticEventPatternV2 = new Accessor {