11using System ;
2+ using System . Collections . Generic ;
23using System . Linq ;
34using Rubberduck . Parsing . PostProcessing ;
45using Rubberduck . Parsing . Symbols ;
@@ -15,6 +16,8 @@ public class EncapsulateFieldRefactoring : IRefactoring
1516 private readonly IRefactoringPresenterFactory < IEncapsulateFieldPresenter > _factory ;
1617 private EncapsulateFieldModel _model ;
1718
19+ private readonly HashSet < IModuleRewriter > _referenceRewriters = new HashSet < IModuleRewriter > ( ) ;
20+
1821 public EncapsulateFieldRefactoring ( IVBE vbe , IIndenter indenter , IRefactoringPresenterFactory < IEncapsulateFieldPresenter > factory )
1922 {
2023 _vbe = vbe ;
@@ -35,6 +38,10 @@ public void Refactor()
3538 AddProperty ( rewriter ) ;
3639
3740 rewriter . Rewrite ( ) ;
41+ foreach ( var referenceRewriter in _referenceRewriters )
42+ {
43+ referenceRewriter . Rewrite ( ) ;
44+ }
3845 }
3946
4047 public void Refactor ( QualifiedSelection target )
@@ -58,46 +65,54 @@ private void AddProperty(IModuleRewriter rewriter)
5865
5966 var members = _model . State . DeclarationFinder
6067 . Members ( _model . TargetDeclaration . QualifiedName . QualifiedModuleName )
61- . OrderBy ( declaration => declaration . QualifiedSelection )
62- . ToArray ( ) ;
68+ . OrderBy ( declaration => declaration . QualifiedSelection ) ;
6369
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 ( ) ;
6571
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 ) ) )
6874 {
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 ) ;
7092 }
7193 else
7294 {
73- rewriter . Insert ( lastMember . Context . Stop . TokenIndex , property ) ;
95+ rewriter . InsertBefore ( 0 , property ) ;
7496 }
7597 }
7698
7799 private void UpdateReferences ( )
78100 {
79101 foreach ( var reference in _model . TargetDeclaration . References )
80102 {
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 ) ;
85105
86- module . ReplaceLine ( reference . Selection . StartLine , newLine ) ;
106+ _referenceRewriters . Add ( rewriter ) ;
87107 }
88108 }
89109
90110 private void SetFieldToPrivate ( IModuleRewriter rewriter )
91111 {
92- var target = _model . TargetDeclaration ;
93- if ( target . Accessibility == Accessibility . Private )
112+ if ( _model . TargetDeclaration . Accessibility != Accessibility . Private )
94113 {
95- return ;
114+ rewriter . Remove ( _model . TargetDeclaration ) ;
96115 }
97-
98- var newField = "Private " + _model . TargetDeclaration . IdentifierName + " As " + _model . TargetDeclaration . AsTypeName + Environment . NewLine ;
99-
100- rewriter . Replace ( target , newField ) ;
101116 }
102117
103118 private string GetPropertyText ( )
0 commit comments