Skip to content

Commit b4ab4a8

Browse files
committed
WIP - reworking interfaces. All tests pass
1 parent aefff96 commit b4ab4a8

24 files changed

+1306
-588
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ public ObservableCollection<IEncapsulatedFieldViewData> EncapsulationFields
101101
{
102102
var viewableFields = new ObservableCollection<IEncapsulatedFieldViewData>();
103103

104-
var orderedFields = Model.EncapsulationCandidates.Where(ec => !(_selectedObjectStateUDT?.IsEncapsulateFieldCandidate(ec) ?? false))
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))
105108
.OrderBy(efd => efd.Declaration.Selection).ToList();
106109

107110
foreach (var efd in orderedFields)
@@ -266,10 +269,13 @@ public bool IsReadOnly
266269

267270
public bool ConvertFieldsToUDTMembers
268271
{
269-
get => Model.ConvertFieldsToUDTMembers;
272+
get => Model.EncapsulateFieldStrategy == EncapsulateFieldStrategy.ConvertFieldsToUDTMembers; // Model.ConvertFieldsToUDTMembers;
270273
set
271274
{
272-
Model.ConvertFieldsToUDTMembers = value;
275+
//Model.ConvertFieldsToUDTMembers = value;
276+
Model.EncapsulateFieldStrategy = value
277+
? EncapsulateFieldStrategy.ConvertFieldsToUDTMembers
278+
: EncapsulateFieldStrategy.UseBackingFields;
273279
ReloadListAndPreview();
274280
RefreshValidationResults();
275281
UpdateDetailForSelection();

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ public bool TryValidateEncapsulationAttributes(out string errorMessage)
7373

7474
public bool CanBeReadWrite => _efd.CanBeReadWrite;
7575

76-
public string PropertyName { get => _efd.PropertyName; set => _efd.PropertyName = value; }
76+
public string PropertyName { get => _efd.PropertyIdentifier; set => _efd.PropertyIdentifier = value; }
77+
//public string PropertyIdentifier { get => _efd.PropertyIdentifier; set => _efd.PropertyIdentifier = value; }
7778

7879
public bool EncapsulateFlag { get => _efd.EncapsulateFlag; set => _efd.EncapsulateFlag = value; }
7980

Rubberduck.Refactorings/EncapsulateField/ConflictDetectors.cs

Lines changed: 362 additions & 0 deletions
Large diffs are not rendered by default.

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldElementFactory.cs

Lines changed: 64 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Rubberduck.Parsing.Grammar;
22
using Rubberduck.Parsing.Symbols;
33
using Rubberduck.Parsing.VBA;
4+
using Rubberduck.Refactorings.Common;
45
using Rubberduck.Refactorings.EncapsulateField.Extensions;
56
using Rubberduck.VBEditor;
67
using System;
@@ -13,42 +14,94 @@ namespace Rubberduck.Refactorings.EncapsulateField
1314
public class EncapsulateFieldElementFactory
1415
{
1516
private readonly IDeclarationFinderProvider _declarationFinderProvider;
16-
//private readonly IEncapsulateFieldValidator _validator;
17-
//private readonly IValidateEncapsulateFieldNames _namesValidator;
1817
private QualifiedModuleName _targetQMN;
1918

2019
public EncapsulateFieldElementFactory(IDeclarationFinderProvider declarationFinderProvider, QualifiedModuleName targetQMN)//, IEncapsulateFieldValidator validator )
2120
{
2221
_declarationFinderProvider = declarationFinderProvider;
23-
//_validator = validator;
24-
//_namesValidator = validator as IValidateEncapsulateFieldNames;
2522
_targetQMN = targetQMN;
23+
CreateRefactoringElements();
2624
}
2725

28-
public IObjectStateUDT CreateStateUDTField(IEncapsulateFieldValidator validator)
26+
public IObjectStateUDT ObjectStateUDT { private set; get; }
27+
28+
public IEncapsulateFieldValidationsProvider ValidatorProvider { private set; get; }
29+
30+
public IEnumerable<IEncapsulateFieldCandidate> Candidates { private set; get; }
31+
32+
private void CreateRefactoringElements()
33+
{
34+
var fieldDeclarations = _declarationFinderProvider.DeclarationFinder
35+
.Members(_targetQMN)
36+
.Where(v => v.IsMemberVariable() && !v.IsWithEvents);
37+
38+
ValidatorProvider = new EncapsulateFieldValidationsProvider();
39+
40+
var nameValidator = ValidatorProvider.NameOnlyValidator(Validators.Default);
41+
42+
var candidates = new List<IEncapsulateFieldCandidate>();
43+
foreach (var fieldDeclaration in fieldDeclarations)
44+
{
45+
Debug.Assert(!fieldDeclaration.DeclarationType.Equals(DeclarationType.UserDefinedTypeMember));
46+
47+
var fieldEncapsulationCandidate = CreateCandidate(fieldDeclaration, nameValidator);
48+
49+
50+
candidates.Add(fieldEncapsulationCandidate);
51+
}
52+
53+
ValidatorProvider.RegisterCandidates(candidates);
54+
55+
var conflictsValidator = ValidatorProvider.ConflictDetector(EncapsulateFieldStrategy.UseBackingFields, _declarationFinderProvider);
56+
57+
ObjectStateUDT = CreateStateUDTField(conflictsValidator);
58+
foreach (var candidate in candidates)
59+
{
60+
candidate.ConflictFinder = conflictsValidator;
61+
conflictsValidator.AssignNoConflictIdentifier(candidate, DeclarationType.Property);
62+
conflictsValidator.AssignNoConflictIdentifier(candidate, DeclarationType.Variable);
63+
64+
var converted = candidate as IConvertToUDTMember;
65+
converted.ObjectStateUDT = ObjectStateUDT;
66+
}
67+
68+
Candidates = candidates;
69+
}
70+
71+
private IObjectStateUDT CreateStateUDTField(IEncapsulateFieldConflictFinder validator)
2972
{
3073
var stateUDT = new ObjectStateUDT(_targetQMN) as IObjectStateUDT;
3174

32-
stateUDT = SetNonConflictIdentifier(stateUDT, c => { return validator.IsConflictingStateUDTFieldIdentifier(stateUDT); }, (s) => { stateUDT.FieldIdentifier = s; }, () => stateUDT.FieldIdentifier, validator as IValidateEncapsulateFieldNames); // _namesValidator);
75+
stateUDT.FieldIdentifier = validator.CreateNonConflictIdentifierForProposedType(stateUDT.FieldIdentifier, _targetQMN, DeclarationType.Variable);
3376

34-
stateUDT = SetNonConflictIdentifier(stateUDT, c => { return validator.IsConflictingStateUDTTypeIdentifier(stateUDT); }, (s) => { stateUDT.TypeIdentifier = s; }, () => stateUDT.TypeIdentifier, validator as IValidateEncapsulateFieldNames); // _namesValidator);
77+
stateUDT.TypeIdentifier = validator.CreateNonConflictIdentifierForProposedType(stateUDT.TypeIdentifier, _targetQMN, DeclarationType.UserDefinedType);
78+
79+
stateUDT.IsSelected = true;
3580

3681
return stateUDT;
3782
}
3883

39-
private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidateEncapsulateFieldNames validator)
84+
private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidateVBAIdentifiers validator)// Predicate<string> nameValidator)
4085
{
4186
if (target.IsUserDefinedTypeField())
4287
{
43-
var udtField = new UserDefinedTypeCandidate(target, validator) as IUserDefinedTypeCandidate;
88+
var udtValidator = ValidatorProvider.NameOnlyValidator(Validators.UserDefinedType);
89+
var udtField = new UserDefinedTypeCandidate(target, udtValidator) as IUserDefinedTypeCandidate;
4490

4591
(Declaration udtDeclaration, IEnumerable<Declaration> udtMembers) = GetUDTAndMembersForField(udtField);
4692

4793
udtField.TypeDeclarationIsPrivate = udtDeclaration.HasPrivateAccessibility();
4894

95+
udtField.NameValidator = udtValidator;
96+
4997
foreach (var udtMemberDeclaration in udtMembers)
5098
{
51-
var candidateUDTMember = new UserDefinedTypeMemberCandidate(CreateCandidate(udtMemberDeclaration, validator), udtField, validator) as IUserDefinedTypeMemberCandidate;
99+
var udtMemberValidator = ValidatorProvider.NameOnlyValidator(Validators.UserDefinedTypeMember);
100+
if (udtMemberDeclaration.IsArray)
101+
{
102+
udtMemberValidator = ValidatorProvider.NameOnlyValidator(Validators.UserDefinedTypeMemberArray);
103+
}
104+
var candidateUDTMember = new UserDefinedTypeMemberCandidate(CreateCandidate(udtMemberDeclaration, udtMemberValidator), udtField) as IUserDefinedTypeMemberCandidate;
52105

53106
udtField.AddMember(candidateUDTMember);
54107
}
@@ -64,41 +117,8 @@ private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidate
64117
{
65118
return new ArrayCandidate(target, validator);
66119
}
67-
return new EncapsulateFieldCandidate(target, validator);
68-
}
69-
70-
public IEnumerable<IEncapsulateFieldCandidate> CreateEncapsulationCandidates(IValidateEncapsulateFieldNames validator)
71-
{
72-
var fieldDeclarations = _declarationFinderProvider.DeclarationFinder
73-
.Members(_targetQMN)
74-
.Where(v => v.IsMemberVariable() && !v.IsWithEvents);
75-
76-
var candidates = new List<IEncapsulateFieldCandidate>();
77-
foreach (var fieldDeclaration in fieldDeclarations)
78-
{
79-
Debug.Assert(!fieldDeclaration.DeclarationType.Equals(DeclarationType.UserDefinedTypeMember));
80-
81-
var fieldEncapsulationCandidate = CreateCandidate(fieldDeclaration, validator);
82-
83-
//_namesValidator.AssignNoConflictIdentifier(fieldEncapsulationCandidate, DeclarationType.Property);
84-
//_namesValidator.AssignNoConflictIdentifier(fieldEncapsulationCandidate, DeclarationType.Variable);
85-
86-
//_validator.RegisterFieldCandidate(fieldEncapsulationCandidate);
87-
88-
candidates.Add(fieldEncapsulationCandidate);
89-
}
90-
91-
return candidates;
92-
}
93120

94-
private IObjectStateUDT SetNonConflictIdentifier(IObjectStateUDT candidate, Predicate<IObjectStateUDT> conflictDetector, Action<string> setValue, Func<string> getIdentifier, IValidateEncapsulateFieldNames validator)
95-
{
96-
var isConflictingIdentifier = conflictDetector(candidate);
97-
for (var count = 1; count < 10 && isConflictingIdentifier; count++)
98-
{
99-
setValue(getIdentifier().IncrementEncapsulationIdentifier());
100-
isConflictingIdentifier = conflictDetector(candidate);
101-
}
121+
var candidate = new EncapsulateFieldCandidate(target, validator);
102122
return candidate;
103123
}
104124

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldModel.cs

Lines changed: 76 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using Rubberduck.Parsing.Symbols;
5+
using Rubberduck.Parsing.VBA;
56
using Rubberduck.Refactorings.EncapsulateField.Extensions;
67
using Rubberduck.VBEditor;
78

@@ -12,22 +13,41 @@ public class EncapsulateFieldModel : IRefactoringModel
1213
private readonly Func<EncapsulateFieldModel, string> _previewDelegate;
1314
private QualifiedModuleName _targetQMN;
1415
//private IValidateEncapsulateFieldNames _validator;
16+
private IDeclarationFinderProvider _declarationFinderProvider;
17+
private IEncapsulateFieldValidationsProvider _validatorProvider;
1518
private IObjectStateUDT _newObjectStateUDT;
1619

1720
private IDictionary<Declaration, (Declaration, IEnumerable<Declaration>)> _udtFieldToUdtDeclarationMap = new Dictionary<Declaration, (Declaration, IEnumerable<Declaration>)>();
1821

19-
public EncapsulateFieldModel(Declaration target, IEnumerable<IEncapsulateFieldCandidate> candidates, IObjectStateUDT stateUDTField, Func<EncapsulateFieldModel, string> previewDelegate, IEncapsulateFieldValidator validator)
22+
public EncapsulateFieldModel(Declaration target, IEnumerable<IEncapsulateFieldCandidate> candidates, IObjectStateUDT stateUDTField, Func<EncapsulateFieldModel, string> previewDelegate, IDeclarationFinderProvider declarationFinderProvider, IEncapsulateFieldValidationsProvider validatorProvider) // IEncapsulateFieldValidator validator)
2023
{
2124
_previewDelegate = previewDelegate;
2225
_targetQMN = target.QualifiedModuleName;
2326
_newObjectStateUDT = stateUDTField;
27+
_declarationFinderProvider = declarationFinderProvider;
28+
_validatorProvider = validatorProvider;
2429

25-
Validator = validator;
2630
EncapsulationCandidates = candidates.ToList();
27-
ConvertFieldsToUDTMembers = false;
31+
EncapsulateFieldStrategy = EncapsulateFieldStrategy.UseBackingFields;
2832
}
2933

30-
public IEncapsulateFieldValidator Validator {set; get;}
34+
public QualifiedModuleName QualifiedModuleName => _targetQMN;
35+
36+
private EncapsulateFieldStrategy _encapsulationFieldStategy;
37+
public EncapsulateFieldStrategy EncapsulateFieldStrategy
38+
{
39+
set
40+
{
41+
_encapsulationFieldStategy = value;
42+
AssignCandidateValidations(value);
43+
}
44+
get => _encapsulationFieldStategy;
45+
}
46+
47+
public IEncapsulateFieldValidationsProvider ValidatorProvider => _validatorProvider;
48+
49+
public IEncapsulateFieldConflictFinder ConflictDetector
50+
=> _validatorProvider.ConflictDetector(EncapsulateFieldStrategy, _declarationFinderProvider);
3151

3252
public List<IEncapsulateFieldCandidate> EncapsulationCandidates { set; get; } = new List<IEncapsulateFieldCandidate>();
3353

@@ -49,30 +69,69 @@ public IEncapsulateFieldCandidate this[string encapsulatedFieldTargetID]
4969

5070
public IEncapsulateFieldCandidate this[Declaration fieldDeclaration]
5171
=> EncapsulationCandidates.Where(c => c.Declaration == fieldDeclaration).Single();
72+
73+
////TODO: Get rid of this property
74+
//private bool _convertFieldsToUDTMembers;
75+
//public bool ConvertFieldsToUDTMembers
76+
//{
77+
// set
78+
// {
79+
// _convertFieldsToUDTMembers = value;
80+
81+
// EncapsulateFieldStrategy = value
82+
// ? EncapsulateFieldStrategy.ConvertFieldsToUDTMembers
83+
// : EncapsulateFieldStrategy.UseBackingFields;
84+
// }
85+
// get => _convertFieldsToUDTMembers;
86+
//}
5287

53-
private bool _convertFieldsToUDTMembers;
54-
public bool ConvertFieldsToUDTMembers
88+
private IObjectStateUDT _activeObjectStateUDT;
89+
public IObjectStateUDT StateUDTField
5590
{
5691
set
5792
{
58-
_convertFieldsToUDTMembers = value;
59-
SetFieldsToUDTMemberFlags(value);
93+
_activeObjectStateUDT = value;
94+
foreach (var candidate in EncapsulationCandidates)
95+
{
96+
if (candidate is IConvertToUDTMember udtMember)
97+
{
98+
udtMember.ObjectStateUDT = value;
99+
}
100+
}
60101
}
61-
get => _convertFieldsToUDTMembers;
62-
}
63-
64-
private IObjectStateUDT _activeObjectStateUDT;
65-
public IObjectStateUDT StateUDTField
66-
{
67-
set => _activeObjectStateUDT = value;
68102
get => _activeObjectStateUDT ?? _newObjectStateUDT;
69103
}
70104

71-
private void SetFieldsToUDTMemberFlags(bool value)
105+
public void AssignCandidateValidations(EncapsulateFieldStrategy strategy)
72106
{
73107
foreach (var candidate in EncapsulationCandidates)
74108
{
75-
candidate.ConvertFieldToUDTMember = value;
109+
candidate.ConvertFieldToUDTMember = strategy == EncapsulateFieldStrategy.ConvertFieldsToUDTMembers;
110+
111+
candidate.ConflictFinder = ConflictDetector;
112+
if (strategy == EncapsulateFieldStrategy.UseBackingFields)
113+
{
114+
if (candidate is IUserDefinedTypeCandidate)
115+
{
116+
candidate.NameValidator = _validatorProvider.NameOnlyValidator(Validators.UserDefinedType);
117+
}
118+
else if (candidate is IUserDefinedTypeMemberCandidate)
119+
{
120+
candidate.NameValidator = candidate.Declaration.IsArray
121+
? _validatorProvider.NameOnlyValidator(Validators.UserDefinedTypeMemberArray)
122+
: _validatorProvider.NameOnlyValidator(Validators.UserDefinedTypeMember);
123+
}
124+
else
125+
{
126+
candidate.NameValidator = _validatorProvider.NameOnlyValidator(Validators.Default);
127+
}
128+
}
129+
else
130+
{
131+
candidate.NameValidator = candidate.Declaration.IsArray
132+
? _validatorProvider.NameOnlyValidator(Validators.UserDefinedTypeMemberArray)
133+
: _validatorProvider.NameOnlyValidator(Validators.UserDefinedTypeMember);
134+
}
76135
}
77136
}
78137

0 commit comments

Comments
 (0)