Skip to content

Commit 2fbfc12

Browse files
committed
Refactoring of Validations and conflict detection
Conflict detectors need to align with the two versions of refactoring strategies as well.
1 parent 9cf61d5 commit 2fbfc12

26 files changed

+561
-435
lines changed

Rubberduck.Core/UI/Refactorings/EncapsulateField/EncapsulateFieldViewModel.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ private class MasterDetailSelectionManager
1717
private const string _neverATargetID = "_Never_a_TargetID_";
1818
private bool _detailFieldIsFlagged;
1919

20-
public MasterDetailSelectionManager(IEncapsulatableField selected)
20+
public MasterDetailSelectionManager(IEncapsulateFieldCandidate selected)
2121
: this(selected?.TargetID)
2222
{
2323
if (selected != null)
@@ -101,12 +101,12 @@ public ObservableCollection<IEncapsulatedFieldViewData> EncapsulationFields
101101
{
102102
var viewableFields = new ObservableCollection<IEncapsulatedFieldViewData>();
103103

104-
//var orderedFields = Model.EncapsulationCandidates.Where(ec => !(_selectedObjectStateUDT?.IsEncapsulateFieldCandidate(ec) ?? false))
105-
// .OrderBy(efd => efd.Declaration.Selection).ToList();
106-
107-
var orderedFields = Model.EncapsulationCandidates.Where(ec => !(_selectedObjectStateUDT?.IsExistingDeclaration ?? false))
108-
.OrderBy(efd => efd.Declaration.Selection).ToList();
109-
104+
var orderedFields = Model.EncapsulationCandidates.OrderBy(efd => efd.Declaration.Selection).ToList();
105+
if (_selectedObjectStateUDT != null && _selectedObjectStateUDT.IsExistingDeclaration)
106+
{
107+
orderedFields = Model.EncapsulationCandidates.Where(ec => !_selectedObjectStateUDT.FieldIdentifier.Equals(ec.IdentifierName))
108+
.OrderBy(efd => efd.Declaration.Selection).ToList();
109+
}
110110
foreach (var efd in orderedFields)
111111
{
112112
viewableFields.Add(new ViewableEncapsulatedField(efd));

Rubberduck.Core/UI/Refactorings/EncapsulateField/ViewableEncapsulatedField.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ public interface IEncapsulatedFieldViewData
1919

2020
public class ViewableEncapsulatedField : IEncapsulatedFieldViewData
2121
{
22-
private IEncapsulatableField _efd;
22+
private IEncapsulateFieldCandidate _efd;
2323
private readonly int _hashCode;
24-
public ViewableEncapsulatedField(IEncapsulatableField efd)
24+
public ViewableEncapsulatedField(IEncapsulateFieldCandidate efd)
2525
{
2626
_efd = efd;
2727
_hashCode = efd.TargetID.GetHashCode();

Rubberduck.Refactorings/EncapsulateField/EncapsulateFIeldResources.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static string PreviewMarker
1818

1919
public static string DefaultStateUDTFieldName => "this";
2020

21-
public static string GroupBoxHeaderSuffix = "Property Name:";
21+
public static string GroupBoxHeaderSuffix = "Property Name";
2222

2323
public static string Caption
2424
=> RubberduckUI.EncapsulateField_Caption;

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldElementsBuilder.cs

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,66 +23,93 @@ public EncapsulateFieldElementsBuilder(IDeclarationFinderProvider declarationFin
2323
CreateRefactoringElements();
2424
}
2525

26+
public IObjectStateUDT DefaultObjectStateUDT { private set; get; }
27+
2628
public IObjectStateUDT ObjectStateUDT { private set; get; }
2729

2830
public IEncapsulateFieldValidationsProvider ValidationsProvider { private set; get; }
2931

30-
public IEnumerable<IEncapsulatableField> Candidates { private set; get; }
32+
public IEnumerable<IEncapsulateFieldCandidate> Candidates { private set; get; }
33+
34+
public IEnumerable<IObjectStateUDT> ObjectStateUDTCandidates { private set; get; } = new List<IObjectStateUDT>();
3135

3236
private void CreateRefactoringElements()
3337
{
3438
var fieldDeclarations = _declarationFinderProvider.DeclarationFinder
3539
.Members(_targetQMN)
3640
.Where(v => v.IsMemberVariable() && !v.IsWithEvents);
3741

38-
ValidationsProvider = new EncapsulateFieldValidationsProvider();
39-
40-
var nameValidator = ValidationsProvider.NameOnlyValidator(NameValidators.Default);
42+
var defaultNamesValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.Default);
4143

42-
var candidates = new List<IEncapsulatableField>();
44+
var candidates = new List<IEncapsulateFieldCandidate>();
4345
foreach (var fieldDeclaration in fieldDeclarations)
4446
{
4547
Debug.Assert(!fieldDeclaration.DeclarationType.Equals(DeclarationType.UserDefinedTypeMember));
4648

47-
var fieldEncapsulationCandidate = CreateCandidate(fieldDeclaration, nameValidator);
48-
49+
var fieldEncapsulationCandidate = CreateCandidate(fieldDeclaration, defaultNamesValidator);
4950

5051
candidates.Add(fieldEncapsulationCandidate);
5152
}
5253

53-
ValidationsProvider.RegisterCandidates(candidates);
54+
Candidates = candidates;
55+
56+
ObjectStateUDTCandidates = BuildObjectStateUDTCandidates(candidates).ToList();
57+
58+
var objectStateUDTIdentifier = $"T{_targetQMN.ComponentName}";
59+
ObjectStateUDT = ObjectStateUDTCandidates.FirstOrDefault(os => os.AsTypeDeclaration.IdentifierName.StartsWith(objectStateUDTIdentifier, StringComparison.InvariantCultureIgnoreCase));
60+
61+
DefaultObjectStateUDT = CreateStateUDTField();
62+
DefaultObjectStateUDT.IsSelected = true;
63+
if (ObjectStateUDT != null)
64+
{
65+
ObjectStateUDT.IsSelected = true;
66+
DefaultObjectStateUDT.IsSelected = false;
67+
}
68+
69+
ObjectStateUDTCandidates = ObjectStateUDTCandidates.Concat(new IObjectStateUDT[] { DefaultObjectStateUDT });
5470

55-
var conflictsValidator = ValidationsProvider.ConflictDetector(EncapsulateFieldStrategy.UseBackingFields, _declarationFinderProvider);
71+
ValidationsProvider = new EncapsulateFieldValidationsProvider(Candidates, ObjectStateUDTCandidates);
5672

57-
ObjectStateUDT = CreateStateUDTField(conflictsValidator);
73+
var conflictsFinder = ValidationsProvider.ConflictDetector(EncapsulateFieldStrategy.UseBackingFields, _declarationFinderProvider);
5874
foreach (var candidate in candidates)
5975
{
60-
candidate.ConflictFinder = conflictsValidator;
61-
conflictsValidator.AssignNoConflictIdentifier(candidate, DeclarationType.Property);
62-
conflictsValidator.AssignNoConflictIdentifier(candidate, DeclarationType.Variable);
76+
candidate.ConflictFinder = conflictsFinder;
6377
}
78+
}
6479

65-
Candidates = candidates;
80+
private IEnumerable<IObjectStateUDT> BuildObjectStateUDTCandidates(IEnumerable<IEncapsulateFieldCandidate> candidates) //, IObjectStateUDT defaultObjectStateUDT)
81+
{
82+
var udtCandidates = candidates.Where(c => c is IUserDefinedTypeCandidate udt
83+
&& udt.CanBeObjectStateUDT);
84+
85+
var objectStateUDTs = new List<IObjectStateUDT>();
86+
foreach (var udt in udtCandidates)
87+
{
88+
objectStateUDTs.Add(new ObjectStateUDT(udt as IUserDefinedTypeCandidate));
89+
}
90+
91+
var objectStateUDTIdentifier = $"T{_targetQMN.ComponentName}";
92+
var objectStateUDT = objectStateUDTs.FirstOrDefault(os => os.AsTypeDeclaration.IdentifierName.StartsWith(objectStateUDTIdentifier, StringComparison.InvariantCultureIgnoreCase));
93+
94+
return objectStateUDTs;
6695
}
6796

68-
private IObjectStateUDT CreateStateUDTField(IEncapsulateFieldConflictFinder validator)
97+
private IObjectStateUDT CreateStateUDTField()
6998
{
7099
var stateUDT = new ObjectStateUDT(_targetQMN) as IObjectStateUDT;
71100

72-
stateUDT.FieldIdentifier = validator.CreateNonConflictIdentifierForProposedType(stateUDT.FieldIdentifier, _targetQMN, DeclarationType.Variable);
73-
74-
stateUDT.TypeIdentifier = validator.CreateNonConflictIdentifierForProposedType(stateUDT.TypeIdentifier, _targetQMN, DeclarationType.UserDefinedType);
101+
EncapsulateFieldValidationsProvider.AssignNoConflictIdentifiers(stateUDT, _declarationFinderProvider);
75102

76103
stateUDT.IsSelected = true;
77104

78105
return stateUDT;
79106
}
80107

81-
private IEncapsulatableField CreateCandidate(Declaration target, IValidateVBAIdentifiers validator)// Predicate<string> nameValidator)
108+
private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidateVBAIdentifiers validator)// Predicate<string> nameValidator)
82109
{
83110
if (target.IsUserDefinedTypeField())
84111
{
85-
var udtValidator = ValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedType);
112+
var udtValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedType);
86113
var udtField = new UserDefinedTypeCandidate(target, udtValidator) as IUserDefinedTypeCandidate;
87114

88115
(Declaration udtDeclaration, IEnumerable<Declaration> udtMembers) = GetUDTAndMembersForField(udtField);
@@ -93,10 +120,10 @@ private IEncapsulatableField CreateCandidate(Declaration target, IValidateVBAIde
93120

94121
foreach (var udtMemberDeclaration in udtMembers)
95122
{
96-
var udtMemberValidator = ValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMember);
123+
var udtMemberValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMember);
97124
if (udtMemberDeclaration.IsArray)
98125
{
99-
udtMemberValidator = ValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMemberArray);
126+
udtMemberValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMemberArray);
100127
}
101128
var candidateUDTMember = new UserDefinedTypeMemberCandidate(CreateCandidate(udtMemberDeclaration, udtMemberValidator), udtField) as IUserDefinedTypeMemberCandidate;
102129

@@ -106,7 +133,9 @@ private IEncapsulatableField CreateCandidate(Declaration target, IValidateVBAIde
106133
var udtVariablesOfSameType = _declarationFinderProvider.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
107134
.Where(v => v.AsTypeDeclaration == udtDeclaration);
108135

109-
udtField.CanBeObjectStateUDT = udtField.TypeDeclarationIsPrivate && udtVariablesOfSameType.Count() == 1;
136+
udtField.CanBeObjectStateUDT = udtField.TypeDeclarationIsPrivate
137+
&& udtField.Declaration.HasPrivateAccessibility()
138+
&& udtVariablesOfSameType.Count() == 1;
110139

111140
return udtField;
112141
}

0 commit comments

Comments
 (0)