diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/CtorParamWrapper.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/CtorParamWrapper.cs
index 24c7e17966..def37b6c7f 100644
--- a/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/CtorParamWrapper.cs
+++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/CtorParamWrapper.cs
@@ -22,31 +22,61 @@ namespace SharpRefactoring.Gui
{
public class CtorParamWrapper : INotifyPropertyChanged
{
- IField field;
+ ///
+ /// Underlying member. Always IField or IProperty.
+ ///
+ readonly IMember member;
+
+ public CtorParamWrapper(IMember member)
+ {
+ if (member == null || member.ReturnType == null)
+ throw new ArgumentNullException("field");
+ if (!(member is IField || member is IProperty))
+ throw new ArgumentException("member must be IField or IProperty");
+
+ this.member = member;
+ }
+
+ public string MemberName {
+ get { return member.Name; }
+ }
+
+ string parameterName;
+ public string ParameterName {
+ get {
+ if (parameterName == null)
+ parameterName = ToParameterName(this.MemberName);
+ return parameterName;
+ }
+ }
+
+ public IReturnType Type {
+ get { return member.ReturnType; }
+ }
+
+ public int Index { get; set; }
public string Text {
- get { return field.ProjectContent.Language.GetAmbience().Convert(field); }
+ get { return member.ProjectContent.Language.GetAmbience().Convert(member); }
}
public bool IsNullable {
get {
- return field.ReturnType.IsReferenceType == true ||
- field.ReturnType.IsConstructedReturnType && field.ReturnType.Name == "Nullable";
+ return member.ReturnType.IsReferenceType == true ||
+ member.ReturnType.IsConstructedReturnType && member.ReturnType.Name == "Nullable";
}
}
public bool HasRange {
get {
- return (field.ReturnType.IsConstructedReturnType &&
- IsTypeWithRange(field.ReturnType.CastToConstructedReturnType().TypeArguments.First())
- ) || IsTypeWithRange(field.ReturnType);
+ return IsTypeWithRange(member.ReturnType) ||
+ // IsConstructedReturnType handles Nullable types
+ (member.ReturnType.IsConstructedReturnType &&
+ IsTypeWithRange(member.ReturnType.CastToConstructedReturnType().TypeArguments.First()));
}
}
- public int Index { get; set; }
-
bool isSelected;
-
public bool IsSelected {
get { return isSelected; }
set {
@@ -56,7 +86,6 @@ namespace SharpRefactoring.Gui
}
bool addCheckForNull;
-
public bool AddCheckForNull {
get { return addCheckForNull; }
set {
@@ -66,23 +95,14 @@ namespace SharpRefactoring.Gui
}
bool addRangeCheck;
-
public bool AddRangeCheck {
get { return addRangeCheck; }
set {
addRangeCheck = value;
- if (value) IsSelected = true;
+ if (value) IsSelected = true;
}
}
- public string Name {
- get { return field.Name; }
- }
-
- public IReturnType Type {
- get { return field.ReturnType; }
- }
-
bool IsTypeWithRange(IReturnType type)
{
return type.Name == "Int32" ||
@@ -95,12 +115,11 @@ namespace SharpRefactoring.Gui
type.Name == "UInt64";
}
- public CtorParamWrapper(IField field)
+ static string ToParameterName(string memberName)
{
- if (field == null || field.ReturnType == null)
- throw new ArgumentNullException("field");
-
- this.field = field;
+ if (string.IsNullOrEmpty(memberName))
+ return memberName;
+ return char.ToLower(memberName[0]) + memberName.Substring(1);
}
public event PropertyChangedEventHandler PropertyChanged;
diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs
index fc68a6428d..54bd80b186 100644
--- a/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs
+++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs
@@ -33,15 +33,23 @@ namespace SharpRefactoring.Gui
{
InitializeComponent();
- this.varList.ItemsSource = paramList = CreateCtorParams(current.Fields).ToList();
+ this.varList.ItemsSource = paramList = CreateCtorParams(current.Fields, current.Properties).
+ // "Add check for null" is checked for every item by default
+ //Select(w => { if(w.IsNullable) w.AddCheckForNull = true; return w; }).
+ ToList();
}
- IEnumerable CreateCtorParams(IEnumerable fields)
+ IEnumerable CreateCtorParams(IEnumerable fields, IEnumerable properties)
{
int i = 0;
- foreach (IField f in fields) {
- yield return new CtorParamWrapper(f) { Index = i, IsSelected = f.IsReadonly };
+ foreach (var f in fields) {
+ yield return new CtorParamWrapper(f) { Index = i, IsSelected = !f.IsReadonly };
+ i++;
+ }
+
+ foreach (var p in properties.Where(prop => prop.CanSet && !prop.IsIndexer)) {
+ yield return new CtorParamWrapper(p) { Index = i, IsSelected = !p.IsReadonly };
i++;
}
}
@@ -63,15 +71,15 @@ namespace SharpRefactoring.Gui
if (w.Type.IsReferenceType == true)
block.AddChild(
new IfElseStatement(
- new BinaryOperatorExpression(new IdentifierExpression(w.Name), BinaryOperatorType.Equality, new PrimitiveExpression(null)),
- new ThrowStatement(new ObjectCreateExpression(new TypeReference("ArgumentNullException"), new List() { new PrimitiveExpression(w.Name, '"' + w.Name + '"') }))
+ new BinaryOperatorExpression(new IdentifierExpression(w.ParameterName), BinaryOperatorType.Equality, new PrimitiveExpression(null)),
+ new ThrowStatement(new ObjectCreateExpression(new TypeReference("ArgumentNullException"), new List() { new PrimitiveExpression(w.ParameterName, '"' + w.ParameterName + '"') }))
)
);
else
block.AddChild(
new IfElseStatement(
- new UnaryOperatorExpression(new MemberReferenceExpression(new IdentifierExpression(w.Name), "HasValue"), UnaryOperatorType.Not),
- new ThrowStatement(new ObjectCreateExpression(new TypeReference("ArgumentNullException"), new List() { new PrimitiveExpression(w.Name, '"' + w.Name + '"') }))
+ new UnaryOperatorExpression(new MemberReferenceExpression(new IdentifierExpression(w.MemberName), "HasValue"), UnaryOperatorType.Not),
+ new ThrowStatement(new ObjectCreateExpression(new TypeReference("ArgumentNullException"), new List() { new PrimitiveExpression(w.ParameterName, '"' + w.ParameterName + '"') }))
)
);
}
@@ -79,14 +87,14 @@ namespace SharpRefactoring.Gui
block.AddChild(
new IfElseStatement(
new BinaryOperatorExpression(
- new BinaryOperatorExpression(new IdentifierExpression(w.Name), BinaryOperatorType.LessThan, new IdentifierExpression("lower")),
+ new BinaryOperatorExpression(new IdentifierExpression(w.ParameterName), BinaryOperatorType.LessThan, new IdentifierExpression("lower")),
BinaryOperatorType.LogicalOr,
- new BinaryOperatorExpression(new IdentifierExpression(w.Name), BinaryOperatorType.GreaterThan, new IdentifierExpression("upper"))
+ new BinaryOperatorExpression(new IdentifierExpression(w.ParameterName), BinaryOperatorType.GreaterThan, new IdentifierExpression("upper"))
),
new ThrowStatement(
new ObjectCreateExpression(
new TypeReference("ArgumentOutOfRangeException"),
- new List() { new PrimitiveExpression(w.Name, '"' + w.Name + '"'), new IdentifierExpression(w.Name), new BinaryOperatorExpression(new PrimitiveExpression("Value must be between "), BinaryOperatorType.Add, new BinaryOperatorExpression(new IdentifierExpression("lower"), BinaryOperatorType.Add, new BinaryOperatorExpression(new PrimitiveExpression(" and "), BinaryOperatorType.Add, new IdentifierExpression("upper")))) }
+ new List() { new PrimitiveExpression(w.ParameterName, '"' + w.ParameterName + '"'), new IdentifierExpression(w.ParameterName), new BinaryOperatorExpression(new PrimitiveExpression("Value must be between "), BinaryOperatorType.Add, new BinaryOperatorExpression(new IdentifierExpression("lower"), BinaryOperatorType.Add, new BinaryOperatorExpression(new PrimitiveExpression(" and "), BinaryOperatorType.Add, new IdentifierExpression("upper")))) }
)
)
)
@@ -95,9 +103,9 @@ namespace SharpRefactoring.Gui
}
foreach (CtorParamWrapper w in filtered)
- block.AddChild(new ExpressionStatement(new AssignmentExpression(new MemberReferenceExpression(new ThisReferenceExpression(), w.Name), AssignmentOperatorType.Assign, new IdentifierExpression(w.Name))));
+ block.AddChild(new ExpressionStatement(new AssignmentExpression(new MemberReferenceExpression(new ThisReferenceExpression(), w.MemberName), AssignmentOperatorType.Assign, new IdentifierExpression(w.ParameterName))));
- ConstructorDeclaration ctor = new ConstructorDeclaration(currentClass.Name, Modifiers.Public, filtered.Select(p => new ParameterDeclarationExpression(ConvertType(p.Type), p.Name)).ToList(), null) {
+ ConstructorDeclaration ctor = new ConstructorDeclaration(currentClass.Name, Modifiers.Public, filtered.Select(p => new ParameterDeclarationExpression(ConvertType(p.Type), p.ParameterName)).ToList(), null) {
Body = block
};