diff --git a/RetailCoder.VBE/App.cs b/RetailCoder.VBE/App.cs index ddc3b6de98..f2541f8fa4 100644 --- a/RetailCoder.VBE/App.cs +++ b/RetailCoder.VBE/App.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.Windows.Forms; using Microsoft.Vbe.Interop; +using Rubberduck.Navigations; using Rubberduck.Inspections; using Rubberduck.Parsing; using Rubberduck.Parsing.VBA; @@ -23,8 +24,9 @@ public class App : IDisposable private IParserErrorsPresenter _parserErrorsPresenter; private readonly IConfigurationLoader _configService = new ConfigurationLoader(); private readonly IActiveCodePaneEditor _editor; - private readonly IRubberduckCodePaneFactory _factory; + private readonly IRubberduckCodePaneFactory _codePaneFactory; private readonly IRubberduckParser _parser; + private readonly INavigateImplementations _navigateImplementations; private Configuration _config; private RubberduckMenu _menu; @@ -33,35 +35,31 @@ public class App : IDisposable private bool _displayToolbar = false; private Point _toolbarCoords = new Point(-1, -1); - public App(VBE vbe, AddIn addIn, IParserErrorsPresenter presenter, IRubberduckParser parser, IRubberduckCodePaneFactory factory, IActiveCodePaneEditor editor) + public App(VBE vbe, AddIn addIn, IParserErrorsPresenter presenter, IRubberduckParser parser, IRubberduckCodePaneFactory factory, IActiveCodePaneEditor editor, INavigateImplementations navigateImplementations) { _vbe = vbe; _addIn = addIn; - _factory = factory; + _codePaneFactory = factory; _parser = parser; + _navigateImplementations = navigateImplementations; _parserErrorsPresenter = presenter; _configService.SettingsChanged += _configService_SettingsChanged; - // todo: figure out why Ninject can't seem to resolve the VBE dependency to ActiveCodePaneEditor if it's in the VBEDitor assembly. - // could it be that the VBE type in the two assemblies is actually different? - // aren't the two assemblies using the exact same Microsoft.Vbe.Interop assemby? - - _editor = editor; // */ new ActiveCodePaneEditor(vbe, _factory); + _editor = editor; - LoadConfig(); - - CleanUp(); - - Setup(); + CleanReloadConfiguration(); } private void _configService_SettingsChanged(object sender, EventArgs e) { - LoadConfig(); + CleanReloadConfiguration(); + } + private void CleanReloadConfiguration() + { + LoadConfig(); CleanUp(); - Setup(); } @@ -84,7 +82,7 @@ private void LoadConfig() private void Setup() { - //_parser = new RubberduckParser(_factory); + //_parser = new RubberduckParser(_codePaneFactory); _parser.ParseStarted += _parser_ParseStarted; _parser.ParserError += _parser_ParserError; @@ -92,10 +90,10 @@ private void Setup() _parserErrorsPresenter = new ParserErrorsPresenter(_vbe, _addIn); - _menu = new RubberduckMenu(_vbe, _addIn, _configService, _parser, _editor, _inspector, _factory); + _menu = new RubberduckMenu(_vbe, _addIn, _configService, _parser, _editor, _inspector, _navigateImplementations, _codePaneFactory); _menu.Initialize(); - _formContextMenu = new FormContextMenu(_vbe, _parser, _editor, _factory); + _formContextMenu = new FormContextMenu(_vbe, _parser, _editor, _codePaneFactory); _formContextMenu.Initialize(); _codeInspectionsToolbar = new CodeInspectionsToolbar(_vbe, _inspector); diff --git a/RetailCoder.VBE/Navigations/INavigateImplementations.cs b/RetailCoder.VBE/Navigations/INavigateImplementations.cs new file mode 100644 index 0000000000..01c57058da --- /dev/null +++ b/RetailCoder.VBE/Navigations/INavigateImplementations.cs @@ -0,0 +1,12 @@ +using Rubberduck.Parsing; +using Rubberduck.Parsing.Symbols; + +namespace Rubberduck.Navigations +{ + public interface INavigateImplementations + { + void Find(); + void Find(Declaration target); + void Find(Declaration target, VBProjectParseResult parseResult); + } +} \ No newline at end of file diff --git a/RetailCoder.VBE/Navigations/NavigateImplementations.cs b/RetailCoder.VBE/Navigations/NavigateImplementations.cs new file mode 100644 index 0000000000..fc1ba7b1f1 --- /dev/null +++ b/RetailCoder.VBE/Navigations/NavigateImplementations.cs @@ -0,0 +1,161 @@ +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Microsoft.Vbe.Interop; +using Rubberduck.Parsing; +using Rubberduck.Parsing.Grammar; +using Rubberduck.Parsing.Symbols; +using Rubberduck.UI; +using Rubberduck.UI.IdentifierReferences; +using Rubberduck.VBEditor; +using Rubberduck.VBEditor.VBEInterfaces.RubberduckCodePane; + +namespace Rubberduck.Navigations +{ + public class NavigateImplementations : INavigateImplementations + { + private readonly VBE _vbe; + private readonly AddIn _addIn; + private readonly IRubberduckParser _parser; + private readonly IRubberduckCodePaneFactory _codePaneFactory; + private readonly IRubberduckMessageBox _messageBox; + + public NavigateImplementations(VBE vbe, AddIn addIn, IRubberduckParser parser, IRubberduckCodePaneFactory codePaneFactory, IRubberduckMessageBox messageBox) + { + _vbe = vbe; + _addIn = addIn; + _parser = parser; + _codePaneFactory = codePaneFactory; + _messageBox = messageBox; + } + + public void Find() + { + var codePane = _codePaneFactory.Create(_vbe.ActiveCodePane); + var selection = new QualifiedSelection(new QualifiedModuleName(codePane.CodeModule.Parent), codePane.Selection); + var progress = new ParsingProgressPresenter(); + var parseResult = progress.Parse(_parser, _vbe.ActiveVBProject); + + var implementsStatement = parseResult.Declarations.FindInterfaces() + .SelectMany(i => i.References.Where(reference => reference.Context.Parent is VBAParser.ImplementsStmtContext)) + .SingleOrDefault(r => r.QualifiedModuleName == selection.QualifiedName && r.Selection.Contains(selection.Selection)); + + if (implementsStatement != null) + { + Find(implementsStatement.Declaration, parseResult); + } + + var member = parseResult.Declarations.FindInterfaceImplementationMembers() + .SingleOrDefault(m => m.Project == selection.QualifiedName.Project + && m.ComponentName == selection.QualifiedName.ComponentName + && m.Selection.Contains(selection.Selection)) ?? + parseResult.Declarations.FindInterfaceMembers() + .SingleOrDefault(m => m.Project == selection.QualifiedName.Project + && m.ComponentName == selection.QualifiedName.ComponentName + && m.Selection.Contains(selection.Selection)); + + if (member == null) + { + return; + } + + Find(member, parseResult); + } + + public void Find(Declaration target) + { + var progress = new ParsingProgressPresenter(); + var parseResult = progress.Parse(_parser, _vbe.ActiveVBProject); + Find(target, parseResult); + } + + public void Find(Declaration target, VBProjectParseResult parseResult) + { + string name; + var implementations = (target.DeclarationType == DeclarationType.Class + ? FindAllImplementationsOfClass(target, parseResult, out name) + : FindAllImplementationsOfMember(target, parseResult, out name)) ?? + new List(); + + var declarations = implementations as IList ?? implementations.ToList(); + var implementationsCount = declarations.Count(); + + if (implementationsCount == 1) + { + // if there's only 1 implementation, just jump to it: + ImplementationsListDockablePresenter.OnNavigateImplementation(_vbe, declarations.First()); + } + else if (implementationsCount > 1) + { + // if there's more than one implementation, show the dockable navigation window: + try + { + ShowImplementationsToolwindow(declarations, name); + } + catch (COMException) + { + // the exception is related to the docked control host instance, + // trying again will work (I know, that's bad bad bad code) + ShowImplementationsToolwindow(declarations, name); + } + } + else + { + var message = string.Format(RubberduckUI.AllImplementations_NoneFound, name); + var caption = string.Format(RubberduckUI.AllImplementations_Caption, name); + _messageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private IEnumerable FindAllImplementationsOfClass(Declaration target, VBProjectParseResult parseResult, out string name) + { + if (target.DeclarationType != DeclarationType.Class) + { + name = string.Empty; + return null; + } + + var result = target.References + .Where(reference => reference.Context.Parent is VBAParser.ImplementsStmtContext) + .SelectMany(reference => parseResult.Declarations[reference.QualifiedModuleName.ComponentName]) + .ToList(); + + name = target.ComponentName; + return result; + } + + private IEnumerable FindAllImplementationsOfMember(Declaration target, VBProjectParseResult parseResult, out string name) + { + if (!target.DeclarationType.HasFlag(DeclarationType.Member)) + { + name = string.Empty; + return null; + } + + var isInterface = parseResult.Declarations.FindInterfaces() + .Select(i => i.QualifiedName.QualifiedModuleName.ToString()) + .Contains(target.QualifiedName.QualifiedModuleName.ToString()); + + if (isInterface) + { + name = target.ComponentName + "." + target.IdentifierName; + return parseResult.Declarations.FindInterfaceImplementationMembers(target.IdentifierName) + .Where(item => item.IdentifierName == target.ComponentName + "_" + target.IdentifierName); + } + + var member = parseResult.Declarations.FindInterfaceMember(target); + name = member.ComponentName + "." + member.IdentifierName; + return parseResult.Declarations.FindInterfaceImplementationMembers(member.IdentifierName) + .Where(item => item.IdentifierName == member.ComponentName + "_" + member.IdentifierName); + } + + private void ShowImplementationsToolwindow(IEnumerable implementations, string name) + { + // throws a COMException if toolwindow was already closed + var window = new SimpleListControl(string.Format(RubberduckUI.AllImplementations_Caption, name)); + var presenter = new ImplementationsListDockablePresenter(_vbe, _addIn, window, implementations, _codePaneFactory); + presenter.Show(); + } + } +} \ No newline at end of file diff --git a/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersModel.cs b/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersModel.cs index bdf808d698..a9c647f596 100644 --- a/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersModel.cs +++ b/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersModel.cs @@ -19,9 +19,9 @@ public class RemoveParametersModel public Declaration TargetDeclaration { get; private set; } public List Parameters { get; set; } - private readonly IMessageBox _messageBox; + private readonly IRubberduckMessageBox _messageBox; - public RemoveParametersModel(VBProjectParseResult parseResult, QualifiedSelection selection, IMessageBox messageBox) + public RemoveParametersModel(VBProjectParseResult parseResult, QualifiedSelection selection, IRubberduckMessageBox messageBox) { _parseResult = parseResult; _declarations = parseResult.Declarations; diff --git a/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersPresenter.cs b/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersPresenter.cs index 08a27bdf08..38b29d3a46 100644 --- a/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersPresenter.cs +++ b/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersPresenter.cs @@ -12,9 +12,9 @@ public class RemoveParametersPresenter : IRemoveParametersPresenter { private readonly IRemoveParametersView _view; private readonly RemoveParametersModel _model; - private readonly IMessageBox _messageBox; + private readonly IRubberduckMessageBox _messageBox; - public RemoveParametersPresenter(IRemoveParametersView view, RemoveParametersModel model, IMessageBox messageBox) + public RemoveParametersPresenter(IRemoveParametersView view, RemoveParametersModel model, IRubberduckMessageBox messageBox) { _view = view; _model = model; diff --git a/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersPresenterFactory.cs b/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersPresenterFactory.cs index f92f509362..9f985af8e9 100644 --- a/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersPresenterFactory.cs +++ b/RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersPresenterFactory.cs @@ -9,10 +9,10 @@ public class RemoveParametersPresenterFactory : IRefactoringPresenterFactory _factory; private readonly IActiveCodePaneEditor _editor; - private readonly IMessageBox _messageBox; + private readonly IRubberduckMessageBox _messageBox; private RenameModel _model; - public RenameRefactoring(IRefactoringPresenterFactory factory, IActiveCodePaneEditor editor, IMessageBox messageBox) + public RenameRefactoring(IRefactoringPresenterFactory factory, IActiveCodePaneEditor editor, IRubberduckMessageBox messageBox) { _factory = factory; _editor = editor; diff --git a/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersModel.cs b/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersModel.cs index 74e05bc6c8..89f50b6044 100644 --- a/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersModel.cs +++ b/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersModel.cs @@ -21,9 +21,9 @@ public class ReorderParametersModel public Declaration TargetDeclaration { get; private set; } public List Parameters { get; set; } - private readonly IMessageBox _messageBox; + private readonly IRubberduckMessageBox _messageBox; - public ReorderParametersModel(VBProjectParseResult parseResult, QualifiedSelection selection, IMessageBox messageBox) + public ReorderParametersModel(VBProjectParseResult parseResult, QualifiedSelection selection, IRubberduckMessageBox messageBox) { _parseResult = parseResult; _declarations = parseResult.Declarations; diff --git a/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersPresenter.cs b/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersPresenter.cs index f64cb8df00..8d83bc0628 100644 --- a/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersPresenter.cs +++ b/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersPresenter.cs @@ -12,9 +12,9 @@ public class ReorderParametersPresenter : IReorderParametersPresenter { private readonly IReorderParametersView _view; private readonly ReorderParametersModel _model; - private readonly IMessageBox _messageBox; + private readonly IRubberduckMessageBox _messageBox; - public ReorderParametersPresenter(IReorderParametersView view, ReorderParametersModel model, IMessageBox messageBox) + public ReorderParametersPresenter(IReorderParametersView view, ReorderParametersModel model, IRubberduckMessageBox messageBox) { _view = view; _model = model; diff --git a/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersPresenterFactory.cs b/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersPresenterFactory.cs index fa617b3844..05cfc83e5a 100644 --- a/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersPresenterFactory.cs +++ b/RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersPresenterFactory.cs @@ -9,10 +9,10 @@ public class ReorderParametersPresenterFactory : IRefactoringPresenterFactory _factory; private readonly IActiveCodePaneEditor _editor; private ReorderParametersModel _model; - private readonly IMessageBox _messageBox; + private readonly IRubberduckMessageBox _messageBox; - public ReorderParametersRefactoring(IRefactoringPresenterFactory factory, IActiveCodePaneEditor editor, IMessageBox messageBox) + public ReorderParametersRefactoring(IRefactoringPresenterFactory factory, IActiveCodePaneEditor editor, IRubberduckMessageBox messageBox) { _factory = factory; _editor = editor; diff --git a/RetailCoder.VBE/Rubberduck.csproj b/RetailCoder.VBE/Rubberduck.csproj index 2589b4909f..da773e8973 100644 --- a/RetailCoder.VBE/Rubberduck.csproj +++ b/RetailCoder.VBE/Rubberduck.csproj @@ -239,6 +239,8 @@ + + @@ -293,7 +295,7 @@ - + Form diff --git a/RetailCoder.VBE/UI/CodeInspections/CodeInspectionsDockablePresenter.cs b/RetailCoder.VBE/UI/CodeInspections/CodeInspectionsDockablePresenter.cs index 22c1322ff0..18939d118d 100644 --- a/RetailCoder.VBE/UI/CodeInspections/CodeInspectionsDockablePresenter.cs +++ b/RetailCoder.VBE/UI/CodeInspections/CodeInspectionsDockablePresenter.cs @@ -176,27 +176,19 @@ private async void Refresh() Control.EnableRefresh(false); Control.Cursor = Cursors.WaitCursor; - try + await Task.Run(() => RefreshAsync(token), token); + if (_results != null) { - await Task.Run(() => RefreshAsync(token), token); - if (_results != null) - { - var results = _results.Select(item => new CodeInspectionResultGridViewItem(item)); + var results = _results.Select(item => new CodeInspectionResultGridViewItem(item)); - Control.SetContent(new BindingList( - _gridViewSort.Sort(results, _gridViewSort.ColumnName, - _gridViewSort.SortedAscending).ToList())); - } - } - catch (TaskCanceledException) - { - } - finally - { - Control.SetIssuesStatus(_issues, true); - Control.EnableRefresh(); - Control.Cursor = Cursors.Default; + Control.SetContent(new BindingList( + _gridViewSort.Sort(results, _gridViewSort.ColumnName, + _gridViewSort.SortedAscending).ToList())); } + + Control.SetIssuesStatus(_issues, true); + Control.EnableRefresh(); + Control.Cursor = Cursors.Default; } private async Task RefreshAsync(CancellationToken token) diff --git a/RetailCoder.VBE/UI/IMessageBox.cs b/RetailCoder.VBE/UI/IRubberduckMessageBox.cs similarity index 98% rename from RetailCoder.VBE/UI/IMessageBox.cs rename to RetailCoder.VBE/UI/IRubberduckMessageBox.cs index 91eefb01ed..f1ebf48737 100644 --- a/RetailCoder.VBE/UI/IMessageBox.cs +++ b/RetailCoder.VBE/UI/IRubberduckMessageBox.cs @@ -2,7 +2,7 @@ namespace Rubberduck.UI { - public interface IMessageBox + public interface IRubberduckMessageBox { DialogResult Show(string text); DialogResult Show(IWin32Window owner, string text); @@ -27,7 +27,7 @@ public interface IMessageBox DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, string helpFilePath, HelpNavigator navigator, object param); } - public class RubberduckMessageBox : IMessageBox + public class RubberduckMessageBox : IRubberduckMessageBox { public DialogResult Show(string text) { diff --git a/RetailCoder.VBE/UI/RefactorMenu.cs b/RetailCoder.VBE/UI/RefactorMenu.cs index 281a5e9db8..11a5b45a7f 100644 --- a/RetailCoder.VBE/UI/RefactorMenu.cs +++ b/RetailCoder.VBE/UI/RefactorMenu.cs @@ -1,13 +1,12 @@ using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.InteropServices; using System.Windows.Forms; using Microsoft.Office.Core; using Microsoft.Vbe.Interop; +using Rubberduck.Navigations; using Rubberduck.Parsing; -using Rubberduck.Parsing.Grammar; using Rubberduck.Parsing.Symbols; using Rubberduck.Properties; using Rubberduck.Refactorings.ExtractMethod; @@ -26,15 +25,17 @@ public class RefactorMenu : Menu { private readonly IRubberduckParser _parser; private readonly IActiveCodePaneEditor _editor; + private readonly INavigateImplementations _navigateImplementations; private readonly IRubberduckCodePaneFactory _factory; private readonly SearchResultIconCache _iconCache; - public RefactorMenu(VBE vbe, AddIn addin, IRubberduckParser parser, IActiveCodePaneEditor editor, IRubberduckCodePaneFactory factory) + public RefactorMenu(VBE vbe, AddIn addin, IRubberduckParser parser, IActiveCodePaneEditor editor, INavigateImplementations navigateImplementations, IRubberduckCodePaneFactory factory) : base(vbe, addin) { _parser = parser; _editor = editor; + _navigateImplementations = navigateImplementations; _factory = factory; _iconCache = new SearchResultIconCache(); @@ -233,14 +234,6 @@ public void FindAllReferences(Declaration target) } } - private void ShowImplementationsToolwindow(IEnumerable implementations, string name) - { - // throws a COMException if toolwindow was already closed - var window = new SimpleListControl(string.Format(RubberduckUI.AllImplementations_Caption, name)); - var presenter = new ImplementationsListDockablePresenter(IDE, AddIn, window, implementations, _factory); - presenter.Show(); - } - private void ShowReferencesToolwindow(Declaration target) { // throws a COMException if toolwindow was already closed @@ -252,127 +245,7 @@ private void ShowReferencesToolwindow(Declaration target) [SuppressMessage("ReSharper", "InconsistentNaming")] private void FindAllImplementationsContextMenu_Click(CommandBarButton Ctrl, ref bool CancelDefault) { - FindAllImplementations(); - } - - public void FindAllImplementations() - { - var codePane = _factory.Create(IDE.ActiveCodePane); - var selection = new QualifiedSelection(new QualifiedModuleName(codePane.CodeModule.Parent), codePane.Selection); - var progress = new ParsingProgressPresenter(); - var parseResult = progress.Parse(_parser, IDE.ActiveVBProject); - - var implementsStatement = parseResult.Declarations.FindInterfaces() - .SelectMany(i => i.References.Where(reference => reference.Context.Parent is VBAParser.ImplementsStmtContext)) - .SingleOrDefault(r => r.QualifiedModuleName == selection.QualifiedName && r.Selection.Contains(selection.Selection)); - - if (implementsStatement != null) - { - FindAllImplementations(implementsStatement.Declaration, parseResult); - } - - var member = parseResult.Declarations.FindInterfaceImplementationMembers() - .SingleOrDefault(m => m.Project == selection.QualifiedName.Project - && m.ComponentName == selection.QualifiedName.ComponentName - && m.Selection.Contains(selection.Selection)) ?? - parseResult.Declarations.FindInterfaceMembers() - .SingleOrDefault(m => m.Project == selection.QualifiedName.Project - && m.ComponentName == selection.QualifiedName.ComponentName - && m.Selection.Contains(selection.Selection)); - - if (member == null) - { - return; - } - - FindAllImplementations(member, parseResult); - } - - public void FindAllImplementations(Declaration target) - { - var progress = new ParsingProgressPresenter(); - var parseResult = progress.Parse(_parser, IDE.ActiveVBProject); - FindAllImplementations(target, parseResult); - } - - private void FindAllImplementations(Declaration target, VBProjectParseResult parseResult) - { - string name; - var implementations = (target.DeclarationType == DeclarationType.Class - ? FindAllImplementationsOfClass(target, parseResult, out name) - : FindAllImplementationsOfMember(target, parseResult, out name)) ?? - new List(); - - var declarations = implementations as IList ?? implementations.ToList(); - var implementationsCount = declarations.Count(); - - if (implementationsCount == 1) - { - // if there's only 1 implementation, just jump to it: - ImplementationsListDockablePresenter.OnNavigateImplementation(IDE, declarations.First()); - } - else if (implementationsCount > 1) - { - // if there's more than one implementation, show the dockable navigation window: - try - { - ShowImplementationsToolwindow(declarations, name); - } - catch (COMException) - { - // the exception is related to the docked control host instance, - // trying again will work (I know, that's bad bad bad code) - ShowImplementationsToolwindow(declarations, name); - } - } - else - { - var message = string.Format(RubberduckUI.AllImplementations_NoneFound, name); - var caption = string.Format(RubberduckUI.AllImplementations_Caption, name); - MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private IEnumerable FindAllImplementationsOfClass(Declaration target, VBProjectParseResult parseResult, out string name) - { - if (target.DeclarationType != DeclarationType.Class) - { - name = string.Empty; - return null; - } - - var result = target.References - .Where(reference => reference.Context.Parent is VBAParser.ImplementsStmtContext) - .SelectMany(reference => parseResult.Declarations[reference.QualifiedModuleName.ComponentName]) - .ToList(); - - name = target.ComponentName; - return result; - } - - private IEnumerable FindAllImplementationsOfMember(Declaration target, VBProjectParseResult parseResult, out string name) - { - if (!target.DeclarationType.HasFlag(DeclarationType.Member)) - { - name = string.Empty; - return null; - } - - var isInterface = parseResult.Declarations.FindInterfaces() - .Select(i => i.QualifiedName.QualifiedModuleName.ToString()) - .Contains(target.QualifiedName.QualifiedModuleName.ToString()); - - if (isInterface) - { - name = target.ComponentName + "." + target.IdentifierName; - return parseResult.Declarations.FindInterfaceImplementationMembers(target.IdentifierName) - .Where(item => item.IdentifierName == target.ComponentName + "_" + target.IdentifierName); - } - - var member = parseResult.Declarations.FindInterfaceMember(target); - name = member.ComponentName + "." + member.IdentifierName; - return parseResult.Declarations.FindInterfaceImplementationMembers(member.IdentifierName) - .Where(item => item.IdentifierName == member.ComponentName + "_" + member.IdentifierName); + _navigateImplementations.Find(); } [SuppressMessage("ReSharper", "InconsistentNaming")] diff --git a/RetailCoder.VBE/UI/RubberduckMenu.cs b/RetailCoder.VBE/UI/RubberduckMenu.cs index dc937743d8..faa3d77797 100644 --- a/RetailCoder.VBE/UI/RubberduckMenu.cs +++ b/RetailCoder.VBE/UI/RubberduckMenu.cs @@ -4,6 +4,7 @@ using Microsoft.Vbe.Interop; using Ninject; using Ninject.Parameters; +using Rubberduck.Navigations; using Rubberduck.Inspections; using Rubberduck.Parsing; using Rubberduck.Parsing.Symbols; @@ -33,6 +34,7 @@ internal class RubberduckMenu : Menu private readonly IActiveCodePaneEditor _editor; private readonly IRubberduckCodePaneFactory _factory; private readonly AddIn _addIn; + private readonly INavigateImplementations _navigateImplementations; private CommandBarButton _about; private CommandBarButton _settings; @@ -40,7 +42,7 @@ internal class RubberduckMenu : Menu private ProjectExplorerContextMenu _projectExplorerContextMenu; - public RubberduckMenu(VBE vbe, AddIn addIn, IConfigurationLoader configService, IRubberduckParser parser, IActiveCodePaneEditor editor, IInspector inspector, IRubberduckCodePaneFactory factory) + public RubberduckMenu(VBE vbe, AddIn addIn, IConfigurationLoader configService, IRubberduckParser parser, IActiveCodePaneEditor editor, IInspector inspector, INavigateImplementations navigateImplementations, IRubberduckCodePaneFactory factory) : base(vbe, addIn) { _addIn = addIn; @@ -48,6 +50,7 @@ public RubberduckMenu(VBE vbe, AddIn addIn, IConfigurationLoader configService, _editor = editor; _factory = factory; _configService = configService; + _navigateImplementations = navigateImplementations; var testExplorer = new TestExplorerWindow(); var testEngine = new TestEngine(); @@ -75,7 +78,7 @@ public RubberduckMenu(VBE vbe, AddIn addIn, IConfigurationLoader configService, var inspectionPresenter = new CodeInspectionsDockablePresenter(inspector, vbe, addIn, inspectionExplorer, inspectionGridViewSort, _factory); _codeInspectionsMenu = new CodeInspectionsMenu(vbe, addIn, inspectionExplorer, inspectionPresenter); - _refactorMenu = new RefactorMenu(IDE, AddIn, parser, editor, _factory); + _refactorMenu = new RefactorMenu(IDE, AddIn, parser, editor, _navigateImplementations, _factory); } private void codePresenter_FindAllReferences(object sender, NavigateCodeEventArgs e) @@ -85,7 +88,7 @@ private void codePresenter_FindAllReferences(object sender, NavigateCodeEventArg private void codePresenter_FindAllImplementations(object sender, NavigateCodeEventArgs e) { - _refactorMenu.FindAllImplementations(e.Declaration); + _navigateImplementations.Find(e.Declaration); } private void codePresenter_Rename(object sender, TreeNodeNavigateCodeEventArgs e) diff --git a/RetailCoder.VBE/UI/RubberduckUI.de.resx b/RetailCoder.VBE/UI/RubberduckUI.de.resx index 340cd8726e..6a413fe69b 100644 --- a/RetailCoder.VBE/UI/RubberduckUI.de.resx +++ b/RetailCoder.VBE/UI/RubberduckUI.de.resx @@ -1,4 +1,4 @@ - + - + @@ -1012,100 +1012,103 @@ Warnung: Alle eigenen Einstellungen gehen dabei verloren. Nicht verfolgte Dateien - + {0} efolgreich mit {1} zusammengeführt - + Umbe&nennen - + Bitte wählen Sie Quell- und Zielzweig - + Zweig löschen - + NIcht anzeigen - + Neuer Zweig - + &Neu - + Rubberduck - Zweig löschen - + {0} Problem - + Warnung - + {0} ({1} Probleme) - + Text: - + Wichtigkeit - + Bitte geben Sie einen Zweignamen an. - + Tipp - + Rubberduck - Zweig erstellen - + Rubberduck Code Untersuchungen - {0} {1} Problem gefunden. - + Kein Repository gefunden. - + Zweige zusammenführen - + Text - + Bitte geben sie einen Zweignamen an. - + &Inspizieren - + {0} Probleme - + Aktualisieren - + Na&vigieren - + {0} ({1} Problem) - + Vorschlag - + Rubberduck Code Untersuchungen - {0} {1} Probleme gefunden - + Mittel - + Hoch - + Gering - + Fehler - + + Deutsch + + \ No newline at end of file diff --git a/RetailCoder.VBE/UI/ToDoItems/ToDoExplorerDockablePresenter.cs b/RetailCoder.VBE/UI/ToDoItems/ToDoExplorerDockablePresenter.cs index 528bc9b33a..21b94cbb5e 100644 --- a/RetailCoder.VBE/UI/ToDoItems/ToDoExplorerDockablePresenter.cs +++ b/RetailCoder.VBE/UI/ToDoItems/ToDoExplorerDockablePresenter.cs @@ -48,16 +48,11 @@ public override void Show() public async void Refresh() { - try - { - Cursor.Current = Cursors.WaitCursor; - var results = await GetItems(); - _view.TodoItems = _gridViewSort.Sort(results, _gridViewSort.ColumnName, _gridViewSort.SortedAscending); - } - finally - { - Cursor.Current = Cursors.Default; - } + Cursor.Current = Cursors.WaitCursor; + var results = await GetItems(); + _view.TodoItems = _gridViewSort.Sort(results, _gridViewSort.ColumnName, _gridViewSort.SortedAscending); + + Cursor.Current = Cursors.Default; } private void RefreshToDoList(object sender, EventArgs e) diff --git a/RubberduckTests/Refactoring/RemoveParametersTests.cs b/RubberduckTests/Refactoring/RemoveParametersTests.cs index 2a0fdec479..b97e807650 100644 --- a/RubberduckTests/Refactoring/RemoveParametersTests.cs +++ b/RubberduckTests/Refactoring/RemoveParametersTests.cs @@ -1392,7 +1392,7 @@ Private Sub IClass1_DoSomething(ByVal a As Integer ) var module1 = project.VBComponents.Item(0).CodeModule; var module2 = project.VBComponents.Item(1).CodeModule; - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(DialogResult.Yes); @@ -1440,7 +1440,7 @@ Private Sub IClass1_DoSomething(ByVal a As Integer, ByVal b As String) var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), selection); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(DialogResult.No); @@ -1681,7 +1681,7 @@ public void Presenter_ParameterlessTargetReturnsNullModel() var editor = new Mock(); editor.Setup(e => e.GetSelection()).Returns(qualifiedSelection); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(DialogResult.OK); var factory = new RemoveParametersPresenterFactory(editor.Object, null, parseResult, messageBox.Object); diff --git a/RubberduckTests/Refactoring/RenameTests.cs b/RubberduckTests/Refactoring/RenameTests.cs index 8ac4d4fe4b..0e7762a167 100644 --- a/RubberduckTests/Refactoring/RenameTests.cs +++ b/RubberduckTests/Refactoring/RenameTests.cs @@ -636,7 +636,7 @@ Private Sub IClass1_DoNothing(ByVal a As Integer, ByVal b As String) var module1 = project.VBComponents.Item(0).CodeModule; var module2 = project.VBComponents.Item(1).CodeModule; - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup( m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(DialogResult.Yes); @@ -684,7 +684,7 @@ Private Sub IClass1_DoSomething(ByVal a As Integer, ByVal b As String) var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), selection); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup( m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(DialogResult.No); @@ -1067,7 +1067,7 @@ Dim Goo As Integer //SetupFactory var factory = SetupFactory(model); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup( m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), @@ -1113,7 +1113,7 @@ Dim Goo As Integer //SetupFactory var factory = SetupFactory(model); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup( m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), diff --git a/RubberduckTests/Refactoring/ReorderParametersTests.cs b/RubberduckTests/Refactoring/ReorderParametersTests.cs index 918f228c60..ad796afb8e 100644 --- a/RubberduckTests/Refactoring/ReorderParametersTests.cs +++ b/RubberduckTests/Refactoring/ReorderParametersTests.cs @@ -709,7 +709,7 @@ End Sub //SetupFactory var factory = SetupFactory(model); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), MessageBoxButtons.OK, MessageBoxIcon.Warning)).Returns(DialogResult.OK); //Act @@ -783,7 +783,7 @@ End Sub //SetupFactory var factory = SetupFactory(model); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), MessageBoxButtons.OK, MessageBoxIcon.Warning)).Returns(DialogResult.OK); //Act @@ -871,7 +871,7 @@ End Sub //SetupFactory var factory = SetupFactory(model); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), MessageBoxButtons.OK, MessageBoxIcon.Warning)).Returns(DialogResult.OK); //Act @@ -915,7 +915,7 @@ public void ReorderParams_MoveOptionalParamBeforeNonOptionalParamFails() var factory = SetupFactory(model); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), MessageBoxButtons.OK, MessageBoxIcon.Warning)).Returns(DialogResult.OK); //act @@ -1330,7 +1330,7 @@ Private Sub IClass1_DoSomething(ByVal b As String, ByVal a As Integer) var module1 = project.VBComponents.Item(0).CodeModule; var module2 = project.VBComponents.Item(1).CodeModule; - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup( m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(DialogResult.Yes); @@ -1379,7 +1379,7 @@ Private Sub IClass1_DoSomething(ByVal a As Integer, ByVal b As String) var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), selection); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(DialogResult.No); @@ -1669,7 +1669,7 @@ public void Presenter_ParameterlessMemberCreatesNullModel() var editor = new Mock(); editor.Setup(e => e.GetSelection()).Returns(qualifiedSelection); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(DialogResult.OK); @@ -1705,7 +1705,7 @@ public void Presenter_SingleParameterMemberCreatesNullModel() var editor = new Mock(); editor.Setup(e => e.GetSelection()).Returns(qualifiedSelection); - var messageBox = new Mock(); + var messageBox = new Mock(); messageBox.Setup(m => m.Show(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(DialogResult.OK);