|
|
|
@ -21,9 +21,13 @@ namespace SharpRefactoring.Gui
@@ -21,9 +21,13 @@ namespace SharpRefactoring.Gui
|
|
|
|
|
public partial class OverrideEqualsGetHashCodeMethodsDialog : AbstractInlineRefactorDialog |
|
|
|
|
{ |
|
|
|
|
IClass selectedClass; |
|
|
|
|
ITextAnchor startAnchor; |
|
|
|
|
IMethod selectedMethod; |
|
|
|
|
string baseCall; |
|
|
|
|
|
|
|
|
|
public OverrideEqualsGetHashCodeMethodsDialog(ITextEditor editor, ITextAnchor anchor, IClass selectedClass) |
|
|
|
|
: base(null, editor, anchor) |
|
|
|
|
public OverrideEqualsGetHashCodeMethodsDialog(ITextEditor editor, ITextAnchor startAnchor, ITextAnchor endAnchor, |
|
|
|
|
ITextAnchor insertionPosition, IClass selectedClass, IMethod selectedMethod, string baseCall) |
|
|
|
|
: base(null, editor, insertionPosition) |
|
|
|
|
{ |
|
|
|
|
if (selectedClass == null) |
|
|
|
|
throw new ArgumentNullException("selectedClass"); |
|
|
|
@ -31,6 +35,10 @@ namespace SharpRefactoring.Gui
@@ -31,6 +35,10 @@ namespace SharpRefactoring.Gui
|
|
|
|
|
InitializeComponent(); |
|
|
|
|
|
|
|
|
|
this.selectedClass = selectedClass; |
|
|
|
|
this.startAnchor = startAnchor; |
|
|
|
|
this.insertionEndAnchor = endAnchor; |
|
|
|
|
this.selectedMethod = selectedMethod; |
|
|
|
|
this.baseCall = baseCall; |
|
|
|
|
|
|
|
|
|
addIEquatable.Content = string.Format(StringParser.Parse("${res:AddIns.SharpRefactoring.OverrideEqualsGetHashCodeMethods.AddInterface}"), |
|
|
|
|
"IEquatable<" + selectedClass.Name + ">"); |
|
|
|
@ -98,7 +106,7 @@ namespace SharpRefactoring.Gui
@@ -98,7 +106,7 @@ namespace SharpRefactoring.Gui
|
|
|
|
|
{ |
|
|
|
|
StringBuilder code = new StringBuilder(); |
|
|
|
|
|
|
|
|
|
var line = editor.Document.GetLineForOffset(editor.Caret.Offset); |
|
|
|
|
var line = editor.Document.GetLineForOffset(startAnchor.Offset); |
|
|
|
|
|
|
|
|
|
string indent = DocumentUtilitites.GetWhitespaceAfter(editor.Document, line.Offset); |
|
|
|
|
|
|
|
|
@ -130,12 +138,38 @@ namespace SharpRefactoring.Gui
@@ -130,12 +138,38 @@ namespace SharpRefactoring.Gui
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (Options.SurroundWithRegion) { |
|
|
|
|
code.AppendLine("#region Equals and GetHashCode implementation"); |
|
|
|
|
editor.Document.InsertNormalized(startAnchor.Offset, "#region Equals and GetHashCode implementation\n" + indent); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
code.Append(generator.GenerateCode(CreateGetHashCodeOverride(currentClass), indent)); |
|
|
|
|
string codeForMethodBody; |
|
|
|
|
|
|
|
|
|
code.Append("\n" + string.Join("\n", CreateEqualsOverrides(currentClass).Select(item => generator.GenerateCode(item, indent)))); |
|
|
|
|
if ("Equals".Equals(selectedMethod.Name, StringComparison.Ordinal)) { |
|
|
|
|
IList<MethodDeclaration> equalsOverrides = CreateEqualsOverrides(currentClass); |
|
|
|
|
MethodDeclaration defaultOverride = equalsOverrides.First(); |
|
|
|
|
equalsOverrides = equalsOverrides.Skip(1).ToList(); |
|
|
|
|
|
|
|
|
|
StringBuilder builder = new StringBuilder(); |
|
|
|
|
|
|
|
|
|
foreach (AbstractNode element in defaultOverride.Body.Children.OfType<AbstractNode>()) { |
|
|
|
|
builder.Append(language.CodeGenerator.GenerateCode(element, indent + "\t")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
codeForMethodBody = builder.ToString().Trim(); |
|
|
|
|
|
|
|
|
|
if (equalsOverrides.Any()) |
|
|
|
|
code.Append(indent + "\n" + string.Join("\n", equalsOverrides.Select(item => generator.GenerateCode(item, indent)))); |
|
|
|
|
code.Append(indent + "\n" + generator.GenerateCode(CreateGetHashCodeOverride(currentClass), indent)); |
|
|
|
|
} else { |
|
|
|
|
StringBuilder builder = new StringBuilder(); |
|
|
|
|
|
|
|
|
|
foreach (AbstractNode element in CreateGetHashCodeOverride(currentClass).Body.Children.OfType<AbstractNode>()) { |
|
|
|
|
builder.Append(language.CodeGenerator.GenerateCode(element, indent + "\t")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
codeForMethodBody = builder.ToString().Trim(); |
|
|
|
|
|
|
|
|
|
code.Append(indent + "\n" + string.Join("\n", CreateEqualsOverrides(currentClass).Select(item => generator.GenerateCode(item, indent)))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (Options.AddOperatorOverloads) { |
|
|
|
|
var checkStatements = new[] { |
|
|
|
@ -194,15 +228,17 @@ namespace SharpRefactoring.Gui
@@ -194,15 +228,17 @@ namespace SharpRefactoring.Gui
|
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
code.Append("\n" + generator.GenerateCode(CreateOperatorOverload(OverloadableOperatorType.Equality, currentClass, equalsOpBody), indent)); |
|
|
|
|
code.Append("\n" + generator.GenerateCode(CreateOperatorOverload(OverloadableOperatorType.InEquality, currentClass, notEqualsOpBody), indent)); |
|
|
|
|
code.Append(indent + "\n" + generator.GenerateCode(CreateOperatorOverload(OverloadableOperatorType.Equality, currentClass, equalsOpBody), indent)); |
|
|
|
|
code.Append(indent + "\n" + generator.GenerateCode(CreateOperatorOverload(OverloadableOperatorType.InEquality, currentClass, notEqualsOpBody), indent)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (Options.SurroundWithRegion) { |
|
|
|
|
code.AppendLine(indent + "#endregion"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return code.ToString(); |
|
|
|
|
editor.Document.InsertNormalized(insertionEndAnchor.Offset, code.ToString()); |
|
|
|
|
|
|
|
|
|
return codeForMethodBody; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<MethodDeclaration> CreateEqualsOverrides(IClass currentClass) |
|
|
|
@ -357,5 +393,13 @@ namespace SharpRefactoring.Gui
@@ -357,5 +393,13 @@ namespace SharpRefactoring.Gui
|
|
|
|
|
Body = body |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected override void CancelButtonClick(object sender, System.Windows.RoutedEventArgs e) |
|
|
|
|
{ |
|
|
|
|
base.CancelButtonClick(sender, e); |
|
|
|
|
|
|
|
|
|
editor.Document.Insert(anchor.Offset, baseCall); |
|
|
|
|
editor.Select(anchor.Offset, baseCall.Length); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|