Skip to content

Commit 93977fa

Browse files
committed
Add EncapsulateFieldCandidateFactory
1 parent ceaf532 commit 93977fa

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using Rubberduck.Parsing.Symbols;
2+
using Rubberduck.Parsing.VBA;
3+
using Rubberduck.Refactorings.Common;
4+
using Rubberduck.Refactorings.EncapsulateField;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
8+
namespace Rubberduck.Refactorings
9+
{
10+
public interface IEncapsulateFieldCandidateFactory
11+
{
12+
IEncapsulateFieldCandidate Create(Declaration target);
13+
}
14+
public class EncapsulateFieldCandidateFactory : IEncapsulateFieldCandidateFactory
15+
{
16+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
17+
private readonly ICodeBuilder _codeBuilder;
18+
19+
private readonly IValidateVBAIdentifiers _defaultNameValidator;
20+
private readonly IValidateVBAIdentifiers _udtNameValidator;
21+
private readonly IValidateVBAIdentifiers _udtMemberNameValidator;
22+
private readonly IValidateVBAIdentifiers _udtMemberArrayNameValidator;
23+
24+
public EncapsulateFieldCandidateFactory(IDeclarationFinderProvider declarationFinderProvider, ICodeBuilder codeBuilder)
25+
{
26+
_declarationFinderProvider = declarationFinderProvider;
27+
_codeBuilder = codeBuilder;
28+
29+
_defaultNameValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.Default);
30+
_udtNameValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedType);
31+
_udtMemberNameValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMember);
32+
_udtMemberArrayNameValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMemberArray);
33+
}
34+
35+
public IEncapsulateFieldCandidate Create(Declaration target)
36+
{
37+
var candidate= CreateCandidate(target, _defaultNameValidator);
38+
return candidate;
39+
}
40+
41+
private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidateVBAIdentifiers validator)
42+
{
43+
if (target.IsUserDefinedType())
44+
{
45+
var udtField = new UserDefinedTypeCandidate(target, _udtNameValidator, _codeBuilder.BuildPropertyRhsParameterName) as IUserDefinedTypeCandidate;
46+
47+
(Declaration udtDeclaration, IEnumerable<Declaration> udtMembers) = GetUDTAndMembersForField(udtField);
48+
49+
foreach (var udtMemberDeclaration in udtMembers)
50+
{
51+
var udtMemberValidator = _udtMemberNameValidator;
52+
if (udtMemberDeclaration.IsArray)
53+
{
54+
udtMemberValidator = _udtMemberArrayNameValidator;
55+
}
56+
var candidateUDTMember = new UserDefinedTypeMemberCandidate(CreateCandidate(udtMemberDeclaration, udtMemberValidator), udtField, _codeBuilder.BuildPropertyRhsParameterName) as IUserDefinedTypeMemberCandidate;
57+
58+
udtField.AddMember(candidateUDTMember);
59+
}
60+
61+
var udtVariablesOfSameType = _declarationFinderProvider.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
62+
.Where(v => v.AsTypeDeclaration == udtDeclaration);
63+
64+
udtField.CanBeObjectStateUDT = udtField.TypeDeclarationIsPrivate
65+
&& udtField.Declaration.HasPrivateAccessibility()
66+
&& udtVariablesOfSameType.Count() == 1;
67+
68+
return udtField;
69+
}
70+
else if (target.IsArray)
71+
{
72+
var arrayCandidate = new ArrayCandidate(target, validator, _codeBuilder.BuildPropertyRhsParameterName);
73+
return arrayCandidate;
74+
}
75+
76+
var candidate = new EncapsulateFieldCandidate(target, validator, _codeBuilder.BuildPropertyRhsParameterName);
77+
return candidate;
78+
}
79+
80+
private (Declaration TypeDeclaration, IEnumerable<Declaration> Members) GetUDTAndMembersForField(IUserDefinedTypeCandidate udtField)
81+
{
82+
var userDefinedTypeDeclaration = udtField.Declaration.AsTypeDeclaration;
83+
84+
var udtMembers = _declarationFinderProvider.DeclarationFinder
85+
.UserDeclarations(DeclarationType.UserDefinedTypeMember)
86+
.Where(utm => userDefinedTypeDeclaration == utm.ParentDeclaration);
87+
88+
return (userDefinedTypeDeclaration, udtMembers);
89+
}
90+
}
91+
}

0 commit comments

Comments
 (0)