Browse Source

"Insert Constructor" refactoring works also with properties. By default, all fields and properties are checked, rather than unchecked. Field and property names are converted to parameter names (first character is lowercase).

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6051 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Martin Koníček 15 years ago
parent
commit
07b4dfb253
  1. 71
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/CtorParamWrapper.cs
  2. 34
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs

71
src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/CtorParamWrapper.cs

@ -22,31 +22,61 @@ namespace SharpRefactoring.Gui
{ {
public class CtorParamWrapper : INotifyPropertyChanged public class CtorParamWrapper : INotifyPropertyChanged
{ {
IField field; /// <summary>
/// Underlying member. Always IField or IProperty.
/// </summary>
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 { public string Text {
get { return field.ProjectContent.Language.GetAmbience().Convert(field); } get { return member.ProjectContent.Language.GetAmbience().Convert(member); }
} }
public bool IsNullable { public bool IsNullable {
get { get {
return field.ReturnType.IsReferenceType == true || return member.ReturnType.IsReferenceType == true ||
field.ReturnType.IsConstructedReturnType && field.ReturnType.Name == "Nullable"; member.ReturnType.IsConstructedReturnType && member.ReturnType.Name == "Nullable";
} }
} }
public bool HasRange { public bool HasRange {
get { get {
return (field.ReturnType.IsConstructedReturnType && return IsTypeWithRange(member.ReturnType) ||
IsTypeWithRange(field.ReturnType.CastToConstructedReturnType().TypeArguments.First()) // IsConstructedReturnType handles Nullable types
) || IsTypeWithRange(field.ReturnType); (member.ReturnType.IsConstructedReturnType &&
IsTypeWithRange(member.ReturnType.CastToConstructedReturnType().TypeArguments.First()));
} }
} }
public int Index { get; set; }
bool isSelected; bool isSelected;
public bool IsSelected { public bool IsSelected {
get { return isSelected; } get { return isSelected; }
set { set {
@ -56,7 +86,6 @@ namespace SharpRefactoring.Gui
} }
bool addCheckForNull; bool addCheckForNull;
public bool AddCheckForNull { public bool AddCheckForNull {
get { return addCheckForNull; } get { return addCheckForNull; }
set { set {
@ -66,23 +95,14 @@ namespace SharpRefactoring.Gui
} }
bool addRangeCheck; bool addRangeCheck;
public bool AddRangeCheck { public bool AddRangeCheck {
get { return addRangeCheck; } get { return addRangeCheck; }
set { set {
addRangeCheck = value; 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) bool IsTypeWithRange(IReturnType type)
{ {
return type.Name == "Int32" || return type.Name == "Int32" ||
@ -95,12 +115,11 @@ namespace SharpRefactoring.Gui
type.Name == "UInt64"; type.Name == "UInt64";
} }
public CtorParamWrapper(IField field) static string ToParameterName(string memberName)
{ {
if (field == null || field.ReturnType == null) if (string.IsNullOrEmpty(memberName))
throw new ArgumentNullException("field"); return memberName;
return char.ToLower(memberName[0]) + memberName.Substring(1);
this.field = field;
} }
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;

34
src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs

@ -33,15 +33,23 @@ namespace SharpRefactoring.Gui
{ {
InitializeComponent(); 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<CtorParamWrapper> CreateCtorParams(IEnumerable<IField> fields) IEnumerable<CtorParamWrapper> CreateCtorParams(IEnumerable<IField> fields, IEnumerable<IProperty> properties)
{ {
int i = 0; int i = 0;
foreach (IField f in fields) { foreach (var f in fields) {
yield return new CtorParamWrapper(f) { Index = i, IsSelected = f.IsReadonly }; 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++; i++;
} }
} }
@ -63,15 +71,15 @@ namespace SharpRefactoring.Gui
if (w.Type.IsReferenceType == true) if (w.Type.IsReferenceType == true)
block.AddChild( block.AddChild(
new IfElseStatement( new IfElseStatement(
new BinaryOperatorExpression(new IdentifierExpression(w.Name), BinaryOperatorType.Equality, new PrimitiveExpression(null)), new BinaryOperatorExpression(new IdentifierExpression(w.ParameterName), BinaryOperatorType.Equality, new PrimitiveExpression(null)),
new ThrowStatement(new ObjectCreateExpression(new TypeReference("ArgumentNullException"), new List<Expression>() { new PrimitiveExpression(w.Name, '"' + w.Name + '"') })) new ThrowStatement(new ObjectCreateExpression(new TypeReference("ArgumentNullException"), new List<Expression>() { new PrimitiveExpression(w.ParameterName, '"' + w.ParameterName + '"') }))
) )
); );
else else
block.AddChild( block.AddChild(
new IfElseStatement( new IfElseStatement(
new UnaryOperatorExpression(new MemberReferenceExpression(new IdentifierExpression(w.Name), "HasValue"), UnaryOperatorType.Not), new UnaryOperatorExpression(new MemberReferenceExpression(new IdentifierExpression(w.MemberName), "HasValue"), UnaryOperatorType.Not),
new ThrowStatement(new ObjectCreateExpression(new TypeReference("ArgumentNullException"), new List<Expression>() { new PrimitiveExpression(w.Name, '"' + w.Name + '"') })) new ThrowStatement(new ObjectCreateExpression(new TypeReference("ArgumentNullException"), new List<Expression>() { new PrimitiveExpression(w.ParameterName, '"' + w.ParameterName + '"') }))
) )
); );
} }
@ -79,14 +87,14 @@ namespace SharpRefactoring.Gui
block.AddChild( block.AddChild(
new IfElseStatement( new IfElseStatement(
new BinaryOperatorExpression( 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, 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 ThrowStatement(
new ObjectCreateExpression( new ObjectCreateExpression(
new TypeReference("ArgumentOutOfRangeException"), new TypeReference("ArgumentOutOfRangeException"),
new List<Expression>() { 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<Expression>() { 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) 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 Body = block
}; };

Loading…
Cancel
Save