4
4
using Antlr4 . Runtime ;
5
5
using Antlr4 . Runtime . Misc ;
6
6
using Antlr4 . Runtime . Tree ;
7
- using Rubberduck . Parsing ;
8
7
using Rubberduck . Parsing . Grammar ;
9
8
using Rubberduck . Parsing . VBA . Parsing ;
10
9
using Rubberduck . VBEditor ;
@@ -22,11 +21,17 @@ public SelfClosingPairCompletionService(IShowIntelliSenseCommand showIntelliSens
22
21
23
22
public CodeString Execute ( SelfClosingPair pair , CodeString original , char input )
24
23
{
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
+
25
31
if ( pair . IsSymetric && input != '\b ' &&
26
32
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 ) )
30
35
{
31
36
return null ;
32
37
}
@@ -71,11 +76,23 @@ private CodeString HandleOpeningChar(SelfClosingPair pair, CodeString original)
71
76
var autoCode = new string ( new [ ] { pair . OpeningChar , pair . ClosingChar } ) ;
72
77
var lines = original . Lines ;
73
78
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 ;
79
96
80
97
return new CodeString ( string . Join ( "\r \n " , lines ) , nextPosition , new Selection ( original . SnippetPosition . StartLine , 1 , original . SnippetPosition . EndLine , 1 ) ) ;
81
98
}
@@ -281,6 +298,17 @@ private Selection FindMatchingTokenPosition(SelfClosingPair pair, CodeString ori
281
298
code = code . EndsWith ( $ "{ pair . OpeningChar } { pair . ClosingChar } ")
282
299
? code . Substring ( 0 , code . LastIndexOf ( pair . ClosingChar ) + 1 )
283
300
: 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
+
284
312
var result = VBACodeStringParser . Parse ( code , p => p . startRule ( ) ) ;
285
313
if ( ( ( ParserRuleContext ) result . parseTree ) . exception != null )
286
314
{
0 commit comments