1
- using Rubberduck . Common ;
2
- using Rubberduck . Parsing ;
1
+ using Rubberduck . Parsing ;
3
2
using Rubberduck . Parsing . Grammar ;
4
3
using Rubberduck . Parsing . Rewriter ;
5
4
using Rubberduck . Parsing . Symbols ;
@@ -46,41 +45,27 @@ public override void Refactor(EncapsulateFieldUseBackingFieldModel model, IRewri
46
45
return ;
47
46
}
48
47
49
- if ( model . NewContentAggregator is null )
50
- {
51
- model . NewContentAggregator = _newContentAggregatorFactory . Create ( ) ;
52
- }
48
+ var publicFieldsDeclaredInListsToReDeclareAsPrivateBackingFields
49
+ = model . SelectedFieldCandidates
50
+ . Where ( f => f . Declaration . IsDeclaredInList ( )
51
+ && ! f . Declaration . HasPrivateAccessibility ( ) )
52
+ . ToList ( ) ;
53
53
54
- ModifyFields ( model , rewriteSession ) ;
54
+ ModifyFields ( model , publicFieldsDeclaredInListsToReDeclareAsPrivateBackingFields , rewriteSession ) ;
55
55
56
56
ModifyReferences ( model , rewriteSession ) ;
57
57
58
- InsertNewContent ( model , rewriteSession ) ;
58
+ InsertNewContent ( model , publicFieldsDeclaredInListsToReDeclareAsPrivateBackingFields , rewriteSession ) ;
59
59
}
60
60
61
- private void ModifyFields ( EncapsulateFieldUseBackingFieldModel model , IRewriteSession rewriteSession )
61
+ private void ModifyFields ( EncapsulateFieldUseBackingFieldModel model , List < IEncapsulateFieldCandidate > publicFieldsToRemove , IRewriteSession rewriteSession )
62
62
{
63
- var fieldDeclarationsToDeleteAndReplace = model . SelectedFieldCandidates
64
- . Where ( f => f . Declaration . IsDeclaredInList ( )
65
- && ! f . Declaration . HasPrivateAccessibility ( ) )
66
- . ToList ( ) ;
67
-
68
63
var rewriter = rewriteSession . CheckOutModuleRewriter ( model . QualifiedModuleName ) ;
69
- rewriter . RemoveVariables ( fieldDeclarationsToDeleteAndReplace . Select ( f => f . Declaration )
64
+ rewriter . RemoveVariables ( publicFieldsToRemove . Select ( f => f . Declaration )
70
65
. Cast < VariableDeclaration > ( ) ) ;
71
66
72
- foreach ( var field in fieldDeclarationsToDeleteAndReplace )
73
- {
74
- var targetIdentifier = field . Declaration . Context . GetText ( ) . Replace ( field . IdentifierName , field . BackingIdentifier ) ;
75
- var newField = field . Declaration . IsTypeSpecified
76
- ? $ "{ Tokens . Private } { targetIdentifier } "
77
- : $ "{ Tokens . Private } { targetIdentifier } { Tokens . As } { field . Declaration . AsTypeName } ";
78
-
79
- model . NewContentAggregator . AddNewContent ( NewContentType . DeclarationBlock , newField ) ;
80
- }
81
-
82
67
var retainedFieldDeclarations = model . SelectedFieldCandidates
83
- . Except ( fieldDeclarationsToDeleteAndReplace )
68
+ . Except ( publicFieldsToRemove )
84
69
. ToList ( ) ;
85
70
86
71
if ( retainedFieldDeclarations . Any ( ) )
@@ -99,16 +84,20 @@ private void ModifyReferences(EncapsulateFieldUseBackingFieldModel model, IRewri
99
84
. Where ( f => ( f . Declaration . AsTypeDeclaration ? . DeclarationType . HasFlag ( DeclarationType . UserDefinedType ) ?? false )
100
85
&& f . Declaration . AsTypeDeclaration . Accessibility == Accessibility . Private ) ;
101
86
102
- ReplaceEncapsulatedPrivateUserDefinedTypeMemberReferences ( privateUdtInstances , rewriteSession ) ;
87
+ ReplaceUDTMemberReferencesOfPrivateUDTFields ( privateUdtInstances , rewriteSession ) ;
103
88
104
89
ReplaceEncapsulatedFieldReferences ( model . SelectedFieldCandidates . Except ( privateUdtInstances ) , rewriteSession ) ;
105
90
}
106
91
107
- private void InsertNewContent ( EncapsulateFieldUseBackingFieldModel model , IRewriteSession rewriteSession )
92
+ private void InsertNewContent ( EncapsulateFieldUseBackingFieldModel model , List < IEncapsulateFieldCandidate > candidatesRequiringNewBackingFields , IRewriteSession rewriteSession )
108
93
{
94
+ var aggregator = model . NewContentAggregator ?? _newContentAggregatorFactory . Create ( ) ;
95
+ model . NewContentAggregator = null ;
96
+
109
97
var encapsulateFieldInsertNewCodeModel = new EncapsulateFieldInsertNewCodeModel ( model . SelectedFieldCandidates )
110
98
{
111
- NewContentAggregator = model . NewContentAggregator
99
+ CandidatesRequiringNewBackingFields = candidatesRequiringNewBackingFields ,
100
+ NewContentAggregator = aggregator
112
101
} ;
113
102
114
103
_encapsulateFieldInsertNewCodeRefactoringAction . Refactor ( encapsulateFieldInsertNewCodeModel , rewriteSession ) ;
@@ -120,42 +109,57 @@ private void ReplaceEncapsulatedFieldReferences(IEnumerable<IEncapsulateFieldCan
120
109
{
121
110
ModuleQualifyExternalReferences = true
122
111
} ;
112
+
123
113
foreach ( var field in fieldCandidates )
124
114
{
125
- foreach ( var idRef in field . Declaration . References )
126
- {
127
- var replacementExpression = idRef . QualifiedModuleName == field . QualifiedModuleName
128
- ? field . Declaration . IsArray ? field . BackingIdentifier : field . PropertyIdentifier
129
- : field . PropertyIdentifier ;
130
-
131
- model . AssignReferenceReplacementExpression ( idRef , replacementExpression ) ;
132
- }
115
+ InitializeModel ( model , field ) ;
133
116
}
134
117
135
118
_replaceReferencesRefactoringAction . Refactor ( model , rewriteSession ) ;
136
119
}
137
120
138
- private void ReplaceEncapsulatedPrivateUserDefinedTypeMemberReferences ( IEnumerable < IEncapsulateFieldCandidate > udtFieldCandidates , IRewriteSession rewriteSession )
121
+ private void ReplaceUDTMemberReferencesOfPrivateUDTFields ( IEnumerable < IEncapsulateFieldCandidate > udtFieldCandidates , IRewriteSession rewriteSession )
139
122
{
140
123
if ( ! udtFieldCandidates . Any ( ) )
141
124
{
142
125
return ;
143
126
}
144
127
145
- var replacePrivateUDTMemberReferencesModel = _replaceUDTMemberReferencesModelFactory . Create ( udtFieldCandidates . Select ( f => f . Declaration ) . Cast < VariableDeclaration > ( ) ) ;
128
+ var replacePrivateUDTMemberReferencesModel
129
+ = _replaceUDTMemberReferencesModelFactory . Create ( udtFieldCandidates . Select ( f => f . Declaration ) . Cast < VariableDeclaration > ( ) ) ;
146
130
147
131
foreach ( var udtfield in udtFieldCandidates )
148
132
{
149
- foreach ( var udtMember in replacePrivateUDTMemberReferencesModel . UDTMembers )
150
- {
151
- var udtExpressions = new PrivateUDTMemberReferenceReplacementExpressions ( $ "{ udtfield . IdentifierName } .{ udtMember . IdentifierName } ")
152
- {
153
- LocalReferenceExpression = udtMember . IdentifierName . CapitalizeFirstLetter ( ) ,
154
- } ;
133
+ InitializeModel ( replacePrivateUDTMemberReferencesModel , udtfield ) ;
134
+ }
135
+ _replaceUDTMemberReferencesRefactoringAction . Refactor ( replacePrivateUDTMemberReferencesModel , rewriteSession ) ;
136
+ }
155
137
156
- replacePrivateUDTMemberReferencesModel . AssignUDTMemberReferenceExpressions ( udtfield . Declaration as VariableDeclaration , udtMember , udtExpressions ) ;
138
+ private void InitializeModel ( ReplaceReferencesModel model , IEncapsulateFieldCandidate field )
139
+ {
140
+ foreach ( var idRef in field . Declaration . References )
141
+ {
142
+ var replacementExpression = field . PropertyIdentifier ;
143
+
144
+ if ( idRef . QualifiedModuleName == field . QualifiedModuleName && field . Declaration . IsArray )
145
+ {
146
+ replacementExpression = field . BackingIdentifier ;
157
147
}
158
- _replaceUDTMemberReferencesRefactoringAction . Refactor ( replacePrivateUDTMemberReferencesModel , rewriteSession ) ;
148
+
149
+ model . AssignReferenceReplacementExpression ( idRef , replacementExpression ) ;
150
+ }
151
+ }
152
+
153
+ private void InitializeModel ( ReplacePrivateUDTMemberReferencesModel model , IEncapsulateFieldCandidate udtfield )
154
+ {
155
+ foreach ( var udtMember in model . UDTMembers )
156
+ {
157
+ var udtExpressions = new PrivateUDTMemberReferenceReplacementExpressions ( $ "{ udtfield . IdentifierName } .{ udtMember . IdentifierName } ")
158
+ {
159
+ LocalReferenceExpression = udtMember . IdentifierName ,
160
+ } ;
161
+
162
+ model . AssignUDTMemberReferenceExpressions ( udtfield . Declaration as VariableDeclaration , udtMember , udtExpressions ) ;
159
163
}
160
164
}
161
165
0 commit comments