From 4edaa1e84fd88ac8a1ce29dbd5a383efc19e84ed Mon Sep 17 00:00:00 2001 From: Tom Helm Date: Sat, 28 Apr 2018 23:19:38 +0100 Subject: [PATCH 1/4] Preserve indentation of expression following inserted declaration (and associated tests) --- .../MoveCloserToUsageRefactoring.cs | 5 ++- .../MoveFieldCloserToUsageQuickFixTests.cs | 2 +- .../Refactoring/MoveCloserToUsageTests.cs | 32 +++++++++---------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs b/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs index 199d5da13d..9ad6a16a51 100644 --- a/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs +++ b/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs @@ -168,9 +168,12 @@ private void InsertNewDeclaration() } var insertionIndex = (expression as ParserRuleContext).Start.TokenIndex; + var firstReferenceLine = _vbe.ActiveCodePane.CodeModule.GetLines((expression as ParserRuleContext).Start.Line, 1); + var indentLength = firstReferenceLine.Length - firstReferenceLine.TrimStart().Length; + var padding = new string(' ', indentLength); var rewriter = _state.GetRewriter(firstReference.QualifiedModuleName); - rewriter.InsertBefore(insertionIndex, newVariable); + rewriter.InsertBefore(insertionIndex, newVariable + padding); _rewriters.Add(rewriter); } diff --git a/RubberduckTests/QuickFixes/MoveFieldCloserToUsageQuickFixTests.cs b/RubberduckTests/QuickFixes/MoveFieldCloserToUsageQuickFixTests.cs index 6d780ee1d4..481d1d82b6 100644 --- a/RubberduckTests/QuickFixes/MoveFieldCloserToUsageQuickFixTests.cs +++ b/RubberduckTests/QuickFixes/MoveFieldCloserToUsageQuickFixTests.cs @@ -25,7 +25,7 @@ public void MoveFieldCloserToUsage_QuickFixWorks() const string expectedCode = @"Public Sub Foo() Dim bar As String -bar = ""test"" + bar = ""test"" End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component); diff --git a/RubberduckTests/Refactoring/MoveCloserToUsageTests.cs b/RubberduckTests/Refactoring/MoveCloserToUsageTests.cs index e71dd6be56..313cfd69d8 100644 --- a/RubberduckTests/Refactoring/MoveCloserToUsageTests.cs +++ b/RubberduckTests/Refactoring/MoveCloserToUsageTests.cs @@ -32,7 +32,7 @@ public void MoveCloserToUsageRefactoring_Field() const string expectedCode = @"Private Sub Foo() Dim bar As Boolean -bar = True + bar = True End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -69,7 +69,7 @@ As _ const string expectedCode = @"Private Sub Foo() Dim bar As Boolean -bar = True + bar = True End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -155,7 +155,7 @@ public void MoveCloserToUsageRefactoring_Variable() @"Private Sub Foo() Dim bat As Integer Dim bar As Boolean -bar = True + bar = True End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -194,7 +194,7 @@ As _ @"Private Sub Foo() Dim bat As Integer Dim bar As Boolean -bar = True + bar = True End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -234,7 +234,7 @@ public void MoveCloserToUsageRefactoring_MultipleFields_MoveSecond() Private Sub Foo() Dim bat As Boolean -bat = True + bat = True End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -274,7 +274,7 @@ public void MoveCloserToUsageRefactoring_MultipleFieldsOneStatement_MoveFirst() Private Sub Foo() Dim bar As Integer -bar = 3 + bar = 3 End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -314,7 +314,7 @@ public void MoveCloserToUsageRefactoring_MultipleFieldsOneStatement_MoveSecond() Private Sub Foo() Dim bat As Boolean -bat = True + bat = True End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -354,7 +354,7 @@ public void MoveCloserToUsageRefactoring_MultipleFieldsOneStatement_MoveLast() Private Sub Foo() Dim bay As Date -bay = #1/13/2004# + bay = #1/13/2004# End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -396,7 +396,7 @@ public void MoveCloserToUsageRefactoring_MultipleVariablesOneStatement_MoveFirst bat = True Dim bar As Integer -bar = 3 + bar = 3 End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -438,7 +438,7 @@ public void MoveCloserToUsageRefactoring_MultipleVariablesOneStatement_MoveSecon bar = 1 Dim bat As Boolean -bat = True + bat = True End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -480,7 +480,7 @@ public void MoveCloserToUsageRefactoring_MultipleVariablesOneStatement_MoveLast( bar = 4 Dim bay As Date -bay = #1/13/2004# + bay = #1/13/2004# End Sub"; var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); @@ -583,7 +583,7 @@ public void MoveCloserToUsageRefactoring_ReferenceIsNotBeginningOfStatement_Assi const string expectedCode = @"Private Sub Foo(ByRef bat As Boolean) Dim bar As Boolean -bat = bar + bat = bar End Sub"; var selection = new Selection(1, 1); @@ -618,7 +618,7 @@ Sub Baz(ByVal bat As Boolean) const string expectedCode = @"Private Sub Foo() Dim bar As Boolean -Baz bar + Baz bar End Sub Sub Baz(ByVal bat As Boolean) End Sub"; @@ -657,7 +657,7 @@ Sub Baz(ByVal bat As Boolean, ByVal bas As Boolean, ByVal bac As Boolean) const string expectedCode = @"Private Sub Foo() Dim bar As Boolean -Baz True, _ + Baz True, _ True, _ bar End Sub @@ -735,7 +735,7 @@ Debug.Print someParam @" Public Sub Test() Dim foo As Long -SomeSub someParam:=foo + SomeSub someParam:=foo End Sub Public Sub SomeSub(ByVal someParam As Long) @@ -906,7 +906,7 @@ End Property Debug.Print ""Some statements between"" Debug.Print ""Declaration and first usage!"" Dim foo As Class1 -Set foo = new Class1 + Set foo = new Class1 foo.Name = ""FooName"" foo.OtherProperty = 1626 End Sub"; From a556bb4907bfac593109e8e724971cefe20acde8 Mon Sep 17 00:00:00 2001 From: Tom Helm Date: Sat, 28 Apr 2018 23:36:33 +0100 Subject: [PATCH 2/4] Request reparse after move closer to usage refactoring --- .../MoveCloserToUsage/MoveCloserToUsageRefactoring.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs b/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs index 9ad6a16a51..77a599f1b0 100644 --- a/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs +++ b/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs @@ -125,6 +125,7 @@ private void MoveCloserToUsage() { rewriter.Rewrite(); } + Reparse(); } private void UpdateOtherModules() @@ -208,5 +209,10 @@ private void UpdateCallsToOtherModule(IEnumerable reference _rewriters.Add(rewriter); } } + + private void Reparse() + { + _state.OnParseRequested(this); + } } } From 54de255153753d277b2a9c98e401d8227e4e152f Mon Sep 17 00:00:00 2001 From: Tom Helm Date: Sun, 29 Apr 2018 18:20:25 +0100 Subject: [PATCH 3/4] Wrap ActiveCodePane and CodeModule in using blocks --- .../MoveCloserToUsage/MoveCloserToUsageRefactoring.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs b/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs index 77a599f1b0..669b86d374 100644 --- a/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs +++ b/Rubberduck.Core/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs @@ -169,8 +169,15 @@ private void InsertNewDeclaration() } var insertionIndex = (expression as ParserRuleContext).Start.TokenIndex; - var firstReferenceLine = _vbe.ActiveCodePane.CodeModule.GetLines((expression as ParserRuleContext).Start.Line, 1); - var indentLength = firstReferenceLine.Length - firstReferenceLine.TrimStart().Length; + int indentLength; + using (var pane = _vbe.ActiveCodePane) + { + using (var codeModule = pane.CodeModule) + { + var firstReferenceLine = codeModule.GetLines((expression as ParserRuleContext).Start.Line, 1); + indentLength = firstReferenceLine.Length - firstReferenceLine.TrimStart().Length; + } + } var padding = new string(' ', indentLength); var rewriter = _state.GetRewriter(firstReference.QualifiedModuleName); From 22181b004bb3e43779aa0a95210f606a3dc57242 Mon Sep 17 00:00:00 2001 From: Tom Helm Date: Sun, 29 Apr 2018 18:21:14 +0100 Subject: [PATCH 4/4] Test case for MoveCloserToUsage refactoring with line numbers --- .../Refactoring/MoveCloserToUsageTests.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/RubberduckTests/Refactoring/MoveCloserToUsageTests.cs b/RubberduckTests/Refactoring/MoveCloserToUsageTests.cs index 313cfd69d8..1b25fef695 100644 --- a/RubberduckTests/Refactoring/MoveCloserToUsageTests.cs +++ b/RubberduckTests/Refactoring/MoveCloserToUsageTests.cs @@ -49,6 +49,40 @@ public void MoveCloserToUsageRefactoring_Field() } } + [Test] + [Category("Refactorings")] + [Category("Move Closer")] + public void MoveCloserToUsageRefactoring_LineNumbers() + { + //Input + const string inputCode = + @"Private bar As Boolean +Private Sub Foo() +100 bar = True +End Sub"; + var selection = new Selection(1, 1); + + //Expectation + const string expectedCode = + @"Private Sub Foo() +Dim bar As Boolean +100 bar = True +End Sub"; + + var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component, selection); + using (var state = MockParser.CreateAndParse(vbe.Object)) + { + + var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), selection); + + var refactoring = new MoveCloserToUsageRefactoring(vbe.Object, state, null); + refactoring.Refactor(qualifiedSelection); + + var rewriter = state.GetRewriter(component); + Assert.AreEqual(expectedCode, rewriter.GetText()); + } + } + [Test] [Category("Refactorings")] [Category("Move Closer")]