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 };