|
1 | 1 | using Rubberduck.Parsing.Symbols;
|
2 | 2 | using Rubberduck.Parsing.VBA;
|
3 |
| -using Rubberduck.Refactorings.Common; |
4 | 3 | using Rubberduck.Refactorings.EncapsulateField;
|
5 | 4 | using Rubberduck.Refactorings.EncapsulateFieldUseBackingField;
|
6 |
| -using Rubberduck.VBEditor; |
7 | 5 | using System.Collections.Generic;
|
8 | 6 | using System.Linq;
|
9 | 7 |
|
10 | 8 | namespace Rubberduck.Refactorings
|
11 | 9 | {
|
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 | + } |
14 | 25 |
|
15 | 26 | public class EncapsulateFieldUseBackingFieldModelFactory : IEncapsulateFieldUseBackingFieldModelFactory
|
16 | 27 | {
|
17 | 28 | private readonly IDeclarationFinderProvider _declarationFinderProvider;
|
18 |
| - private readonly IEncapsulateFieldCandidateFactory _fieldCandidateFactory; |
| 29 | + private readonly IEncapsulateFieldCandidateCollectionFactory _fieldCandidateCollectionFactory; |
| 30 | + private readonly IEncapsulateFieldConflictFinderFactory _conflictFinderFactory; |
19 | 31 |
|
20 | 32 | public EncapsulateFieldUseBackingFieldModelFactory(IDeclarationFinderProvider declarationFinderProvider,
|
21 |
| - IEncapsulateFieldCandidateFactory fieldCandidateFactory) |
| 33 | + IEncapsulateFieldCandidateCollectionFactory encapsulateFieldCandidateCollectionFactory, |
| 34 | + IEncapsulateFieldConflictFinderFactory encapsulateFieldConflictFinderFactory) |
22 | 35 | {
|
23 | 36 | _declarationFinderProvider = declarationFinderProvider;
|
24 |
| - _fieldCandidateFactory = fieldCandidateFactory; |
| 37 | + _fieldCandidateCollectionFactory = encapsulateFieldCandidateCollectionFactory; |
| 38 | + _conflictFinderFactory = encapsulateFieldConflictFinderFactory; |
25 | 39 | }
|
26 | 40 |
|
27 |
| - public EncapsulateFieldUseBackingFieldModel Create(QualifiedModuleName qmn) |
| 41 | + public EncapsulateFieldUseBackingFieldModel Create(IEnumerable<EncapsulateFieldRequest> requests) |
28 | 42 | {
|
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 | + } |
37 | 47 |
|
38 |
| - return Create(candidates, objectStateUDTCandidates); |
| 48 | + var fieldCandidates = _fieldCandidateCollectionFactory.Create(requests.First().Declaration.QualifiedModuleName); |
| 49 | + return Create(fieldCandidates, requests); |
39 | 50 | }
|
40 | 51 |
|
41 |
| - public EncapsulateFieldUseBackingFieldModel Create(IEnumerable<IEncapsulateFieldCandidate> candidates, IEnumerable<IObjectStateUDT> objectStateUDTCandidates) |
| 52 | + public EncapsulateFieldUseBackingFieldModel Create(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IEnumerable<EncapsulateFieldRequest> requests) |
42 | 53 | {
|
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(); |
46 | 55 |
|
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 | + } |
48 | 61 |
|
49 |
| - var conflictsFinder = new UseBackingFieldsStrategyConflictFinder(_declarationFinderProvider, candidates, udtMemberCandidates); |
| 62 | + var conflictsFinder = _conflictFinderFactory.CreateEncapsulateFieldUseBackingFieldConflictFinder(fieldCandidates); |
50 | 63 | fieldCandidates.ForEach(c => c.ConflictFinder = conflictsFinder);
|
51 | 64 |
|
52 |
| - return new EncapsulateFieldUseBackingFieldModel(candidates, _declarationFinderProvider) |
| 65 | + return new EncapsulateFieldUseBackingFieldModel(fieldCandidates, _declarationFinderProvider) |
53 | 66 | {
|
54 | 67 | ConflictFinder = conflictsFinder
|
55 | 68 | };
|
56 | 69 | }
|
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 |
| - } |
73 | 70 | }
|
74 | 71 | }
|
0 commit comments