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. 69
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/CtorParamWrapper.cs
  2. 34
      src/AddIns/Misc/SharpRefactoring/Project/Src/Gui/InsertCtorDialog.xaml.cs

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

@ -22,31 +22,61 @@ namespace SharpRefactoring.Gui @@ -22,31 +22,61 @@ namespace SharpRefactoring.Gui
{
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 {
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 @@ -56,7 +86,6 @@ namespace SharpRefactoring.Gui
}
bool addCheckForNull;
public bool AddCheckForNull {
get { return addCheckForNull; }
set {
@ -66,7 +95,6 @@ namespace SharpRefactoring.Gui @@ -66,7 +95,6 @@ namespace SharpRefactoring.Gui
}
bool addRangeCheck;
public bool AddRangeCheck {
get { return addRangeCheck; }
set {
@ -75,14 +103,6 @@ namespace SharpRefactoring.Gui @@ -75,14 +103,6 @@ namespace SharpRefactoring.Gui
}
}
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 @@ -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;

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

@ -33,15 +33,23 @@ namespace SharpRefactoring.Gui @@ -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<CtorParamWrapper> CreateCtorParams(IEnumerable<IField> fields)
IEnumerable<CtorParamWrapper> CreateCtorParams(IEnumerable<IField> fields, IEnumerable<IProperty> 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 @@ -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<Expression>() { 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<Expression>() { 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<Expression>() { 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<Expression>() { new PrimitiveExpression(w.ParameterName, '"' + w.ParameterName + '"') }))
)
);
}
@ -79,14 +87,14 @@ namespace SharpRefactoring.Gui @@ -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<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 @@ -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
};

Loading…
Cancel
Save