Skip to content

Commit 05bae54

Browse files
committed
Add new factories (7)
Added EncapsulateFieldConflictFinderFactory, EncapsulateFieldModelFactory, EncapsulateFieldRequestFactory, EncapsulateFieldUseBackingFieldModelFactory EncapsulateFieldUseBackingUDTMemberModelFactory, EncapsulateFieldCandidateCollectionFactory, ObjectStateUserDefinedTypeFactory
1 parent 42fe165 commit 05bae54

File tree

7 files changed

+265
-145
lines changed

7 files changed

+265
-145
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using Rubberduck.Parsing.VBA;
2+
using Rubberduck.Refactorings.EncapsulateField;
3+
using System.Collections.Generic;
4+
5+
namespace Rubberduck.Refactorings
6+
{
7+
public interface IEncapsulateFieldConflictFinderFactory
8+
{
9+
IEncapsulateFieldConflictFinder CreateEncapsulateFieldUseBackingFieldConflictFinder(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates);
10+
IEncapsulateFieldConflictFinder CreateEncapsulateFieldUseBackingUDTMemberConflictFinder(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IReadOnlyCollection<IObjectStateUDT> objectStateUDTs);
11+
}
12+
13+
public class EncapsulateFieldConflictFinderFactory : IEncapsulateFieldConflictFinderFactory
14+
{
15+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
16+
public EncapsulateFieldConflictFinderFactory(IDeclarationFinderProvider declarationFinderProvider)
17+
{
18+
_declarationFinderProvider = declarationFinderProvider;
19+
}
20+
21+
public IEncapsulateFieldConflictFinder CreateEncapsulateFieldUseBackingFieldConflictFinder(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates)
22+
{
23+
return new EncapsulateFieldUseBackingFieldsConflictFinder(_declarationFinderProvider, candidates);
24+
}
25+
26+
public IEncapsulateFieldConflictFinder CreateEncapsulateFieldUseBackingUDTMemberConflictFinder(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IReadOnlyCollection<IObjectStateUDT> objectStateUDTs)
27+
{
28+
return new EncapsulateFieldUseBackingUDTMemberConflictFinder(_declarationFinderProvider, candidates, objectStateUDTs);
29+
}
30+
}
31+
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldModelFactory.cs

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,61 @@
11
using Rubberduck.Parsing.Symbols;
22
using Rubberduck.Parsing.VBA;
3-
using Rubberduck.Refactorings.Common;
43
using Rubberduck.Refactorings.EncapsulateField;
5-
using Rubberduck.VBEditor;
4+
using System;
65
using System.Collections.Generic;
7-
using System.Linq;
86

97
namespace Rubberduck.Refactorings
108
{
11-
public interface IEncapsulateFieldModelsFactory<T>
12-
{
13-
T Create(QualifiedModuleName qmn);
14-
T Create(IEnumerable<IEncapsulateFieldCandidate> candidates, IEnumerable<IObjectStateUDT> objectStateUDTCandidates);
15-
}
16-
179
public interface IEncapsulateFieldModelFactory
1810
{
11+
/// <summary>
12+
/// Creates the supporting EncapsulateFieldRefactoringAction models for the EncapsulateFieldRefactoring.
13+
/// </summary>
1914
EncapsulateFieldModel Create(Declaration target);
2015
}
2116

2217
public class EncapsulateFieldModelFactory : IEncapsulateFieldModelFactory
2318
{
24-
private readonly IDeclarationFinderProvider _declarationFinderProvider;
25-
private readonly IEncapsulateFieldCandidateFactory _encapsulateFieldCandidateFactory;
2619
private readonly IEncapsulateFieldUseBackingUDTMemberModelFactory _useBackingUDTMemberModelFactory;
2720
private readonly IEncapsulateFieldUseBackingFieldModelFactory _useBackingFieldModelFactory;
21+
private readonly IEncapsulateFieldCandidateCollectionFactory _fieldCandidateCollectionFactory;
22+
private readonly IEncapsulateFieldRequestFactory _requestFactory;
2823

29-
public EncapsulateFieldModelFactory(IDeclarationFinderProvider declarationFinderProvider,
30-
IEncapsulateFieldCandidateFactory encapsulateFieldCandidateFactory,
24+
public EncapsulateFieldModelFactory(
3125
IEncapsulateFieldUseBackingUDTMemberModelFactory encapsulateFieldUseBackingUDTMemberModelFactory,
32-
IEncapsulateFieldUseBackingFieldModelFactory encapsulateFieldUseBackingFieldModelFactory)
26+
IEncapsulateFieldUseBackingFieldModelFactory encapsulateFieldUseBackingFieldModelFactory,
27+
IEncapsulateFieldCandidateCollectionFactory encapsulateFieldCandidateCollectionFactory,
28+
IEncapsulateFieldRequestFactory encapsulateFieldRequestFactory)
3329
{
34-
_declarationFinderProvider = declarationFinderProvider;
35-
_encapsulateFieldCandidateFactory = encapsulateFieldCandidateFactory;
36-
_useBackingUDTMemberModelFactory = encapsulateFieldUseBackingUDTMemberModelFactory;
30+
_useBackingUDTMemberModelFactory = encapsulateFieldUseBackingUDTMemberModelFactory as IEncapsulateFieldUseBackingUDTMemberModelFactory;
3731
_useBackingFieldModelFactory = encapsulateFieldUseBackingFieldModelFactory;
32+
_fieldCandidateCollectionFactory = encapsulateFieldCandidateCollectionFactory;
33+
_requestFactory = encapsulateFieldRequestFactory;
3834
}
3935

4036
public EncapsulateFieldModel Create(Declaration target)
4137
{
42-
var fields = _declarationFinderProvider.DeclarationFinder
43-
.Members(target.QualifiedModuleName)
44-
.Where(v => v.IsMemberVariable() && !v.IsWithEvents);
45-
46-
var candidates = fields.Select(fd => _encapsulateFieldCandidateFactory.Create(fd))
47-
.ToList();
38+
if (!(target is VariableDeclaration targetField))
39+
{
40+
throw new ArgumentException();
41+
}
42+
43+
var fieldCandidates = _fieldCandidateCollectionFactory.Create(targetField.QualifiedModuleName);
4844

49-
var objectStateUDTCandidates = candidates.Where(c => c is IUserDefinedTypeCandidate udt
50-
&& udt.CanBeObjectStateUDT)
51-
.Select(udtc => new ObjectStateUDT(udtc as IUserDefinedTypeCandidate))
52-
.ToList();
45+
var encapsulationRequest = _requestFactory.Create(targetField);
46+
var requests = new List<EncapsulateFieldRequest>() { encapsulationRequest };
5347

54-
var initialStrategy = objectStateUDTCandidates
55-
.Any(os => os.AsTypeDeclaration.IdentifierName.StartsWith($"T{target.QualifiedModuleName.ComponentName}", System.StringComparison.InvariantCultureIgnoreCase))
56-
? EncapsulateFieldStrategy.ConvertFieldsToUDTMembers
57-
: EncapsulateFieldStrategy.UseBackingFields;
48+
var useBackingFieldModel = _useBackingFieldModelFactory.Create(fieldCandidates, requests);
5849

59-
var selected = candidates.Single(c => c.Declaration == target);
60-
selected.EncapsulateFlag = true;
50+
var useBackingUDTMemberModel = _useBackingUDTMemberModelFactory.Create(fieldCandidates, requests);
6151

62-
var udtModel = _useBackingUDTMemberModelFactory.Create(candidates, objectStateUDTCandidates);
63-
var backingModel = _useBackingFieldModelFactory.Create(candidates, objectStateUDTCandidates);
52+
var initialStrategy = useBackingUDTMemberModel.ObjectStateUDTField.IsExistingDeclaration
53+
? EncapsulateFieldStrategy.ConvertFieldsToUDTMembers
54+
: EncapsulateFieldStrategy.UseBackingFields;
6455

65-
return new EncapsulateFieldModel(backingModel, udtModel)
56+
return new EncapsulateFieldModel(useBackingFieldModel, useBackingUDTMemberModel)
6657
{
67-
EncapsulateFieldStrategy = initialStrategy
58+
EncapsulateFieldStrategy = initialStrategy,
6859
};
6960
}
7061
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Rubberduck.Parsing.Symbols;
2+
3+
namespace Rubberduck.Refactorings.EncapsulateField
4+
{
5+
public interface IEncapsulateFieldRequestFactory
6+
{
7+
EncapsulateFieldRequest Create(VariableDeclaration target, bool isReadOnly = false, string propertyIdentifier = null);
8+
}
9+
10+
public class EncapsulateFieldRequestFactory : IEncapsulateFieldRequestFactory
11+
{
12+
public EncapsulateFieldRequest Create(VariableDeclaration target, bool isReadOnly = false, string propertyIdentifier = null)
13+
{
14+
return new EncapsulateFieldRequest(target, isReadOnly, propertyIdentifier);
15+
}
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,71 @@
11
using Rubberduck.Parsing.Symbols;
22
using Rubberduck.Parsing.VBA;
3-
using Rubberduck.Refactorings.Common;
43
using Rubberduck.Refactorings.EncapsulateField;
54
using Rubberduck.Refactorings.EncapsulateFieldUseBackingField;
6-
using Rubberduck.VBEditor;
75
using System.Collections.Generic;
86
using System.Linq;
97

108
namespace Rubberduck.Refactorings
119
{
12-
public interface IEncapsulateFieldUseBackingFieldModelFactory : IEncapsulateFieldModelsFactory<EncapsulateFieldUseBackingFieldModel>
13-
{ }
10+
public interface IEncapsulateFieldUseBackingFieldModelFactory
11+
{
12+
/// <summary>
13+
/// Creates an <c>EncapsulateFieldUseBackingFieldModel</c> used by the <c>EncapsulateFieldUseBackingFieldRefactoringAction</c>.
14+
/// </summary>
15+
/// <param name="clientTarget">Optional: <c>UserDefinedType</c> Field to include the Encapsulated Field(s)</param>
16+
EncapsulateFieldUseBackingFieldModel Create(IEnumerable<EncapsulateFieldRequest> requests);
17+
18+
/// <summary>
19+
/// Creates an <c>EncapsulateFieldUseBackingFieldModel</c> based upon collection of
20+
/// <c>IEncapsulateFieldCandidate</c> instances created by <c>EncapsulateFieldCandidateCollectionFactory</c>.
21+
/// This function is intended for exclusive use by <c>EncapsulateFieldModelFactory</c>
22+
/// </summary>
23+
EncapsulateFieldUseBackingFieldModel Create(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IEnumerable<EncapsulateFieldRequest> requests);
24+
}
1425

1526
public class EncapsulateFieldUseBackingFieldModelFactory : IEncapsulateFieldUseBackingFieldModelFactory
1627
{
1728
private readonly IDeclarationFinderProvider _declarationFinderProvider;
18-
private readonly IEncapsulateFieldCandidateFactory _fieldCandidateFactory;
29+
private readonly IEncapsulateFieldCandidateCollectionFactory _fieldCandidateCollectionFactory;
30+
private readonly IEncapsulateFieldConflictFinderFactory _conflictFinderFactory;
1931

2032
public EncapsulateFieldUseBackingFieldModelFactory(IDeclarationFinderProvider declarationFinderProvider,
21-
IEncapsulateFieldCandidateFactory fieldCandidateFactory)
33+
IEncapsulateFieldCandidateCollectionFactory encapsulateFieldCandidateCollectionFactory,
34+
IEncapsulateFieldConflictFinderFactory encapsulateFieldConflictFinderFactory)
2235
{
2336
_declarationFinderProvider = declarationFinderProvider;
24-
_fieldCandidateFactory = fieldCandidateFactory;
37+
_fieldCandidateCollectionFactory = encapsulateFieldCandidateCollectionFactory;
38+
_conflictFinderFactory = encapsulateFieldConflictFinderFactory;
2539
}
2640

27-
public EncapsulateFieldUseBackingFieldModel Create(QualifiedModuleName qmn)
41+
public EncapsulateFieldUseBackingFieldModel Create(IEnumerable<EncapsulateFieldRequest> requests)
2842
{
29-
var fields = _declarationFinderProvider.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
30-
.Where(v => v.ParentDeclaration is ModuleDeclaration
31-
&& !v.IsWithEvents);
32-
33-
var candidates = fields.Select(f => _fieldCandidateFactory.Create(f));
34-
35-
var objectStateUDTCandidates = candidates.Where(c => c is IUserDefinedTypeCandidate udt && udt.CanBeObjectStateUDT)
36-
.Select(udtc => new ObjectStateUDT(udtc as IUserDefinedTypeCandidate));
43+
if (!requests.Any())
44+
{
45+
return new EncapsulateFieldUseBackingFieldModel(Enumerable.Empty<IEncapsulateFieldCandidate>(), _declarationFinderProvider);
46+
}
3747

38-
return Create(candidates, objectStateUDTCandidates);
48+
var fieldCandidates = _fieldCandidateCollectionFactory.Create(requests.First().Declaration.QualifiedModuleName);
49+
return Create(fieldCandidates, requests);
3950
}
4051

41-
public EncapsulateFieldUseBackingFieldModel Create(IEnumerable<IEncapsulateFieldCandidate> candidates, IEnumerable<IObjectStateUDT> objectStateUDTCandidates)
52+
public EncapsulateFieldUseBackingFieldModel Create(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IEnumerable<EncapsulateFieldRequest> requests)
4253
{
43-
var fieldCandidates = new List<IEncapsulateFieldCandidate>(candidates);
44-
var objectStateFieldCandidates = new List<IObjectStateUDT>(objectStateUDTCandidates);
45-
var udtMemberCandidates = new List<IUserDefinedTypeMemberCandidate>();
54+
var fieldCandidates = candidates.ToList();
4655

47-
fieldCandidates.ForEach(c => LoadUDTMembers(udtMemberCandidates, c));
56+
foreach (var request in requests)
57+
{
58+
var candidate = fieldCandidates.Single(c => c.Declaration.Equals(request.Declaration));
59+
request.ApplyRequest(candidate);
60+
}
4861

49-
var conflictsFinder = new UseBackingFieldsStrategyConflictFinder(_declarationFinderProvider, candidates, udtMemberCandidates);
62+
var conflictsFinder = _conflictFinderFactory.CreateEncapsulateFieldUseBackingFieldConflictFinder(fieldCandidates);
5063
fieldCandidates.ForEach(c => c.ConflictFinder = conflictsFinder);
5164

52-
return new EncapsulateFieldUseBackingFieldModel(candidates, _declarationFinderProvider)
65+
return new EncapsulateFieldUseBackingFieldModel(fieldCandidates, _declarationFinderProvider)
5366
{
5467
ConflictFinder = conflictsFinder
5568
};
5669
}
57-
58-
private void LoadUDTMembers(List<IUserDefinedTypeMemberCandidate> udtMembers, IEncapsulateFieldCandidate candidate)
59-
{
60-
if (candidate is IUserDefinedTypeCandidate udtCandidate)
61-
{
62-
foreach (var member in udtCandidate.Members)
63-
{
64-
udtMembers.Add(member);
65-
if (member.WrappedCandidate is IUserDefinedTypeCandidate childUDT
66-
&& childUDT.Declaration.AsTypeDeclaration.HasPrivateAccessibility())
67-
{
68-
LoadUDTMembers(udtMembers, childUDT);
69-
}
70-
}
71-
}
72-
}
7370
}
7471
}

0 commit comments

Comments
 (0)