Skip to content

Commit b8c93e3

Browse files
committed
Check for annotations for inserting new text above existing properties
1 parent 1bcc6df commit b8c93e3

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldInsertNewCode/EncapsulateFieldInsertNewCodeRefactoringAction.cs

+25-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
using Rubberduck.Refactorings.EncapsulateField;
1010
using System.Collections.Generic;
1111
using Rubberduck.SmartIndenter;
12+
using Antlr4.Runtime;
13+
using Rubberduck.Parsing.Grammar;
14+
using Rubberduck.Parsing;
1215

1316
namespace Rubberduck.Refactorings.EncapsulateFieldInsertNewCode
1417
{
@@ -106,17 +109,33 @@ private void InsertBlocks(EncapsulateFieldInsertNewCodeModel model, IRewriteSess
106109

107110
var rewriter = rewriteSession.CheckOutModuleRewriter(model.QualifiedModuleName);
108111

109-
var codeSectionStartIndex = _declarationFinderProvider.DeclarationFinder
110-
.Members(model.QualifiedModuleName).Where(m => m.IsMember())
112+
var firstMember = _declarationFinderProvider.DeclarationFinder
113+
.Members(model.QualifiedModuleName)
114+
.Where(m => m.IsMember())
111115
.OrderBy(c => c.Selection)
112-
.FirstOrDefault()?.Context.Start.TokenIndex;
116+
.FirstOrDefault();
113117

114-
if (codeSectionStartIndex.HasValue)
118+
var codeSectionStartIndex = firstMember?.Context.Start.TokenIndex;
119+
120+
var firstAnnotationContext = firstMember?.Annotations?
121+
.OrderBy(c => c.QualifiedSelection)
122+
.FirstOrDefault()?.Context;
123+
124+
if (firstAnnotationContext != null)
125+
{
126+
codeSectionStartIndex = firstAnnotationContext
127+
.GetAncestor<VBAParser.CommentOrAnnotationContext>().start.TokenIndex;
128+
}
129+
130+
if (codeSectionStartIndex != null)
115131
{
116132
rewriter.InsertBefore(codeSectionStartIndex.Value, $"{formattedContent}{NewLines.DOUBLE_SPACE}");
117-
return;
118133
}
119-
rewriter.InsertBefore(rewriter.TokenStream.Size - 1, $"{NewLines.DOUBLE_SPACE}{formattedContent}");
134+
else
135+
{
136+
var insertIndex = rewriter.TokenStream.Size - 1;
137+
rewriter.InsertBefore(insertIndex, $"{NewLines.DOUBLE_SPACE}{formattedContent}");
138+
}
120139
}
121140
}
122141
}

RubberduckTests/Refactoring/EncapsulateField/EncapsulateFieldUseBackingField/EncapsulateFieldTests.cs

+28
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,34 @@ Property Set Foo(ByVal vall As Variant)
236236
Assert.Less(actualCode.IndexOf($"fizz = {Support.RHSIdentifier}"), actualCode.IndexOf("Get Foo"));
237237
}
238238

239+
[Test]
240+
[Category("Refactorings")]
241+
[Category("Encapsulate Field")]
242+
public void EncapsulatePublicField_AnnotatedPropertiesInClass()
243+
{
244+
var inputCode =
245+
@"|Public fizz As Integer
246+
247+
'@Description (""Description of Foo"")
248+
Property Get Foo() As Variant
249+
Foo = True
250+
End Property
251+
252+
Property Let Foo(ByVal vall As Variant)
253+
End Property
254+
255+
Property Set Foo(ByVal vall As Variant)
256+
End Property";
257+
258+
var presenterAction = Support.SetParametersForSingleTarget("fizz", "Name");
259+
260+
var actualCode = Support.RefactoredCode(inputCode.ToCodeString(), presenterAction);
261+
262+
var lineOfAnnotation = actualCode.Substring(0, actualCode.IndexOf("Description of Foo")).Split(new[] { Environment.NewLine }, StringSplitOptions.None);
263+
var lineOfProperty = actualCode.Substring(0, actualCode.IndexOf("Property Get Foo()")).Split(new[] { Environment.NewLine }, StringSplitOptions.None);
264+
Assert.AreEqual(lineOfAnnotation.Length, lineOfProperty.Length - 1);
265+
}
266+
239267
[TestCase("|Public fizz As Integer\r\nPublic buzz As Boolean", "Private fizz As Integer\r\nPublic buzz As Boolean")]
240268
[TestCase("Public buzz As Boolean\r\n|Public fizz As Integer", "Public buzz As Boolean\r\nPrivate fizz As Integer")]
241269
[Category("Refactorings")]

0 commit comments

Comments
 (0)