@@ -249,17 +249,119 @@ public void ChecksOutRewritersForTheTargetCodeKind()
249249 Assert.AreEqual(expectedCodeKind, actualCodeKind);
250250 }
251251
252+ [Test]
253+ [Category("Rewriter")]
254+ public void CallsRecoverSelectionOnNextParseOnRewrite()
255+ {
256+ var selectionRecovererMock = new Mock<ISelectionRecoverer>();
257+ selectionRecovererMock.Setup(m => m.RecoverSavedSelectionsOnNextParse());
258+
259+ var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider, selectionRecoverer: selectionRecovererMock.Object);
260+ var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
261+
262+ rewriteSession.CheckOutModuleRewriter(module);
263+ rewriteSession.TryRewrite();
264+
265+ selectionRecovererMock.Verify(m => m.RecoverSavedSelectionsOnNextParse(), Times.Once);
266+ }
267+
268+ [Test]
269+ [Category("Rewriter")]
270+ public void SavesSelectionForCheckedOutModulesOnRewrite()
271+ {
272+ var selectionRecovererMock = new Mock<ISelectionRecoverer>();
273+ selectionRecovererMock.Setup(m => m.SaveSelections(It.IsAny<IEnumerable<QualifiedModuleName>>()));
274+
275+ var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider, selectionRecoverer: selectionRecovererMock.Object);
276+ var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
277+ var module2 = new QualifiedModuleName("TestProject", string.Empty, "TestModule2");
278+
279+ rewriteSession.CheckOutModuleRewriter(module);
280+ rewriteSession.CheckOutModuleRewriter(module2);
281+ rewriteSession.TryRewrite();
282+
283+ selectionRecovererMock.Verify(m => m.SaveSelections(It.Is<IEnumerable<QualifiedModuleName>>(modules => modules.Count() == 2 && modules.Contains(module) && modules.Contains(module2))));
284+ }
285+
286+ [Test]
287+ [Category("Rewriter")]
288+ public void AdjustsSelectionForCheckedOutModulesOnRewriteWhoseRewriterHasASelectionOffsetSet()
289+ {
290+ var selectionRecovererMock = new Mock<ISelectionRecoverer>();
291+ selectionRecovererMock.Setup(m => m.AdjustSavedSelection(It.IsAny<QualifiedModuleName>(), It.IsAny<Selection>()));
292+
293+ var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider, selectionRecoverer: selectionRecovererMock.Object);
294+ var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
295+ var module2 = new QualifiedModuleName("TestProject", string.Empty, "TestModule2");
296+
297+ var selectionOffset = new Selection(2,3);
298+
299+ var rewriter = rewriteSession.CheckOutModuleRewriter(module);
300+ rewriter.SelectionOffset = selectionOffset;
301+ rewriteSession.CheckOutModuleRewriter(module2);
302+ rewriteSession.TryRewrite();
303+
304+ selectionRecovererMock.Verify(m => m.AdjustSavedSelection(module, selectionOffset), Times.Once);
305+ selectionRecovererMock.Verify(m => m.AdjustSavedSelection(module2, It.IsAny<Selection>()), Times.Never);
306+ }
307+
308+ [Test]
309+ [Category("Rewriter")]
310+ public void ReplacesSelectionForCheckedOutModulesOnRewriteWhoseRewriterHasASelectionSet()
311+ {
312+ var selectionRecovererMock = new Mock<ISelectionRecoverer>();
313+ var moduleSelection = new Selection(4,3);
314+ selectionRecovererMock.Setup(m => m.ReplaceSavedSelection(It.IsAny<QualifiedModuleName>(), It.IsAny<Selection>())).Callback((QualifiedModuleName qmn, Selection selection) => moduleSelection = selection);
315+ selectionRecovererMock.Setup(m => m.AdjustSavedSelection(It.IsAny<QualifiedModuleName>(), It.IsAny<Selection>())).Callback((QualifiedModuleName qmn, Selection selection) => moduleSelection = moduleSelection.Offset(selection));
316+
317+ var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider, selectionRecoverer: selectionRecovererMock.Object);
318+ var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
319+
320+ var selectionReplacement = new Selection(2, 3);
321+ var selectionOffset = new Selection(42,42);
322+
323+ var rewriter = rewriteSession.CheckOutModuleRewriter(module);
324+ rewriter.Selection = selectionReplacement;
325+ rewriter.SelectionOffset = selectionOffset;
326+ rewriteSession.TryRewrite();
327+
328+ Assert.AreEqual(selectionReplacement, moduleSelection);
329+ }
330+
331+ [Test]
332+ [Category("Rewriter")]
333+ public void FirstAppliesOffsetAndThenReplacesSelectionForCheckedOutModulesOnRewriteWhoseRewriterHasASelectionAndASelectionOffsetSet()
334+ {
335+ var selectionRecovererMock = new Mock<ISelectionRecoverer>();
336+ selectionRecovererMock.Setup(m => m.ReplaceSavedSelection(It.IsAny<QualifiedModuleName>(), It.IsAny<Selection>()));
337+
338+ var rewriteSession = RewriteSession(session => true, out var mockRewriterProvider, selectionRecoverer: selectionRecovererMock.Object);
339+ var module = new QualifiedModuleName("TestProject", string.Empty, "TestModule");
340+ var module2 = new QualifiedModuleName("TestProject", string.Empty, "TestModule2");
341+
342+ var selectionReplacement = new Selection(2, 3);
343+
344+ var rewriter = rewriteSession.CheckOutModuleRewriter(module);
345+ rewriter.Selection = selectionReplacement;
346+ rewriteSession.CheckOutModuleRewriter(module2);
347+ rewriteSession.TryRewrite();
348+
349+ selectionRecovererMock.Verify(m => m.ReplaceSavedSelection(module, selectionReplacement), Times.Once);
350+ selectionRecovererMock.Verify(m => m.ReplaceSavedSelection(module2, It.IsAny<Selection>()), Times.Never);
351+ }
352+
353+
252354 protected IRewriteSession RewriteSession(Func<IRewriteSession, bool> rewritingAllowed,
253- out MockRewriterProvider mockProvider, bool rewritersAreDirty = false)
355+ out MockRewriterProvider mockProvider, bool rewritersAreDirty = false, ISelectionRecoverer selectionRecoverer = null )
254356 {
255357 var parseManager = new Mock<IParseManager>();
256358 parseManager.Setup(m => m.OnSuspendParser(It.IsAny<object>(), It.IsAny<IEnumerable<ParserState>>(), It.IsAny<Action>(), It.IsAny<int>()))
257359 .Callback((object requestor, IEnumerable<ParserState> allowedStates, Action suspendAction, int timeout) => suspendAction())
258360 .Returns((object requestor, IEnumerable<ParserState> allowedStates, Action suspendAction, int timeout) => SuspensionResult.Completed);
259- return RewriteSession(parseManager.Object, rewritingAllowed, out mockProvider, rewritersAreDirty);
361+ return RewriteSession(parseManager.Object, rewritingAllowed, out mockProvider, rewritersAreDirty, selectionRecoverer );
260362 }
261363
262- protected abstract IRewriteSession RewriteSession(IParseManager parseManager, Func<IRewriteSession, bool> rewritingAllowed, out MockRewriterProvider mockProvider, bool rewritersAreDirty = false);
364+ protected abstract IRewriteSession RewriteSession(IParseManager parseManager, Func<IRewriteSession, bool> rewritingAllowed, out MockRewriterProvider mockProvider, bool rewritersAreDirty = false, ISelectionRecoverer selectionRecoverer = null );
263365 }
264366
265367
@@ -286,6 +388,8 @@ private Mock<IExecutableModuleRewriter> CreateMockModuleRewriter()
286388 var mock = new Mock<IExecutableModuleRewriter>();
287389 mock.Setup(m => m.Rewrite());
288390 mock.Setup(m => m.IsDirty).Returns(_createdRewritersAreDirty);
391+ mock.SetupProperty(m => m.SelectionOffset);
392+ mock.SetupProperty(m => m.Selection);
289393
290394 return mock;
291395 }
0 commit comments