1
1
using Rubberduck . Parsing . Grammar ;
2
2
using Rubberduck . Parsing . Symbols ;
3
3
using Rubberduck . Parsing . VBA ;
4
+ using Rubberduck . Refactorings . Common ;
4
5
using Rubberduck . Refactorings . EncapsulateField . Extensions ;
5
6
using Rubberduck . VBEditor ;
6
7
using System ;
@@ -13,42 +14,94 @@ namespace Rubberduck.Refactorings.EncapsulateField
13
14
public class EncapsulateFieldElementFactory
14
15
{
15
16
private readonly IDeclarationFinderProvider _declarationFinderProvider ;
16
- //private readonly IEncapsulateFieldValidator _validator;
17
- //private readonly IValidateEncapsulateFieldNames _namesValidator;
18
17
private QualifiedModuleName _targetQMN ;
19
18
20
19
public EncapsulateFieldElementFactory ( IDeclarationFinderProvider declarationFinderProvider , QualifiedModuleName targetQMN ) //, IEncapsulateFieldValidator validator )
21
20
{
22
21
_declarationFinderProvider = declarationFinderProvider ;
23
- //_validator = validator;
24
- //_namesValidator = validator as IValidateEncapsulateFieldNames;
25
22
_targetQMN = targetQMN ;
23
+ CreateRefactoringElements ( ) ;
26
24
}
27
25
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 )
29
72
{
30
73
var stateUDT = new ObjectStateUDT ( _targetQMN ) as IObjectStateUDT ;
31
74
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 ) ;
33
76
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 ;
35
80
36
81
return stateUDT ;
37
82
}
38
83
39
- private IEncapsulateFieldCandidate CreateCandidate ( Declaration target , IValidateEncapsulateFieldNames validator )
84
+ private IEncapsulateFieldCandidate CreateCandidate ( Declaration target , IValidateVBAIdentifiers validator ) // Predicate<string> nameValidator )
40
85
{
41
86
if ( target . IsUserDefinedTypeField ( ) )
42
87
{
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 ;
44
90
45
91
( Declaration udtDeclaration , IEnumerable < Declaration > udtMembers ) = GetUDTAndMembersForField ( udtField ) ;
46
92
47
93
udtField . TypeDeclarationIsPrivate = udtDeclaration . HasPrivateAccessibility ( ) ;
48
94
95
+ udtField . NameValidator = udtValidator ;
96
+
49
97
foreach ( var udtMemberDeclaration in udtMembers )
50
98
{
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 ;
52
105
53
106
udtField . AddMember ( candidateUDTMember ) ;
54
107
}
@@ -64,41 +117,8 @@ private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidate
64
117
{
65
118
return new ArrayCandidate ( target , validator ) ;
66
119
}
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
- }
93
120
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 ) ;
102
122
return candidate ;
103
123
}
104
124
0 commit comments