@@ -23,66 +23,93 @@ public EncapsulateFieldElementsBuilder(IDeclarationFinderProvider declarationFin
23
23
CreateRefactoringElements ( ) ;
24
24
}
25
25
26
+ public IObjectStateUDT DefaultObjectStateUDT { private set ; get ; }
27
+
26
28
public IObjectStateUDT ObjectStateUDT { private set ; get ; }
27
29
28
30
public IEncapsulateFieldValidationsProvider ValidationsProvider { private set ; get ; }
29
31
30
- public IEnumerable < IEncapsulatableField > Candidates { private set ; get ; }
32
+ public IEnumerable < IEncapsulateFieldCandidate > Candidates { private set ; get ; }
33
+
34
+ public IEnumerable < IObjectStateUDT > ObjectStateUDTCandidates { private set ; get ; } = new List < IObjectStateUDT > ( ) ;
31
35
32
36
private void CreateRefactoringElements ( )
33
37
{
34
38
var fieldDeclarations = _declarationFinderProvider . DeclarationFinder
35
39
. Members ( _targetQMN )
36
40
. Where ( v => v . IsMemberVariable ( ) && ! v . IsWithEvents ) ;
37
41
38
- ValidationsProvider = new EncapsulateFieldValidationsProvider ( ) ;
39
-
40
- var nameValidator = ValidationsProvider . NameOnlyValidator ( NameValidators . Default ) ;
42
+ var defaultNamesValidator = EncapsulateFieldValidationsProvider . NameOnlyValidator ( NameValidators . Default ) ;
41
43
42
- var candidates = new List < IEncapsulatableField > ( ) ;
44
+ var candidates = new List < IEncapsulateFieldCandidate > ( ) ;
43
45
foreach ( var fieldDeclaration in fieldDeclarations )
44
46
{
45
47
Debug . Assert ( ! fieldDeclaration . DeclarationType . Equals ( DeclarationType . UserDefinedTypeMember ) ) ;
46
48
47
- var fieldEncapsulationCandidate = CreateCandidate ( fieldDeclaration , nameValidator ) ;
48
-
49
+ var fieldEncapsulationCandidate = CreateCandidate ( fieldDeclaration , defaultNamesValidator ) ;
49
50
50
51
candidates . Add ( fieldEncapsulationCandidate ) ;
51
52
}
52
53
53
- ValidationsProvider . RegisterCandidates ( candidates ) ;
54
+ Candidates = candidates ;
55
+
56
+ ObjectStateUDTCandidates = BuildObjectStateUDTCandidates ( candidates ) . ToList ( ) ;
57
+
58
+ var objectStateUDTIdentifier = $ "T{ _targetQMN . ComponentName } ";
59
+ ObjectStateUDT = ObjectStateUDTCandidates . FirstOrDefault ( os => os . AsTypeDeclaration . IdentifierName . StartsWith ( objectStateUDTIdentifier , StringComparison . InvariantCultureIgnoreCase ) ) ;
60
+
61
+ DefaultObjectStateUDT = CreateStateUDTField ( ) ;
62
+ DefaultObjectStateUDT . IsSelected = true ;
63
+ if ( ObjectStateUDT != null )
64
+ {
65
+ ObjectStateUDT . IsSelected = true ;
66
+ DefaultObjectStateUDT . IsSelected = false ;
67
+ }
68
+
69
+ ObjectStateUDTCandidates = ObjectStateUDTCandidates . Concat ( new IObjectStateUDT [ ] { DefaultObjectStateUDT } ) ;
54
70
55
- var conflictsValidator = ValidationsProvider . ConflictDetector ( EncapsulateFieldStrategy . UseBackingFields , _declarationFinderProvider ) ;
71
+ ValidationsProvider = new EncapsulateFieldValidationsProvider ( Candidates , ObjectStateUDTCandidates ) ;
56
72
57
- ObjectStateUDT = CreateStateUDTField ( conflictsValidator ) ;
73
+ var conflictsFinder = ValidationsProvider . ConflictDetector ( EncapsulateFieldStrategy . UseBackingFields , _declarationFinderProvider ) ;
58
74
foreach ( var candidate in candidates )
59
75
{
60
- candidate . ConflictFinder = conflictsValidator ;
61
- conflictsValidator . AssignNoConflictIdentifier ( candidate , DeclarationType . Property ) ;
62
- conflictsValidator . AssignNoConflictIdentifier ( candidate , DeclarationType . Variable ) ;
76
+ candidate . ConflictFinder = conflictsFinder ;
63
77
}
78
+ }
64
79
65
- Candidates = candidates ;
80
+ private IEnumerable < IObjectStateUDT > BuildObjectStateUDTCandidates ( IEnumerable < IEncapsulateFieldCandidate > candidates ) //, IObjectStateUDT defaultObjectStateUDT)
81
+ {
82
+ var udtCandidates = candidates . Where ( c => c is IUserDefinedTypeCandidate udt
83
+ && udt . CanBeObjectStateUDT ) ;
84
+
85
+ var objectStateUDTs = new List < IObjectStateUDT > ( ) ;
86
+ foreach ( var udt in udtCandidates )
87
+ {
88
+ objectStateUDTs . Add ( new ObjectStateUDT ( udt as IUserDefinedTypeCandidate ) ) ;
89
+ }
90
+
91
+ var objectStateUDTIdentifier = $ "T{ _targetQMN . ComponentName } ";
92
+ var objectStateUDT = objectStateUDTs . FirstOrDefault ( os => os . AsTypeDeclaration . IdentifierName . StartsWith ( objectStateUDTIdentifier , StringComparison . InvariantCultureIgnoreCase ) ) ;
93
+
94
+ return objectStateUDTs ;
66
95
}
67
96
68
- private IObjectStateUDT CreateStateUDTField ( IEncapsulateFieldConflictFinder validator )
97
+ private IObjectStateUDT CreateStateUDTField ( )
69
98
{
70
99
var stateUDT = new ObjectStateUDT ( _targetQMN ) as IObjectStateUDT ;
71
100
72
- stateUDT . FieldIdentifier = validator . CreateNonConflictIdentifierForProposedType ( stateUDT . FieldIdentifier , _targetQMN , DeclarationType . Variable ) ;
73
-
74
- stateUDT . TypeIdentifier = validator . CreateNonConflictIdentifierForProposedType ( stateUDT . TypeIdentifier , _targetQMN , DeclarationType . UserDefinedType ) ;
101
+ EncapsulateFieldValidationsProvider . AssignNoConflictIdentifiers ( stateUDT , _declarationFinderProvider ) ;
75
102
76
103
stateUDT . IsSelected = true ;
77
104
78
105
return stateUDT ;
79
106
}
80
107
81
- private IEncapsulatableField CreateCandidate ( Declaration target , IValidateVBAIdentifiers validator ) // Predicate<string> nameValidator)
108
+ private IEncapsulateFieldCandidate CreateCandidate ( Declaration target , IValidateVBAIdentifiers validator ) // Predicate<string> nameValidator)
82
109
{
83
110
if ( target . IsUserDefinedTypeField ( ) )
84
111
{
85
- var udtValidator = ValidationsProvider . NameOnlyValidator ( NameValidators . UserDefinedType ) ;
112
+ var udtValidator = EncapsulateFieldValidationsProvider . NameOnlyValidator ( NameValidators . UserDefinedType ) ;
86
113
var udtField = new UserDefinedTypeCandidate ( target , udtValidator ) as IUserDefinedTypeCandidate ;
87
114
88
115
( Declaration udtDeclaration , IEnumerable < Declaration > udtMembers ) = GetUDTAndMembersForField ( udtField ) ;
@@ -93,10 +120,10 @@ private IEncapsulatableField CreateCandidate(Declaration target, IValidateVBAIde
93
120
94
121
foreach ( var udtMemberDeclaration in udtMembers )
95
122
{
96
- var udtMemberValidator = ValidationsProvider . NameOnlyValidator ( NameValidators . UserDefinedTypeMember ) ;
123
+ var udtMemberValidator = EncapsulateFieldValidationsProvider . NameOnlyValidator ( NameValidators . UserDefinedTypeMember ) ;
97
124
if ( udtMemberDeclaration . IsArray )
98
125
{
99
- udtMemberValidator = ValidationsProvider . NameOnlyValidator ( NameValidators . UserDefinedTypeMemberArray ) ;
126
+ udtMemberValidator = EncapsulateFieldValidationsProvider . NameOnlyValidator ( NameValidators . UserDefinedTypeMemberArray ) ;
100
127
}
101
128
var candidateUDTMember = new UserDefinedTypeMemberCandidate ( CreateCandidate ( udtMemberDeclaration , udtMemberValidator ) , udtField ) as IUserDefinedTypeMemberCandidate ;
102
129
@@ -106,7 +133,9 @@ private IEncapsulatableField CreateCandidate(Declaration target, IValidateVBAIde
106
133
var udtVariablesOfSameType = _declarationFinderProvider . DeclarationFinder . UserDeclarations ( DeclarationType . Variable )
107
134
. Where ( v => v . AsTypeDeclaration == udtDeclaration ) ;
108
135
109
- udtField . CanBeObjectStateUDT = udtField . TypeDeclarationIsPrivate && udtVariablesOfSameType . Count ( ) == 1 ;
136
+ udtField . CanBeObjectStateUDT = udtField . TypeDeclarationIsPrivate
137
+ && udtField . Declaration . HasPrivateAccessibility ( )
138
+ && udtVariablesOfSameType . Count ( ) == 1 ;
110
139
111
140
return udtField ;
112
141
}
0 commit comments