Skip to content

Commit 8f18ace

Browse files
committed
Add EncapsulateFieldModelFactory
1 parent 371ad27 commit 8f18ace

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using Rubberduck.Parsing.Symbols;
2+
using Rubberduck.Parsing.VBA;
3+
using Rubberduck.Refactorings.Common;
4+
using Rubberduck.Refactorings.EncapsulateField;
5+
using Rubberduck.VBEditor;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
9+
namespace Rubberduck.Refactorings
10+
{
11+
public interface IEncapsulateFieldModelsFactory<T>
12+
{
13+
T Create(QualifiedModuleName qmn);
14+
T Create(IEnumerable<IEncapsulateFieldCandidate> candidates, IEnumerable<IObjectStateUDT> objectStateUDTCandidates);
15+
}
16+
17+
public interface IEncapsulateFieldModelFactory
18+
{
19+
EncapsulateFieldModel Create(Declaration target);
20+
}
21+
22+
public class EncapsulateFieldModelFactory : IEncapsulateFieldModelFactory
23+
{
24+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
25+
private readonly IEncapsulateFieldCandidateFactory _encapsulateFieldCandidateFactory;
26+
private readonly IEncapsulateFieldUseBackingUDTMemberModelFactory _useBackingUDTMemberModelFactory;
27+
private readonly IEncapsulateFieldUseBackingFieldModelFactory _useBackingFieldModelFactory;
28+
29+
public EncapsulateFieldModelFactory(IDeclarationFinderProvider declarationFinderProvider,
30+
IEncapsulateFieldCandidateFactory encapsulateFieldCandidateFactory,
31+
IEncapsulateFieldUseBackingUDTMemberModelFactory encapsulateFieldUseBackingUDTMemberModelFactory,
32+
IEncapsulateFieldUseBackingFieldModelFactory encapsulateFieldUseBackingFieldModelFactory)
33+
{
34+
_declarationFinderProvider = declarationFinderProvider;
35+
_encapsulateFieldCandidateFactory = encapsulateFieldCandidateFactory;
36+
_useBackingUDTMemberModelFactory = encapsulateFieldUseBackingUDTMemberModelFactory;
37+
_useBackingFieldModelFactory = encapsulateFieldUseBackingFieldModelFactory;
38+
}
39+
40+
public EncapsulateFieldModel Create(Declaration target)
41+
{
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();
48+
49+
var objectStateUDTCandidates = candidates.Where(c => c is IUserDefinedTypeCandidate udt
50+
&& udt.CanBeObjectStateUDT)
51+
.Select(udtc => new ObjectStateUDT(udtc as IUserDefinedTypeCandidate))
52+
.ToList();
53+
54+
var initialStrategy = objectStateUDTCandidates
55+
.Any(os => os.AsTypeDeclaration.IdentifierName.StartsWith($"T{target.QualifiedModuleName.ComponentName}", System.StringComparison.InvariantCultureIgnoreCase))
56+
? EncapsulateFieldStrategy.ConvertFieldsToUDTMembers
57+
: EncapsulateFieldStrategy.UseBackingFields;
58+
59+
var selected = candidates.Single(c => c.Declaration == target);
60+
selected.EncapsulateFlag = true;
61+
62+
var udtModel = _useBackingUDTMemberModelFactory.Create(candidates, objectStateUDTCandidates);
63+
var backingModel = _useBackingFieldModelFactory.Create(candidates, objectStateUDTCandidates);
64+
65+
return new EncapsulateFieldModel(backingModel, udtModel)
66+
{
67+
EncapsulateFieldStrategy = initialStrategy
68+
};
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)