Skip to content

Commit 3fcec29

Browse files
committed
fixed off-by-one
1 parent 39bf194 commit 3fcec29

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

RetailCoder.VBE/Common/CodeModuleExtensions.cs

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Linq;
45
using Antlr4.Runtime;
56
using Rubberduck.Parsing;
@@ -18,16 +19,46 @@ public static class CodeModuleExtensions
1819
/// <param name="module">The <see cref="ICodeModule"/> to modify.</param>
1920
/// <param name="target"></param>
2021
public static void Remove(this ICodeModule module, Declaration target)
22+
{
23+
if (!module.Equals(target.QualifiedName.QualifiedModuleName.Component.CodeModule))
24+
{
25+
throw new ArgumentException("Target is not declared in specified module.");
26+
}
27+
28+
var sortedItems = target.References
29+
.Where(reference => module.Equals(reference.QualifiedModuleName.Component.CodeModule))
30+
.Select(reference => Tuple.Create((object) reference, reference.Selection))
31+
.Concat(new[] {Tuple.Create((object) target, target.Selection)})
32+
.OrderByDescending(t => t.Item2);
33+
34+
foreach (var tuple in sortedItems)
35+
{
36+
if (tuple.Item1 is Declaration)
37+
{
38+
RemoveDeclarationOnly(module, target);
39+
}
40+
else
41+
{
42+
var reference = (IdentifierReference) tuple.Item1;
43+
Remove(reference.QualifiedModuleName.Component.CodeModule, reference);
44+
}
45+
}
46+
}
47+
48+
private static void RemoveDeclarationOnly(this ICodeModule module, Declaration target)
2149
{
2250
var multipleDeclarations = target.DeclarationType == DeclarationType.Variable && target.HasMultipleDeclarationsInStatement();
2351
var context = GetStmtContext(target);
24-
var declarationText = context.GetText().Replace(" _" + Environment.NewLine, string.Empty);
52+
var declarationText = context.GetText().Replace(" _" + Environment.NewLine, Environment.NewLine);
2553
var selection = GetStmtContextSelection(target);
54+
Debug.Assert(selection.StartColumn > 0);
2655

2756
var oldLines = module.GetLines(selection);
57+
var indent = oldLines.IndexOf(oldLines.FirstOrDefault(c => c != ' ')) + 1;
2858

29-
var newLines = oldLines.Replace(" _" + Environment.NewLine, string.Empty)
30-
.Remove(selection.StartColumn - 1, declarationText.Length);
59+
var newLines = oldLines
60+
.Replace(" _" + Environment.NewLine, Environment.NewLine)
61+
.Remove(selection.StartColumn - 1, declarationText.Length - selection.StartColumn + indent);
3162

3263
if (multipleDeclarations)
3364
{
@@ -129,11 +160,6 @@ private static string RemoveExtraComma(string str, int numParams, int indexRemov
129160
return str.Remove(str.NthIndexOf(',', commaToRemove), 1);
130161
}
131162

132-
public static void Remove(this ICodeModule module, ConstantDeclaration target)
133-
{
134-
135-
}
136-
137163
public static void Remove(this ICodeModule module, IdentifierReference target)
138164
{
139165
var parent = target.Context.Parent as ParserRuleContext;

0 commit comments

Comments
 (0)