1
1
using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Linq ;
3
4
using Rubberduck . Parsing . PostProcessing ;
4
5
using Rubberduck . Parsing . Symbols ;
@@ -15,6 +16,8 @@ public class EncapsulateFieldRefactoring : IRefactoring
15
16
private readonly IRefactoringPresenterFactory < IEncapsulateFieldPresenter > _factory ;
16
17
private EncapsulateFieldModel _model ;
17
18
19
+ private readonly HashSet < IModuleRewriter > _referenceRewriters = new HashSet < IModuleRewriter > ( ) ;
20
+
18
21
public EncapsulateFieldRefactoring ( IVBE vbe , IIndenter indenter , IRefactoringPresenterFactory < IEncapsulateFieldPresenter > factory )
19
22
{
20
23
_vbe = vbe ;
@@ -35,6 +38,10 @@ public void Refactor()
35
38
AddProperty ( rewriter ) ;
36
39
37
40
rewriter . Rewrite ( ) ;
41
+ foreach ( var referenceRewriter in _referenceRewriters )
42
+ {
43
+ referenceRewriter . Rewrite ( ) ;
44
+ }
38
45
}
39
46
40
47
public void Refactor ( QualifiedSelection target )
@@ -58,46 +65,54 @@ private void AddProperty(IModuleRewriter rewriter)
58
65
59
66
var members = _model . State . DeclarationFinder
60
67
. Members ( _model . TargetDeclaration . QualifiedName . QualifiedModuleName )
61
- . OrderBy ( declaration => declaration . QualifiedSelection )
62
- . ToArray ( ) ;
68
+ . OrderBy ( declaration => declaration . QualifiedSelection ) ;
63
69
64
- var property = Environment . NewLine + Environment . NewLine + GetPropertyText ( ) + Environment . NewLine ;
70
+ var fields = members . Where ( d => d . DeclarationType == DeclarationType . Variable && ! d . ParentScopeDeclaration . DeclarationType . HasFlag ( DeclarationType . Member ) ) . ToList ( ) ;
65
71
66
- var lastMember = members . LastOrDefault ( m => m . DeclarationType . HasFlag ( DeclarationType . Member ) ) ;
67
- if ( lastMember == null )
72
+ var property = Environment . NewLine + Environment . NewLine + GetPropertyText ( ) ;
73
+ if ( members . Any ( m => m . DeclarationType . HasFlag ( DeclarationType . Member ) ) )
68
74
{
69
- rewriter . Insert ( 1 , property ) ;
75
+ property += Environment . NewLine ;
76
+ }
77
+
78
+ if ( _model . TargetDeclaration . Accessibility != Accessibility . Private )
79
+ {
80
+ var newField = "Private " + _model . TargetDeclaration . IdentifierName + " As " + _model . TargetDeclaration . AsTypeName ;
81
+ if ( fields . Count > 1 )
82
+ {
83
+ newField = Environment . NewLine + newField ;
84
+ }
85
+
86
+ property = newField + property ;
87
+ }
88
+
89
+ if ( _model . TargetDeclaration . Accessibility == Accessibility . Private || fields . Count > 1 )
90
+ {
91
+ rewriter . InsertAfter ( fields . Last ( ) . Context . Stop . TokenIndex , property ) ;
70
92
}
71
93
else
72
94
{
73
- rewriter . Insert ( lastMember . Context . Stop . TokenIndex , property ) ;
95
+ rewriter . InsertBefore ( 0 , property ) ;
74
96
}
75
97
}
76
98
77
99
private void UpdateReferences ( )
78
100
{
79
101
foreach ( var reference in _model . TargetDeclaration . References )
80
102
{
81
- var module = reference . QualifiedModuleName . Component . CodeModule ;
82
- var oldLine = module . GetLines ( reference . Selection . StartLine , 1 ) ;
83
- oldLine = oldLine . Remove ( reference . Selection . StartColumn - 1 , reference . Selection . EndColumn - reference . Selection . StartColumn ) ;
84
- var newLine = oldLine . Insert ( reference . Selection . StartColumn - 1 , _model . PropertyName ) ;
103
+ var rewriter = _model . State . GetRewriter ( reference . QualifiedModuleName ) ;
104
+ rewriter . Replace ( reference . Context , _model . PropertyName ) ;
85
105
86
- module . ReplaceLine ( reference . Selection . StartLine , newLine ) ;
106
+ _referenceRewriters . Add ( rewriter ) ;
87
107
}
88
108
}
89
109
90
110
private void SetFieldToPrivate ( IModuleRewriter rewriter )
91
111
{
92
- var target = _model . TargetDeclaration ;
93
- if ( target . Accessibility == Accessibility . Private )
112
+ if ( _model . TargetDeclaration . Accessibility != Accessibility . Private )
94
113
{
95
- return ;
114
+ rewriter . Remove ( _model . TargetDeclaration ) ;
96
115
}
97
-
98
- var newField = "Private " + _model . TargetDeclaration . IdentifierName + " As " + _model . TargetDeclaration . AsTypeName + Environment . NewLine ;
99
-
100
- rewriter . Replace ( target , newField ) ;
101
116
}
102
117
103
118
private string GetPropertyText ( )
0 commit comments