Skip to content

Commit 2591207

Browse files
committed
Wire up open code pane state recovery in the attributes rewriter
This should reopen the the code panes we close because we export and reimport on an attributes rewrite.
1 parent 8ceca41 commit 2591207

File tree

3 files changed

+63
-8
lines changed

3 files changed

+63
-8
lines changed

Rubberduck.Parsing/Rewriter/AttributesRewriteSession.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,15 @@ private void ReparseOnSuspension(object requestor, ParserStateEventArgs e)
5555

5656
private void ExecuteAllRewriters()
5757
{
58+
//Attribute rewrites close the affected code panes, so we have to recover the open state.
59+
SelectionRecoverer.SaveOpenState(CheckedOutModuleRewriters.Keys);
5860
foreach (var module in CheckedOutModuleRewriters.Keys)
5961
{
6062
//We have to mark the modules explicitly as modified because attributes only changes do not alter the code pane code.
6163
_parseManager.MarkAsModified(module);
6264
CheckedOutModuleRewriters[module].Rewrite();
6365
}
66+
SelectionRecoverer.RecoverOpenState();
6467
}
6568
}
6669
}

Rubberduck.Parsing/Rewriter/RewriteSessionBase.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public abstract class RewriteSessionBase : IRewriteSession
1414
protected readonly IDictionary<QualifiedModuleName, IExecutableModuleRewriter> CheckedOutModuleRewriters = new Dictionary<QualifiedModuleName, IExecutableModuleRewriter>();
1515
protected readonly IRewriterProvider RewriterProvider;
1616

17-
private readonly ISelectionRecoverer _selectionRecoverer;
17+
protected readonly ISelectionRecoverer SelectionRecoverer;
1818
private readonly Func<IRewriteSession, bool> _rewritingAllowed;
1919

2020
protected readonly Logger Logger = LogManager.GetCurrentClassLogger();
@@ -26,7 +26,7 @@ protected RewriteSessionBase(IRewriterProvider rewriterProvider, ISelectionRecov
2626
{
2727
RewriterProvider = rewriterProvider;
2828
_rewritingAllowed = rewritingAllowed;
29-
_selectionRecoverer = selectionRecoverer;
29+
SelectionRecoverer = selectionRecoverer;
3030
}
3131

3232
public IReadOnlyCollection<QualifiedModuleName> CheckedOutModules => CheckedOutModuleRewriters.Keys.ToHashSet();
@@ -104,27 +104,27 @@ public bool TryRewrite()
104104

105105
private void PrimeSelectionRecovery()
106106
{
107-
_selectionRecoverer.SaveSelections(CheckedOutModuleRewriters.Keys);
107+
SelectionRecoverer.SaveSelections(CheckedOutModuleRewriters.Keys);
108108

109109
foreach (var (module, rewriter) in CheckedOutModuleRewriters)
110110
{
111111
if (rewriter.SelectionOffset.HasValue)
112112
{
113-
_selectionRecoverer.AdjustSavedSelection(module, rewriter.SelectionOffset.Value);
113+
SelectionRecoverer.AdjustSavedSelection(module, rewriter.SelectionOffset.Value);
114114
}
115115
if (rewriter.Selection.HasValue)
116116
{
117-
_selectionRecoverer.ReplaceSavedSelection(module, rewriter.Selection.Value);
117+
SelectionRecoverer.ReplaceSavedSelection(module, rewriter.Selection.Value);
118118
}
119119
}
120120

121-
_selectionRecoverer.RecoverSavedSelectionsOnNextParse();
121+
SelectionRecoverer.RecoverSavedSelectionsOnNextParse();
122122
}
123123

124124
private void PrimeActiveCodePaneRecovery()
125125
{
126-
_selectionRecoverer.SaveActiveCodePane();
127-
_selectionRecoverer.RecoverActiveCodePaneOnNextParse();
126+
SelectionRecoverer.SaveActiveCodePane();
127+
SelectionRecoverer.RecoverActiveCodePaneOnNextParse();
128128
}
129129
}
130130
}

RubberduckTests/Rewriter/AttributesRewriteSessionTests.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,58 @@ public void TargetsAttributesCode()
8989
Assert.AreEqual(CodeKind.AttributesCode, rewriteSession.TargetCodeKind);
9090
}
9191

92+
[Test]
93+
[Category("Rewriter")]
94+
public void CallsRecoverOpenStateOnRewrite()
95+
{
96+
var selectionRecovererMock = new Mock<ISelectionRecoverer>();
97+
selectionRecovererMock.Setup(m => m.RecoverOpenState());
98+
99+
var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider, selectionRecoverer: selectionRecovererMock.Object);
100+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
101+
102+
rewriteSession.CheckOutModuleRewriter(module);
103+
rewriteSession.TryRewrite();
104+
105+
selectionRecovererMock.Verify(m => m.RecoverOpenState(), Times.Once);
106+
}
107+
108+
[Test]
109+
[Category("Rewriter")]
110+
public void SavesOpenStateForCheckedOutModulesOnRewrite()
111+
{
112+
var selectionRecovererMock = new Mock<ISelectionRecoverer>();
113+
selectionRecovererMock.Setup(m => m.SaveOpenState(It.IsAny<IEnumerable<QualifiedModuleName>>()));
114+
115+
var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider, selectionRecoverer: selectionRecovererMock.Object);
116+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
117+
var module2 = new QualifiedModuleName("TestProject", string.Empty, "TestModule2");
118+
119+
rewriteSession.CheckOutModuleRewriter(module);
120+
rewriteSession.CheckOutModuleRewriter(module2);
121+
rewriteSession.TryRewrite();
122+
123+
selectionRecovererMock.Verify(m => m.SaveOpenState(It.Is<IEnumerable<QualifiedModuleName>>(modules => modules.Count() == 2 && modules.Contains(module) && modules.Contains(module2))));
124+
}
125+
126+
[Test]
127+
[Category("Rewriter")]
128+
public void SavesOpenStateBeforeRestoringItOnRewrite()
129+
{
130+
var selectionRecovererMock = new Mock<ISelectionRecoverer>();
131+
var lastOperation = string.Empty;
132+
selectionRecovererMock.Setup(m => m.SaveOpenState(It.IsAny<IEnumerable<QualifiedModuleName>>())).Callback(() => lastOperation = "SaveOpenState");
133+
selectionRecovererMock.Setup(m => m.RecoverOpenState()).Callback(() => lastOperation = "RecoverOpenState");
134+
135+
var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider, selectionRecoverer: selectionRecovererMock.Object);
136+
var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
137+
138+
rewriteSession.CheckOutModuleRewriter(module);
139+
rewriteSession.TryRewrite();
140+
141+
Assert.AreEqual("RecoverOpenState", lastOperation);
142+
}
143+
92144
protected override IRewriteSession RewriteSession(IParseManager parseManager, Func<IRewriteSession, bool> rewritingAllowed, out MockRewriterProvider mockProvider, bool rewritersAreDirty = false, ISelectionRecoverer selectionRecoverer = null)
93145
{
94146
if (selectionRecoverer == null)

0 commit comments

Comments
 (0)