From d7fc5efec018c4801460cbe834bd6e4b743bf84d Mon Sep 17 00:00:00 2001 From: Nelson Vides Date: Mon, 20 Nov 2017 18:22:36 +0100 Subject: [PATCH 1/6] Updated LibGit2Sharp to version v0.24.0 API changed: -> repository.commit() now mandates 'author' and 'commiter' as two distinct parameters. I pass into both the same value by default. -> repository.Stage() passes to the static class 'Commands' taking the repo as a first parameters. -> repository.Pull() undergoes the same change -> repository.Checkout() also -> repository.Remove() also -> repository.Fetch() takes the biggest changes. -It now requires by default a refSpec. As we will usually fetch everything, I hardcoded on the code the classic "+refs/heads/*:refs/remotes/origin/*". -It also requires a logMessage, which I hardoced empty ("") -> repository.Branches[branch].Remote changes as well. Now this collection moves to the .Network class member of the repository, as repo.Network.Remotes[branch] Changes to be committed: modified: RetailCoder.VBE/Rubberduck.csproj modified: RetailCoder.VBE/packages.config modified: Rubberduck.SourceControl/GitProvider.cs modified: Rubberduck.SourceControl/Rubberduck.SourceControl.csproj new file: Rubberduck.SourceControl/_SourceControlClassDiagram.cd modified: Rubberduck.SourceControl/packages.config modified: RubberduckTests/RubberduckTests.csproj --- RetailCoder.VBE/Rubberduck.csproj | 9 +- RetailCoder.VBE/packages.config | 2 + Rubberduck.SourceControl/GitProvider.cs | 47 ++-- .../Rubberduck.SourceControl.csproj | 7 +- .../_SourceControlClassDiagram.cd | 237 ++++++++++++++++++ Rubberduck.SourceControl/packages.config | 2 +- RubberduckTests/RubberduckTests.csproj | 5 +- 7 files changed, 286 insertions(+), 23 deletions(-) create mode 100644 Rubberduck.SourceControl/_SourceControlClassDiagram.cd diff --git a/RetailCoder.VBE/Rubberduck.csproj b/RetailCoder.VBE/Rubberduck.csproj index 61aed19bf4..94b2817820 100644 --- a/RetailCoder.VBE/Rubberduck.csproj +++ b/RetailCoder.VBE/Rubberduck.csproj @@ -1,5 +1,6 @@  + @@ -12,7 +13,8 @@ Rubberduck v4.5 512 - 480c0557 + + ..\ true @@ -256,9 +258,9 @@ ..\libs\Infralution.Localization.Wpf.dll - + False - ..\packages\LibGit2Sharp.0.22.0-pre20150516171636\lib\net40\LibGit2Sharp.dll + ..\packages\LibGit2Sharp.0.24.0\lib\net40\LibGit2Sharp.dll ..\packages\System.Windows.Interactivity.WPF.2.0.20525\lib\net40\Microsoft.Expression.Interactions.dll @@ -1485,6 +1487,7 @@ + diff --git a/RetailCoder.VBE/packages.config b/RetailCoder.VBE/packages.config index f6eb6900ea..85b2e69caf 100644 --- a/RetailCoder.VBE/packages.config +++ b/RetailCoder.VBE/packages.config @@ -7,6 +7,8 @@ + + diff --git a/Rubberduck.SourceControl/GitProvider.cs b/Rubberduck.SourceControl/GitProvider.cs index 0c3bda185e..5d1f01f89f 100644 --- a/Rubberduck.SourceControl/GitProvider.cs +++ b/Rubberduck.SourceControl/GitProvider.cs @@ -185,7 +185,8 @@ public override IRepository InitVBAProject(string directory) var status = repo.RetrieveStatus(new StatusOptions {DetectRenamesInWorkDir = true}); foreach (var stat in status.Untracked) { - repo.Stage(stat.FilePath); + // repo.Stage(stat.FilePath); //deprecated from LibGit2Sharp v0.24 + LibGit2Sharp.Commands.Stage(repo, stat.FilePath); } try @@ -193,7 +194,7 @@ public override IRepository InitVBAProject(string directory) //The default behavior of LibGit2Sharp.Repo.Commit is to throw an exception if no signature is found, // but BuildSignature() does not throw if a signature is not found, it returns "unknown" instead. // so we pass a signature that won't throw along to the commit. - repo.Commit("Initial Commit", GetSignature(repo)); + repo.Commit("Initial Commit", GetSignature(repo), GetSignature(repo)); } catch(LibGit2SharpException ex) { @@ -246,7 +247,15 @@ public override void Fetch([Optional] string remoteName) if (remote != null) { - _repo.Network.Fetch(remote); + //_repo.Network.Fetch(remote); // deprecated on LibGit2Sharp from v0.24.0 + /* + * The new functionality requires a refSpec. + * As I suppose we're just tracking by default the whole remote, + * then I choose to hardcode the refSpec here: + */ + // NOTE: hardcoded string + IEnumerable refSpec = new List() {"+refs/heads/*:refs/remotes/origin/*"}; + LibGit2Sharp.Commands.Fetch(_repo, remoteName, refSpec, null,""); } RequeryUnsyncedCommits(); @@ -270,7 +279,8 @@ public override void Pull() }; var signature = GetSignature(); - _repo.Network.Pull(signature, options); + //_repo.Network.Pull(signature, options); // deprecated on LibGit2Sharp from v0.24.0 + LibGit2Sharp.Commands.Pull(_repo, signature, options); base.Pull(); @@ -289,7 +299,7 @@ public override void Commit(string message) //The default behavior of LibGit2Sharp.Repo.Commit is to throw an exception if no signature is found, // but BuildSignature() does not throw if a signature is not found, it returns "unknown" instead. // so we pass a signature that won't throw along to the commit. - _repo.Commit(message, GetSignature()); + _repo.Commit(message, GetSignature(), GetSignature()); } catch (LibGit2SharpException ex) { @@ -301,7 +311,8 @@ public override void Stage(string filePath) { try { - _repo.Stage(filePath); + // _repo.Stage(filePath); // deprecated on LibGit2Sharp from v0.24.0 + LibGit2Sharp.Commands.Stage(_repo, filePath); } catch (LibGit2SharpException ex) { @@ -313,7 +324,8 @@ public override void Stage(IEnumerable filePaths) { try { - _repo.Stage(filePaths); + //_repo.Stage(filePaths); // deprecated on LibGit2Sharp from v0.24.0 + LibGit2Sharp.Commands.Stage(_repo, filePaths); } catch (LibGit2SharpException ex) { @@ -348,7 +360,8 @@ public override void Checkout(string branch) { try { - _repo.Checkout(_repo.Branches[branch]); + //_repo.Checkout(_repo.Branches[branch]); // deprecated on LibGit2Sharp from v0.24.0 + LibGit2Sharp.Commands.Checkout(_repo, branch); base.Checkout(branch); RequeryUnsyncedCommits(); @@ -364,7 +377,8 @@ public override void CreateBranch(string branch) try { _repo.CreateBranch(branch); - _repo.Checkout(branch); + //_repo.Checkout(branch); // deprecated on LibGit2Sharp from v0.24.0 + LibGit2Sharp.Commands.Checkout(_repo,branch); RequeryUnsyncedCommits(); } @@ -379,7 +393,8 @@ public override void CreateBranch(string sourceBranch, string branch) try { _repo.CreateBranch(branch, _repo.Branches[sourceBranch].Commits.Last()); - _repo.Checkout(branch); + //_repo.Checkout(branch); // deprecated on LibGit2Sharp from v0.24.0 + LibGit2Sharp.Commands.Checkout(_repo, branch); RequeryUnsyncedCommits(); } @@ -417,7 +432,8 @@ public override void Unpublish(string branch) { try { - var remote = _repo.Branches[branch].Remote; + //var remote = _repo.Branches[branch].Remote; // deprecated on LibGit2Sharp from v0.24.0 + var remote = _repo.Network.Remotes[branch]; _repo.Branches.Update(_repo.Branches[branch], b => b.Remote = remote.Name, b => b.TrackedBranch = null, b => b.UpstreamBranch = null); @@ -463,7 +479,8 @@ public override void AddFile(string filePath) try { // https://github.com/libgit2/libgit2sharp/wiki/Git-add - _repo.Stage(filePath); + //_repo.Stage(filePath); // deprecated on LibGit2Sharp from v0.24.0 + LibGit2Sharp.Commands.Stage(_repo, filePath); } catch (LibGit2SharpException ex) { @@ -481,7 +498,8 @@ public override void RemoveFile(string filePath, bool removeFromWorkingDirectory try { NotifyExternalFileChanges = false; - _repo.Remove(filePath, removeFromWorkingDirectory); + //_repo.Remove(filePath, removeFromWorkingDirectory); // deprecated on LibGit2Sharp from v0.24.0 + LibGit2Sharp.Commands.Remove(_repo, filePath, removeFromWorkingDirectory); NotifyExternalFileChanges = true; } catch (LibGit2SharpException ex) @@ -554,7 +572,8 @@ public override void DeleteBranch(string branchName) }; } - _repo.Network.Push(branch.Remote, ":" + _repo.Branches[branchName].UpstreamBranchCanonicalName, options); + //_repo.Network.Push(branch.Remote, ":" + _repo.Branches[branchName].UpstreamBranchCanonicalName, options); // deprecated on LibGit2Sharp from v0.24.0 + _repo.Network.Push(_repo.Network.Remotes[branchName], ":" + _repo.Branches[branchName].UpstreamBranchCanonicalName, options); } // remote local repo diff --git a/Rubberduck.SourceControl/Rubberduck.SourceControl.csproj b/Rubberduck.SourceControl/Rubberduck.SourceControl.csproj index 7f6b98014e..1cc499c4c5 100644 --- a/Rubberduck.SourceControl/Rubberduck.SourceControl.csproj +++ b/Rubberduck.SourceControl/Rubberduck.SourceControl.csproj @@ -38,9 +38,9 @@ 7.1 - - ..\packages\LibGit2Sharp.0.22.0-pre20150516171636\lib\net40\LibGit2Sharp.dll - True + + False + ..\packages\LibGit2Sharp.0.24.0\lib\net40\LibGit2Sharp.dll False @@ -82,6 +82,7 @@ + diff --git a/Rubberduck.SourceControl/_SourceControlClassDiagram.cd b/Rubberduck.SourceControl/_SourceControlClassDiagram.cd new file mode 100644 index 0000000000..b0a2420a8d --- /dev/null +++ b/Rubberduck.SourceControl/_SourceControlClassDiagram.cd @@ -0,0 +1,237 @@ + + + + + + IAAAAAAAAAAAAAgAAAAAAAQAAAAAACAAAAAIAAAAAAA= + Branch.cs + + + + + + + AAACAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAIAAAAAA= + Commit.cs + + + + + + + AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAACAAAAAAAAAAA= + Credentials.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Credentials.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Credentials.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQA= + DefaultSettings.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAIAAA= + FileStatusEntry.cs + + + + + + + IIBAgEIEECAABCYAAEEEQAAAAAQAWQAAAMgCAAIQiBA= + GitProvider.cs + + + + + + + AgACAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Repository.cs + + + + + + + AAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAAQAIIAAAAA= + SourceControlConfigProvider.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + SourceControlException.cs + + + + + + IoBAgFAEEABABCYCAEEECIAAAAQASQAAAIgCAIIQiBA= + SourceControlProviderBase.cs + + + + + + + AAAAAAQAAAAAAAAAgAAAAAQAIAAAAAAAAQAAAgAAAAA= + SourceControlSettings.cs + + + + + + + CAAAAAAAQAAAoAAgAkABEAIAEQAAIlQEABAgAEAAAIg= + + + + + + AIAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Interop\Branches.cs + + + + + + + AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAACAAAAAAAAAAA= + Interop\Credentials.cs + + + + + + + + + + AAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAA= + Interop\FileStatusEntries.cs + + + + + + + AIAAAEAEAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAABA= + Interop\GitProvider.cs + + + + + + + AAAAAABAAAAAAAAAgAAAAAQAAAAAAAAAAAAAAAAAAAA= + Interop\SourceControlClassFactory.cs + + + + + + + IAAAAAAAAAAAAAgAAAAAAAQAAAAAACAAAAAIAAAAAAA= + Branch.cs + + + + + + AAACAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAIAAAAAA= + Commit.cs + + + + + + AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAACAAAAAAAAAAA= + Credentials.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAIAAA= + FileStatusEntry.cs + + + + + + AgACAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + IRepository.cs + + + + + + IoBAgFAEEAAABCYCAEEEAIAAAAQASQAAAIgCAIIQiBA= + ISourceControlProvider.cs + + + + + + AAAAAAQAAAAAAAAAAAAAAAQAIAAAAAAAAQAAAgAAAAA= + SourceControlSettings.cs + + + + + + AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAACAAAAAAAAAAA= + Interop\Credentials.cs + + + + + + IIBAAFAEEAAABAIAAAEAAAAAAAQAAQAAAAACAAIQiBA= + Interop\ISourceControlProvider.cs + + + + + + AAAAAABAAAAAAAAAgAAAAAQAAAAAAAAAAAAAAAAAAAA= + Interop\SourceControlClassFactory.cs + + + + + + AAAAAAAACAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAA= + DefaultSettings.cs + + + + + + AAAAEgAAqAIAAEAAABAAAEABAACAAAAAAAgAAAAAEQA= + FileStatus.cs + + + + \ No newline at end of file diff --git a/Rubberduck.SourceControl/packages.config b/Rubberduck.SourceControl/packages.config index ce9f3bc615..0a039c16f2 100644 --- a/Rubberduck.SourceControl/packages.config +++ b/Rubberduck.SourceControl/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/RubberduckTests/RubberduckTests.csproj b/RubberduckTests/RubberduckTests.csproj index ac60a2ab4b..1c6312f726 100644 --- a/RubberduckTests/RubberduckTests.csproj +++ b/RubberduckTests/RubberduckTests.csproj @@ -49,8 +49,9 @@ ..\packages\Castle.Windsor.4.0.0\lib\net45\Castle.Windsor.dll - - ..\packages\LibGit2Sharp.0.22.0-pre20150516171636\lib\net40\LibGit2Sharp.dll + + False + ..\packages\LibGit2Sharp.0.24.0\lib\net40\LibGit2Sharp.dll From f651a9ed074a6539750f4151635ec67e5a06f5bd Mon Sep 17 00:00:00 2001 From: Nelson Vides Date: Tue, 21 Nov 2017 09:37:03 +0100 Subject: [PATCH 2/6] Removed comments, clarify changes. Working out libgit2sharp v0.24 --- Rubberduck.SourceControl/GitProvider.cs | 18 +----------------- .../Rubberduck.SourceControl.csproj | 3 +-- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/Rubberduck.SourceControl/GitProvider.cs b/Rubberduck.SourceControl/GitProvider.cs index 5d1f01f89f..7e3c89d98e 100644 --- a/Rubberduck.SourceControl/GitProvider.cs +++ b/Rubberduck.SourceControl/GitProvider.cs @@ -185,7 +185,6 @@ public override IRepository InitVBAProject(string directory) var status = repo.RetrieveStatus(new StatusOptions {DetectRenamesInWorkDir = true}); foreach (var stat in status.Untracked) { - // repo.Stage(stat.FilePath); //deprecated from LibGit2Sharp v0.24 LibGit2Sharp.Commands.Stage(repo, stat.FilePath); } @@ -247,13 +246,7 @@ public override void Fetch([Optional] string remoteName) if (remote != null) { - //_repo.Network.Fetch(remote); // deprecated on LibGit2Sharp from v0.24.0 - /* - * The new functionality requires a refSpec. - * As I suppose we're just tracking by default the whole remote, - * then I choose to hardcode the refSpec here: - */ - // NOTE: hardcoded string + // FIXME: hardcoded string IEnumerable refSpec = new List() {"+refs/heads/*:refs/remotes/origin/*"}; LibGit2Sharp.Commands.Fetch(_repo, remoteName, refSpec, null,""); } @@ -279,7 +272,6 @@ public override void Pull() }; var signature = GetSignature(); - //_repo.Network.Pull(signature, options); // deprecated on LibGit2Sharp from v0.24.0 LibGit2Sharp.Commands.Pull(_repo, signature, options); base.Pull(); @@ -311,7 +303,6 @@ public override void Stage(string filePath) { try { - // _repo.Stage(filePath); // deprecated on LibGit2Sharp from v0.24.0 LibGit2Sharp.Commands.Stage(_repo, filePath); } catch (LibGit2SharpException ex) @@ -324,7 +315,6 @@ public override void Stage(IEnumerable filePaths) { try { - //_repo.Stage(filePaths); // deprecated on LibGit2Sharp from v0.24.0 LibGit2Sharp.Commands.Stage(_repo, filePaths); } catch (LibGit2SharpException ex) @@ -360,7 +350,6 @@ public override void Checkout(string branch) { try { - //_repo.Checkout(_repo.Branches[branch]); // deprecated on LibGit2Sharp from v0.24.0 LibGit2Sharp.Commands.Checkout(_repo, branch); base.Checkout(branch); @@ -377,7 +366,6 @@ public override void CreateBranch(string branch) try { _repo.CreateBranch(branch); - //_repo.Checkout(branch); // deprecated on LibGit2Sharp from v0.24.0 LibGit2Sharp.Commands.Checkout(_repo,branch); RequeryUnsyncedCommits(); @@ -393,7 +381,6 @@ public override void CreateBranch(string sourceBranch, string branch) try { _repo.CreateBranch(branch, _repo.Branches[sourceBranch].Commits.Last()); - //_repo.Checkout(branch); // deprecated on LibGit2Sharp from v0.24.0 LibGit2Sharp.Commands.Checkout(_repo, branch); RequeryUnsyncedCommits(); @@ -432,7 +419,6 @@ public override void Unpublish(string branch) { try { - //var remote = _repo.Branches[branch].Remote; // deprecated on LibGit2Sharp from v0.24.0 var remote = _repo.Network.Remotes[branch]; _repo.Branches.Update(_repo.Branches[branch], b => b.Remote = remote.Name, @@ -498,7 +484,6 @@ public override void RemoveFile(string filePath, bool removeFromWorkingDirectory try { NotifyExternalFileChanges = false; - //_repo.Remove(filePath, removeFromWorkingDirectory); // deprecated on LibGit2Sharp from v0.24.0 LibGit2Sharp.Commands.Remove(_repo, filePath, removeFromWorkingDirectory); NotifyExternalFileChanges = true; } @@ -572,7 +557,6 @@ public override void DeleteBranch(string branchName) }; } - //_repo.Network.Push(branch.Remote, ":" + _repo.Branches[branchName].UpstreamBranchCanonicalName, options); // deprecated on LibGit2Sharp from v0.24.0 _repo.Network.Push(_repo.Network.Remotes[branchName], ":" + _repo.Branches[branchName].UpstreamBranchCanonicalName, options); } diff --git a/Rubberduck.SourceControl/Rubberduck.SourceControl.csproj b/Rubberduck.SourceControl/Rubberduck.SourceControl.csproj index 1cc499c4c5..aa6126e944 100644 --- a/Rubberduck.SourceControl/Rubberduck.SourceControl.csproj +++ b/Rubberduck.SourceControl/Rubberduck.SourceControl.csproj @@ -1,6 +1,5 @@  - Debug @@ -40,6 +39,7 @@ False + True ..\packages\LibGit2Sharp.0.24.0\lib\net40\LibGit2Sharp.dll @@ -108,7 +108,6 @@ This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - From 11d2e7e892e97a2cabe9e5f76811a61454624067 Mon Sep 17 00:00:00 2001 From: Nelson Vides Date: Fri, 24 Nov 2017 14:55:27 +0100 Subject: [PATCH 3/6] libgit2shar v0.24 integrated --- .gitignore | 2 ++ Rubberduck.SourceControl/GitProvider.cs | 2 -- RubberduckTests/packages.config | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index bf5510fe9c..8eb34baec0 100644 --- a/.gitignore +++ b/.gitignore @@ -177,3 +177,5 @@ $RECYCLE.BIN/ *.xlsm Installers/ *.xlsx + +CodeGraphData/ \ No newline at end of file diff --git a/Rubberduck.SourceControl/GitProvider.cs b/Rubberduck.SourceControl/GitProvider.cs index 7e3c89d98e..6a35cac820 100644 --- a/Rubberduck.SourceControl/GitProvider.cs +++ b/Rubberduck.SourceControl/GitProvider.cs @@ -464,8 +464,6 @@ public override void AddFile(string filePath) { try { - // https://github.com/libgit2/libgit2sharp/wiki/Git-add - //_repo.Stage(filePath); // deprecated on LibGit2Sharp from v0.24.0 LibGit2Sharp.Commands.Stage(_repo, filePath); } catch (LibGit2SharpException ex) diff --git a/RubberduckTests/packages.config b/RubberduckTests/packages.config index 22ff858646..70edb8c79d 100644 --- a/RubberduckTests/packages.config +++ b/RubberduckTests/packages.config @@ -2,7 +2,7 @@ - + From 4b9f3fcbccef8b27aef995fd187e251adb72b71c Mon Sep 17 00:00:00 2001 From: Nelson Vides Date: Sat, 25 Nov 2017 15:30:01 +0100 Subject: [PATCH 4/6] Parameter names given on the .Commit() commands --- Rubberduck.SourceControl/GitProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rubberduck.SourceControl/GitProvider.cs b/Rubberduck.SourceControl/GitProvider.cs index 6a35cac820..ef5b589cee 100644 --- a/Rubberduck.SourceControl/GitProvider.cs +++ b/Rubberduck.SourceControl/GitProvider.cs @@ -193,7 +193,7 @@ public override IRepository InitVBAProject(string directory) //The default behavior of LibGit2Sharp.Repo.Commit is to throw an exception if no signature is found, // but BuildSignature() does not throw if a signature is not found, it returns "unknown" instead. // so we pass a signature that won't throw along to the commit. - repo.Commit("Initial Commit", GetSignature(repo), GetSignature(repo)); + repo.Commit("Initial Commit", author: GetSignature(repo), committer: GetSignature(repo)); } catch(LibGit2SharpException ex) { @@ -291,7 +291,7 @@ public override void Commit(string message) //The default behavior of LibGit2Sharp.Repo.Commit is to throw an exception if no signature is found, // but BuildSignature() does not throw if a signature is not found, it returns "unknown" instead. // so we pass a signature that won't throw along to the commit. - _repo.Commit(message, GetSignature(), GetSignature()); + _repo.Commit(message, author: GetSignature(), committer: GetSignature()); } catch (LibGit2SharpException ex) { From abc2b53881c0e827ff972cabc1677d9ad60d132e Mon Sep 17 00:00:00 2001 From: Vogel612 Date: Sat, 25 Nov 2017 16:42:05 +0100 Subject: [PATCH 5/6] Stop renaming references to Me Class module references to Me should not be renamed to not break the code. Fixes #2710 --- .../Refactorings/Rename/RenameRefactoring.cs | 4 +- RubberduckTests/Refactoring/RenameTests.cs | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/RetailCoder.VBE/Refactorings/Rename/RenameRefactoring.cs b/RetailCoder.VBE/Refactorings/Rename/RenameRefactoring.cs index 6276a9cb4c..c859ab826d 100644 --- a/RetailCoder.VBE/Refactorings/Rename/RenameRefactoring.cs +++ b/RetailCoder.VBE/Refactorings/Rename/RenameRefactoring.cs @@ -476,7 +476,9 @@ private void RenameStandardElements(Declaration target, string newName) private void RenameReferences(Declaration target, string newName) { - var modules = target.References.GroupBy(r => r.QualifiedModuleName); + var modules = target.References + .Where(reference => reference.Context.GetText() != "Me") + .GroupBy(r => r.QualifiedModuleName); foreach (var grouping in modules) { _modulesToRewrite.Add(grouping.Key); diff --git a/RubberduckTests/Refactoring/RenameTests.cs b/RubberduckTests/Refactoring/RenameTests.cs index 6910cf7655..02f0f9ab14 100644 --- a/RubberduckTests/Refactoring/RenameTests.cs +++ b/RubberduckTests/Refactoring/RenameTests.cs @@ -1962,6 +1962,48 @@ public void RenameRefactoring_RenameViewModel_IsValidName_ChangeCasingNotValid() Assert.IsFalse(renameViewModel.IsValidName); } + + [TestMethod] + [TestCategory("Refactorings")] + [TestCategory("Rename")] + public void RenameRefactoring_RenameClassModule_DoesNotChangeMeReferences() + { + const string newName = "RenamedClassModule"; + + //Input + const string inputCode = + @"Property Get Self() As IClassModule + Set Self = Me +End Property"; + + var selection = new Selection(3, 27, 3, 27); + + IVBComponent component; + var vbe = MockVbeBuilder.BuildFromSingleModule(inputCode, "ClassModule1", ComponentType.ClassModule, out component, selection); + using (var state = MockParser.CreateAndParse(vbe.Object)) + { + + var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), selection); + + var msgbox = new Mock(); + msgbox.Setup(m => m.Show(It.IsAny(), It.IsAny(), MessageBoxButtons.YesNo, It.IsAny())) + .Returns(DialogResult.Yes); + + var vbeWrapper = vbe.Object; + var model = new RenameModel(vbeWrapper, state, qualifiedSelection) { NewName = newName }; + model.Target = model.Declarations.FirstOrDefault(i => i.DeclarationType == DeclarationType.ClassModule && i.IdentifierName == "ClassModule1"); + + //SetupFactory + var factory = SetupFactory(model); + + var refactoring = new RenameRefactoring(vbeWrapper, factory.Object, msgbox.Object, state); + refactoring.Refactor(model.Target); + + Assert.AreSame(newName, component.CodeModule.Name); + Assert.AreEqual(inputCode, component.CodeModule.GetLines(0, component.CodeModule.CountOfLines)); + } + + } #endregion #region Test Execution From ef11a057caebf54af7159a8fac05939de7e1fd46 Mon Sep 17 00:00:00 2001 From: Vogel612 Date: Sat, 25 Nov 2017 21:23:57 +0100 Subject: [PATCH 6/6] Consider More than just ClassModules for MemberNotOnInterface fixes #2189 --- .../MemberNotOnInterfaceInspection.cs | 7 +-- .../Symbols/IdentifierReferenceResolver.cs | 2 +- .../MemberNotOnInterfaceInspectionTests.cs | 62 +++++++++++++++++++ 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/Rubberduck.Inspections/Concrete/MemberNotOnInterfaceInspection.cs b/Rubberduck.Inspections/Concrete/MemberNotOnInterfaceInspection.cs index 26498d4066..eebbc88556 100644 --- a/Rubberduck.Inspections/Concrete/MemberNotOnInterfaceInspection.cs +++ b/Rubberduck.Inspections/Concrete/MemberNotOnInterfaceInspection.cs @@ -23,16 +23,15 @@ protected override IEnumerable DoGetInspectionResults() var targets = Declarations.Where(decl => decl.AsTypeDeclaration != null && !decl.AsTypeDeclaration.IsUserDefined && - decl.AsTypeDeclaration.DeclarationType == DeclarationType.ClassModule && + decl.AsTypeDeclaration.DeclarationType.HasFlag(DeclarationType.ClassModule) && ((ClassModuleDeclaration)decl.AsTypeDeclaration).IsExtensible) .SelectMany(decl => decl.References).ToList(); - return from access in unresolved let callingContext = targets.FirstOrDefault(usage => usage.Context.Equals(access.CallingContext)) where callingContext != null select new DeclarationInspectionResult(this, - string.Format(InspectionsUI.MemberNotOnInterfaceInspectionResultFormat, access.IdentifierName, callingContext.Declaration.AsTypeDeclaration.IdentifierName), - access); + string.Format(InspectionsUI.MemberNotOnInterfaceInspectionResultFormat, access.IdentifierName, callingContext.Declaration.AsTypeDeclaration.IdentifierName), + access); } } } diff --git a/Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs b/Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs index 205c999650..15b4657606 100644 --- a/Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs +++ b/Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs @@ -174,7 +174,7 @@ private void ResolveLabel(ParserRuleContext context, string label) { var lexpression = expression as VBAParser.LExpressionContext ?? expression.GetChild(0) - ?? (expression as VBAParser.LExprContext + ?? (expression as VBAParser.LExprContext ?? expression.GetChild(0))?.lExpression(); if (lexpression != null) diff --git a/RubberduckTests/Inspections/MemberNotOnInterfaceInspectionTests.cs b/RubberduckTests/Inspections/MemberNotOnInterfaceInspectionTests.cs index 08d8120785..25f5b2bb00 100644 --- a/RubberduckTests/Inspections/MemberNotOnInterfaceInspectionTests.cs +++ b/RubberduckTests/Inspections/MemberNotOnInterfaceInspectionTests.cs @@ -265,5 +265,67 @@ public void MemberNotOnInterface_Ignored_DoesNotReturnResult() Assert.IsFalse(inspectionResults.Any()); } } + + [TestMethod] + [DeploymentItem(@"Testfiles\")] + [TestCategory("Inspections")] + public void MemberNotOnInterface_CatchesInvalidUseOfMember() + { + const string userForm1Code = @" +Private _fooBar As String + +Public Property Let FooBar(value As String) + _fooBar = value +End Property + +Public Property Get FooBar() As String + FooBar = _fooBar +End Property +"; + + const string analyzedCode = @"Option Explicit + +Sub FizzBuzz() + + Dim bar As UserForm1 + Set bar = New UserForm1 + bar.FooBar = ""FooBar"" + + Dim foo As UserForm + Set foo = New UserForm1 + foo.FooBar = ""BarFoo"" + +End Sub +"; + var mockVbe = new MockVbeBuilder(); + var projectBuilder = mockVbe.ProjectBuilder("testproject", ProjectProtection.Unprotected); + projectBuilder.MockUserFormBuilder("UserForm1", userForm1Code).MockProjectBuilder() + .AddComponent("ReferencingModule", ComponentType.StandardModule, analyzedCode) + //.AddReference("Excel", MockVbeBuilder.LibraryPathMsExcel) + .AddReference("MSForms", MockVbeBuilder.LibraryPathMsForms); + + mockVbe.AddProject(projectBuilder.Build()); + + + var parser = MockParser.Create(mockVbe.Build().Object); + + //parser.State.AddTestLibrary("Excel.1.8.xml"); + parser.State.AddTestLibrary("MSForms.2.0.xml"); + + parser.Parse(new CancellationTokenSource()); + if (parser.State.Status >= ParserState.Error) + { + Assert.Inconclusive("Parser Error"); + } + + using (var state = parser.State) + { + var inspection = new MemberNotOnInterfaceInspection(state); + var inspectionResults = inspection.GetInspectionResults(); + + Assert.IsTrue(inspectionResults.Any()); + } + + } } }