Skip to content

Commit

Permalink
Merge pull request #5555 from BZngr/EncapsulateField_ClearBlanklines
Browse files Browse the repository at this point in the history
Clean-up blank lines left behind by EncapsulateFieldRefactoring and MoveCloserToUsage
  • Loading branch information
retailcoder committed Aug 15, 2020
2 parents d5a5587 + 61795ef commit df01e8a
Show file tree
Hide file tree
Showing 12 changed files with 446 additions and 199 deletions.
108 changes: 108 additions & 0 deletions Rubberduck.Refactorings/Common/IModuleRewriterExtensions.cs
@@ -0,0 +1,108 @@
using Antlr4.Runtime;
using Rubberduck.Parsing;
using Rubberduck.Parsing.Grammar;
using Rubberduck.Parsing.Rewriter;
using Rubberduck.Parsing.Symbols;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Rubberduck.Refactorings.Common
{
public static class IModuleRewriterExtensions
{
/// <summary>
/// Removes variable declaration and subsequent <c>VBAParser.EndOfStatementContext</c>
/// depending on the <paramref name="removeEndOfStmtContext"/> flag.
/// This function is intended to be called only once per rewriter within a given <c>ModuleRewriteSession</c>.
/// </summary>
/// <remarks>
/// Calling this function with <paramref name="removeEndOfStmtContext"/> defaulted to <c>true</c>
/// avoids leaving residual newlines between the deleted declaration and the next declaration.
/// The one-time call constraint is required for scenarios where variables to delete are declared in a list. Specifically,
/// the use case where all the variables in the list are to be removed.
/// If the variables to remove are not declared in a list, then this function can be called multiple times.
/// </remarks>
public static void RemoveVariables(this IModuleRewriter rewriter, IEnumerable<VariableDeclaration> toRemove, bool removeEndOfStmtContext = true)
{
if (!toRemove.Any())
{
return;
}

var fieldsToDeleteByListContext = toRemove.Distinct()
.ToLookup(f => f.Context.GetAncestor<VBAParser.VariableListStmtContext>());

foreach (var fieldsToDelete in fieldsToDeleteByListContext)
{
var variableList = fieldsToDelete.Key.children.OfType<VBAParser.VariableSubStmtContext>();

if (variableList.Count() == fieldsToDelete.Count())
{
if (fieldsToDelete.First().ParentDeclaration.DeclarationType.HasFlag(DeclarationType.Module))
{
rewriter.RemoveDeclarationContext<VBAParser.ModuleDeclarationsElementContext>(fieldsToDelete.First(), removeEndOfStmtContext);
}
else
{
rewriter.RemoveDeclarationContext<VBAParser.BlockStmtContext>(fieldsToDelete.First(), removeEndOfStmtContext);
}
continue;
}

foreach (var target in fieldsToDelete)
{
rewriter.Remove(target);
}
}
}

/// <summary>
/// Removes a member declaration and subsequent <c>VBAParser.EndOfStatementContext</c>
/// depending on the <paramref name="removeEndOfStmtContext"/> flag.
/// </summary>
/// <remarks>
/// Calling this function with <paramref name="removeEndOfStmtContext"/> defaulted to <c>true</c>
/// avoids leaving residual newlines between the deleted declaration and the next declaration.
/// </remarks>
public static void RemoveMember(this IModuleRewriter rewriter, ModuleBodyElementDeclaration target, bool removeEndOfStmtContext = true)
{
RemoveMembers(rewriter, new ModuleBodyElementDeclaration[] { target }, removeEndOfStmtContext);
}

/// <summary>
/// Removes member declarations and subsequent <c>VBAParser.EndOfStatementContext</c>
/// depending on the <paramref name="removeEndOfStmtContext"/> flag.
/// </summary>
/// <remarks>
/// Calling this function with <paramref name="removeEndOfStmtContext"/> defaulted to <c>true</c>
/// avoids leaving residual newlines between the deleted declaration and the next declaration.
/// </remarks>
public static void RemoveMembers(this IModuleRewriter rewriter, IEnumerable<ModuleBodyElementDeclaration> toRemove, bool removeEndOfStmtContext = true)
{
if (!toRemove.Any())
{
return;
}

foreach (var member in toRemove)
{
rewriter.RemoveDeclarationContext<VBAParser.ModuleBodyElementContext>(member, removeEndOfStmtContext);
}
}

private static void RemoveDeclarationContext<T>(this IModuleRewriter rewriter, Declaration declaration, bool removeEndOfStmtContext = true) where T : ParserRuleContext
{
if (!declaration.Context.TryGetAncestor<T>(out var elementContext))
{
throw new ArgumentException();
}

rewriter.Remove(elementContext);
if (removeEndOfStmtContext && elementContext.TryGetFollowingContext<VBAParser.EndOfStatementContext>(out var nextContext))
{
rewriter.Remove(nextContext);
}
}
}
}
Expand Up @@ -6,7 +6,6 @@
using Rubberduck.VBEditor;
using Rubberduck.SmartIndenter;
using Rubberduck.VBEditor.Utility;
using System;

namespace Rubberduck.Refactorings.EncapsulateField
{
Expand Down Expand Up @@ -91,26 +90,25 @@ protected override EncapsulateFieldModel InitializeModel(Declaration target)

protected override void RefactorImpl(EncapsulateFieldModel model)
{
var refactorRewriteSession = new EncapsulateFieldRewriteSession(_rewritingManager.CheckOutCodePaneSession()) as IEncapsulateFieldRewriteSession;
var executableRewriteSession = _rewritingManager.CheckOutCodePaneSession();

refactorRewriteSession = RefactorRewrite(model, refactorRewriteSession);
RefactorRewrite(model, executableRewriteSession);

if (!refactorRewriteSession.TryRewrite())
if (!executableRewriteSession.TryRewrite())
{
throw new RewriteFailedException(refactorRewriteSession.RewriteSession);
throw new RewriteFailedException(executableRewriteSession);
}
}

private string PreviewRewrite(EncapsulateFieldModel model)
{
var previewSession = new EncapsulateFieldRewriteSession(_rewritingManager.CheckOutCodePaneSession()) as IEncapsulateFieldRewriteSession; ;
var previewSession = RefactorRewrite(model, _rewritingManager.CheckOutCodePaneSession(), true);

previewSession = RefactorRewrite(model, previewSession, true);

return previewSession.CreatePreview(model.QualifiedModuleName);
return previewSession.CheckOutModuleRewriter(model.QualifiedModuleName)
.GetText();
}

private IEncapsulateFieldRewriteSession RefactorRewrite(EncapsulateFieldModel model, IEncapsulateFieldRewriteSession refactorRewriteSession, bool asPreview = false)
private IRewriteSession RefactorRewrite(EncapsulateFieldModel model, IRewriteSession refactorRewriteSession, bool asPreview = false)
{
if (!model.SelectedFieldCandidates.Any()) { return refactorRewriteSession; }

Expand Down

This file was deleted.

@@ -1,19 +1,10 @@
using Antlr4.Runtime;
using Rubberduck.Parsing.Grammar;
using Rubberduck.Parsing.Rewriter;
using Rubberduck.Parsing.Rewriter;
using Rubberduck.Parsing.Symbols;
using Rubberduck.Parsing.VBA;
using Rubberduck.Refactorings.Common;
using Rubberduck.Refactorings.EncapsulateField.Extensions;
using Rubberduck.SmartIndenter;
using Rubberduck.VBEditor;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rubberduck.Refactorings.EncapsulateField
{
Expand All @@ -27,14 +18,12 @@ public ConvertFieldsToUDTMembers(IDeclarationFinderProvider declarationFinderPro
_stateUDTField = model.ObjectStateUDTField;
}

protected override void ModifyFields(IEncapsulateFieldRewriteSession refactorRewriteSession)
protected override void ModifyFields(IRewriteSession refactorRewriteSession)
{
var rewriter = refactorRewriteSession.CheckOutModuleRewriter(_targetQMN);

foreach (var field in SelectedFields)
{
refactorRewriteSession.Remove(field.Declaration, rewriter);
}
rewriter.RemoveVariables(SelectedFields.Select(f => f.Declaration)
.Cast<VariableDeclaration>());

if (_stateUDTField.IsExistingDeclaration)
{
Expand All @@ -44,7 +33,7 @@ protected override void ModifyFields(IEncapsulateFieldRewriteSession refactorRew
}
}

protected override void ModifyReferences(IEncapsulateFieldRewriteSession refactorRewriteSession)
protected override void ModifyReferences(IRewriteSession refactorRewriteSession)
{
foreach (var field in SelectedFields)
{
Expand Down
@@ -1,6 +1,7 @@
using Antlr4.Runtime;
using Rubberduck.Parsing;
using Rubberduck.Parsing.Grammar;
using Rubberduck.Parsing.Rewriter;
using Rubberduck.Parsing.Symbols;
using Rubberduck.Parsing.VBA;
using Rubberduck.Refactorings.Common;
Expand All @@ -12,8 +13,6 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rubberduck.Refactorings.EncapsulateField
{
Expand All @@ -33,7 +32,7 @@ public struct PropertyAttributeSet

public interface IEncapsulateStrategy
{
IEncapsulateFieldRewriteSession RefactorRewrite(IEncapsulateFieldRewriteSession refactorRewriteSession, bool asPreview);
IRewriteSession RefactorRewrite(IRewriteSession refactorRewriteSession, bool asPreview);
}

public abstract class EncapsulateFieldStrategyBase : IEncapsulateStrategy
Expand All @@ -57,15 +56,15 @@ public EncapsulateFieldStrategyBase(IDeclarationFinderProvider declarationFinder
_targetQMN = model.QualifiedModuleName;
_indenter = indenter;
_codeBuilder = codeBuilder;
SelectedFields = model.SelectedFieldCandidates;
SelectedFields = model.SelectedFieldCandidates.ToList();

_codeSectionStartIndex = declarationFinderProvider.DeclarationFinder
.Members(_targetQMN).Where(m => m.IsMember())
.OrderBy(c => c.Selection)
.FirstOrDefault()?.Context.Start.TokenIndex ?? null;
}

public IEncapsulateFieldRewriteSession RefactorRewrite(IEncapsulateFieldRewriteSession refactorRewriteSession, bool asPreview)
public IRewriteSession RefactorRewrite(IRewriteSession refactorRewriteSession, bool asPreview)
{
ModifyFields(refactorRewriteSession);

Expand All @@ -76,13 +75,13 @@ public IEncapsulateFieldRewriteSession RefactorRewrite(IEncapsulateFieldRewriteS
return refactorRewriteSession;
}

protected abstract void ModifyFields(IEncapsulateFieldRewriteSession rewriteSession);
protected abstract void ModifyFields(IRewriteSession rewriteSession);

protected abstract void ModifyReferences(IEncapsulateFieldRewriteSession refactorRewriteSession);
protected abstract void ModifyReferences(IRewriteSession refactorRewriteSession);

protected abstract void LoadNewDeclarationBlocks();

protected void RewriteReferences(IEncapsulateFieldRewriteSession refactorRewriteSession)
protected void RewriteReferences(IRewriteSession refactorRewriteSession)
{
foreach (var replacement in IdentifierReplacements)
{
Expand All @@ -95,7 +94,7 @@ protected void RewriteReferences(IEncapsulateFieldRewriteSession refactorRewrite
protected void AddContentBlock(NewContentTypes contentType, string block)
=> _newContent[contentType].Add(block);

private void InsertNewContent(IEncapsulateFieldRewriteSession refactorRewriteSession, bool isPreview = false)
private void InsertNewContent(IRewriteSession refactorRewriteSession, bool isPreview = false)
{
_newContent = new Dictionary<NewContentTypes, List<string>>
{
Expand All @@ -119,16 +118,8 @@ private void InsertNewContent(IEncapsulateFieldRewriteSession refactorRewriteSes
.Concat(_newContent[NewContentTypes.DeclarationBlock])
.Concat(_newContent[NewContentTypes.MethodBlock])
.Concat(_newContent[NewContentTypes.PostContentMessage]))
.Trim();

var maxConsecutiveNewLines = 3;
var target = string.Join(string.Empty, Enumerable.Repeat(Environment.NewLine, maxConsecutiveNewLines).ToList());
var replacement = string.Join(string.Empty, Enumerable.Repeat(Environment.NewLine, maxConsecutiveNewLines - 1).ToList());
for (var counter = 1; counter < 10 && newContentBlock.Contains(target); counter++)
{
newContentBlock = newContentBlock.Replace(target, replacement);
}

.Trim()
.LimitNewlines();

var rewriter = refactorRewriteSession.CheckOutModuleRewriter(_targetQMN);
if (_codeSectionStartIndex.HasValue)
Expand Down

0 comments on commit df01e8a

Please sign in to comment.