Skip to content

Commit cf1e02b

Browse files
committed
Added SuspendParserFailureException
1 parent d4ec435 commit cf1e02b

File tree

7 files changed

+69
-35
lines changed

7 files changed

+69
-35
lines changed

Rubberduck.Core/UI/Command/Refactorings/Notifiers/ExtractInterfaceFailedNotifier.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ protected override string Message(RefactoringException exception)
2222
invalidDeclarationType.TargetDeclaration.QualifiedModuleName,
2323
invalidDeclarationType.TargetDeclaration.DeclarationType,
2424
DeclarationType.ClassModule);
25+
case SuspendParserFailureException suspendParserFailure:
26+
Logger.Warn(suspendParserFailure);
27+
return Resources.RubberduckUI.RefactoringFailure_SuspendParserFailure;
2528
default:
2629
return base.Message(exception);
2730
}

Rubberduck.Core/UI/Command/Refactorings/Notifiers/RenameFailedNotifier.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ protected override string Message(RefactoringException exception)
2121
return string.Format(Resources.RubberduckUI.RenameFailure_TargetModuleWithoutCodeModule, codeModuleNotFound.TargetDeclaration.QualifiedModuleName);
2222
case TargetControlNotFoundException controlNotFound:
2323
Logger.Warn(controlNotFound);
24-
return string.Format(Resources.RubberduckUI.RenameFailure_TargetContriolNotFound, controlNotFound.TargetDeclaration.QualifiedName);
24+
return string.Format(Resources.RubberduckUI.RenameFailure_TargetControlNotFound, controlNotFound.TargetDeclaration.QualifiedName);
2525
case TargetDeclarationIsStandardEventHandlerException standardHandler:
2626
return string.Format(Resources.RubberduckUI.RenameFailure_StandardEventHandler, standardHandler.TargetDeclaration.QualifiedName);
27+
case SuspendParserFailureException suspendParserFailure:
28+
Logger.Warn(suspendParserFailure);
29+
return Resources.RubberduckUI.RefactoringFailure_SuspendParserFailure;
2730
default:
2831
return base.Message(exception);
2932
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace Rubberduck.Refactorings.Exceptions
8+
{
9+
public class SuspendParserFailureException : RefactoringException
10+
{ }
11+
}

Rubberduck.Refactorings/ExtractInterface/ExtractInterfaceRefactoring.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,21 +59,21 @@ protected override ExtractInterfaceModel InitializeModel(Declaration target)
5959

6060
protected override void RefactorImpl(ExtractInterfaceModel model)
6161
{
62-
AddInterface(model);
62+
AddInterfaceWithSuspendedParser(model);
6363
}
6464

65-
private void AddInterface(ExtractInterfaceModel model)
65+
private void AddInterfaceWithSuspendedParser(ExtractInterfaceModel model)
6666
{
6767
//We need to suspend here since adding the interface and rewriting will both trigger a reparse.
68-
var suspendResult = _parseManager.OnSuspendParser(this, new[] {ParserState.Ready}, () => AddInterfaceInternal(model));
68+
var suspendResult = _parseManager.OnSuspendParser(this, new[] {ParserState.Ready}, () => AddInterface(model));
6969
if (suspendResult != SuspensionResult.Completed)
7070
{
71-
_logger.Warn($"Extract interface failed because a parser suspension request could not be fulfilled.The request's result was '{suspendResult.ToString()}'.");
72-
throw new OperationCanceledException(RubberduckUI.RefactoringFailure_BaseMessage);
71+
_logger.Warn($"{nameof(AddInterface)} failed because a parser suspension request could not be fulfilled. The request's result was '{suspendResult.ToString()}'.");
72+
throw new SuspendParserFailureException();
7373
}
7474
}
7575

76-
private void AddInterfaceInternal(ExtractInterfaceModel model)
76+
private void AddInterface(ExtractInterfaceModel model)
7777
{
7878
var targetProject = model.TargetDeclaration.Project;
7979
if (targetProject == null)

Rubberduck.Refactorings/Rename/RenameRefactoring.cs

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ public RenameRefactoring(IRefactoringPresenterFactory factory, IDeclarationFinde
4444
{DeclarationType.Parameter, RenameParameter},
4545
{DeclarationType.Event, RenameEvent},
4646
{DeclarationType.Variable, RenameVariable},
47-
{DeclarationType.Module, RenameModule},
48-
{DeclarationType.Project, RenameProject}
47+
{DeclarationType.Module, RenameModuleWithSuspendedParser},
48+
{DeclarationType.Project, RenameProjectWithSuspendedParser}
4949
};
5050
}
5151

@@ -334,18 +334,11 @@ private void RenameVariable(RenameModel model, IRewriteSession rewriteSession)
334334
}
335335
}
336336

337-
private void RenameModule(RenameModel model, IRewriteSession rewriteSession)
338-
{
339-
//The parser needs to be suspended during the refactoring of a component because the VBE API object rename causes a separate reparse.
340-
var suspendResult = _parseManager.OnSuspendParser(this, new[] { ParserState.Ready }, () => RenameModuleInternal(model, rewriteSession));
341-
if (suspendResult != SuspensionResult.Completed)
342-
{
343-
_logger.Warn($"RenameModule failed because a parser suspension request could not be fulfilled.The request's result was '{suspendResult.ToString()}'.");
344-
throw new OperationCanceledException(RubberduckUI.RefactoringFailure_BaseMessage);
345-
}
346-
}
337+
//The parser needs to be suspended during the refactoring of a component because the VBE API object rename causes a separate reparse.
338+
private void RenameModuleWithSuspendedParser(RenameModel model, IRewriteSession rewriteSession)
339+
=> SuspendParserForRefactoring(nameof(RenameModule), () => RenameModule(model, rewriteSession));
347340

348-
private void RenameModuleInternal(RenameModel model, IRewriteSession rewriteSession)
341+
private void RenameModule(RenameModel model, IRewriteSession rewriteSession)
349342
{
350343
RenameReferences(model.Target, model.NewName, rewriteSession);
351344

@@ -413,19 +406,12 @@ private void RenameModuleInternal(RenameModel model, IRewriteSession rewriteSess
413406
}
414407
}
415408

416-
private void RenameProject(RenameModel model, IRewriteSession rewriteSession)
417-
{
418-
//The parser needs to be suspended during the refactoring of a project because the VBE API object rename causes a separate reparse.
419-
var suspendResult = _parseManager.OnSuspendParser(this, new[] { ParserState.Ready }, () => RenameProjectInternal(model, rewriteSession));
420-
if (suspendResult != SuspensionResult.Completed)
421-
{
422-
_logger.Warn($"RenameProject failed because a parser suspension request could not be fulfilled.The request's result was '{suspendResult.ToString()}'.");
423-
throw new OperationCanceledException(RubberduckUI.RefactoringFailure_BaseMessage);
424-
}
425-
}
409+
//The parser needs to be suspended during the refactoring of a project because the VBE API object rename causes a separate reparse.
410+
private void RenameProjectWithSuspendedParser(RenameModel model, IRewriteSession rewriteSession)
411+
=> SuspendParserForRefactoring(nameof(RenameProject), () => RenameProject(model, rewriteSession));
426412

427413
//TODO: Implement renaming references to the project in code.
428-
private void RenameProjectInternal(RenameModel model, IRewriteSession rewriteSession)
414+
private void RenameProject(RenameModel model, IRewriteSession rewriteSession)
429415
{
430416
var project = _projectsProvider.Project(model.Target.ProjectId);
431417

@@ -499,6 +485,16 @@ private List<string> StandardEventHandlerNames()
499485
|| ev.IdentifierName.StartsWith("auto_"))
500486
.Select(dec => dec.IdentifierName).ToList();
501487
}
488+
489+
private void SuspendParserForRefactoring(string procedureName, Action busyAction)
490+
{
491+
var suspendResult = _parseManager.OnSuspendParser(this, new[] { ParserState.Ready }, busyAction);
492+
if (suspendResult != SuspensionResult.Completed)
493+
{
494+
_logger.Warn($"{procedureName} failed because a parser suspension request could not be fulfilled. The request's result was '{suspendResult.ToString()}'.");
495+
throw new SuspendParserFailureException();
496+
}
497+
}
502498
}
503499
}
504500

Rubberduck.Resources/RubberduckUI.Designer.cs

Lines changed: 21 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/RubberduckUI.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1547,7 +1547,7 @@ NOTE: Restart is required for the setting to take effect.</value>
15471547
<value>No code module found for the target module '{0}'.</value>
15481548
<comment>{0}: name of module</comment>
15491549
</data>
1550-
<data name="RenameFailure_TargetContriolNotFound" xml:space="preserve">
1550+
<data name="RenameFailure_TargetControlNotFound" xml:space="preserve">
15511551
<value>Target control '{0}' not found.</value>
15521552
<comment>{0}: name of control</comment>
15531553
</data>
@@ -1641,4 +1641,7 @@ NOTE: Restart is required for the setting to take effect.</value>
16411641
<value>{0} Consider choosing a different name.</value>
16421642
<comment>{0} = Meaningless name message</comment>
16431643
</data>
1644+
<data name="RefactoringFailure_SuspendParserFailure" xml:space="preserve">
1645+
<value>Unable to suspend the Parser to perform the refactoring operation</value>
1646+
</data>
16441647
</root>

0 commit comments

Comments
 (0)