Skip to content

Commit b6981eb

Browse files
committed
tweaked pair-matching behavior for common single-liner simple scenario
1 parent 5eb2488 commit b6981eb

File tree

1 file changed

+37
-9
lines changed

1 file changed

+37
-9
lines changed

Rubberduck.Core/AutoComplete/Service/SelfClosingPairCompletionService.cs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Antlr4.Runtime;
55
using Antlr4.Runtime.Misc;
66
using Antlr4.Runtime.Tree;
7-
using Rubberduck.Parsing;
87
using Rubberduck.Parsing.Grammar;
98
using Rubberduck.Parsing.VBA.Parsing;
109
using Rubberduck.VBEditor;
@@ -22,11 +21,17 @@ public SelfClosingPairCompletionService(IShowIntelliSenseCommand showIntelliSens
2221

2322
public CodeString Execute(SelfClosingPair pair, CodeString original, char input)
2423
{
24+
var previousCharIsClosingChar =
25+
original.CaretPosition.StartColumn > 0 &&
26+
original.CaretLine[original.CaretPosition.StartColumn - 1] == pair.ClosingChar;
27+
var nextCharIsClosingChar =
28+
original.CaretPosition.StartColumn < original.CaretLine.Length &&
29+
original.CaretLine[original.CaretPosition.StartColumn] == pair.ClosingChar;
30+
2531
if (pair.IsSymetric && input != '\b' &&
2632
original.Code.Length >= 1 &&
27-
original.CaretPosition.StartColumn > 0 &&
28-
original.Code[original.CaretPosition.StartColumn - 1] == pair.ClosingChar
29-
|| original.IsComment || original.IsInsideStringLiteral)
33+
previousCharIsClosingChar && !nextCharIsClosingChar
34+
|| original.IsComment || (original.IsInsideStringLiteral && !nextCharIsClosingChar))
3035
{
3136
return null;
3237
}
@@ -71,11 +76,23 @@ private CodeString HandleOpeningChar(SelfClosingPair pair, CodeString original)
7176
var autoCode = new string(new[] { pair.OpeningChar, pair.ClosingChar });
7277
var lines = original.Lines;
7378
var line = lines[original.CaretPosition.StartLine];
74-
lines[original.CaretPosition.StartLine] = string.IsNullOrEmpty(original.Code)
75-
? autoCode
76-
: original.CaretPosition.StartColumn == line.Length
77-
? line + autoCode
78-
: line.Insert(original.CaretPosition.StartColumn, autoCode);
79+
80+
string newCode;
81+
if (string.IsNullOrEmpty(original.Code))
82+
{
83+
newCode = autoCode;
84+
}
85+
else if (original.CaretPosition.StartColumn < line.Length && line[original.CaretPosition.StartColumn] == pair.ClosingChar)
86+
{
87+
newCode = line;
88+
}
89+
else
90+
{
91+
newCode = original.CaretPosition.StartColumn == line.Length
92+
? line + autoCode
93+
: line.Insert(original.CaretPosition.StartColumn, autoCode);
94+
}
95+
lines[original.CaretPosition.StartLine] = newCode;
7996

8097
return new CodeString(string.Join("\r\n", lines), nextPosition, new Selection(original.SnippetPosition.StartLine, 1, original.SnippetPosition.EndLine, 1));
8198
}
@@ -281,6 +298,17 @@ private Selection FindMatchingTokenPosition(SelfClosingPair pair, CodeString ori
281298
code = code.EndsWith($"{pair.OpeningChar}{pair.ClosingChar}")
282299
? code.Substring(0, code.LastIndexOf(pair.ClosingChar) + 1)
283300
: code;
301+
302+
var leftOfCaret = original.CaretLine.Substring(0, original.CaretPosition.StartColumn + 1);
303+
var rightOfCaret = original.CaretLine.Substring(original.CaretPosition.StartColumn);
304+
305+
if (leftOfCaret.Count(c => c == pair.OpeningChar) == 1 &&
306+
rightOfCaret.Count(c => c == pair.ClosingChar) == 1)
307+
{
308+
return new Selection(original.CaretPosition.StartLine,
309+
original.CaretLine.LastIndexOf(pair.ClosingChar));
310+
}
311+
284312
var result = VBACodeStringParser.Parse(code, p => p.startRule());
285313
if (((ParserRuleContext)result.parseTree).exception != null)
286314
{

0 commit comments

Comments
 (0)