@@ -12,18 +12,25 @@ namespace Rubberduck.AutoComplete.Service
12
12
{
13
13
public class SelfClosingPairCompletionService
14
14
{
15
+ /*
16
+ // note: this works... but the VBE makes an annoying DING! when the command isn't available.
17
+ // todo: implement our own intellisense, then uncomment this code.
15
18
private readonly IShowIntelliSenseCommand _showIntelliSense;
16
19
17
20
public SelfClosingPairCompletionService(IShowIntelliSenseCommand showIntelliSense)
18
21
{
19
22
_showIntelliSense = showIntelliSense;
20
23
}
24
+ */
21
25
22
- public CodeString Execute ( SelfClosingPair pair , CodeString original , char input )
26
+ public bool Execute ( SelfClosingPair pair , CodeString original , char input , out CodeString result )
23
27
{
28
+ result = null ;
29
+
24
30
var previousCharIsClosingChar =
25
31
original . CaretPosition . StartColumn > 0 &&
26
32
original . CaretLine [ original . CaretPosition . StartColumn - 1 ] == pair . ClosingChar ;
33
+
27
34
var nextCharIsClosingChar =
28
35
original . CaretPosition . StartColumn < original . CaretLine . Length &&
29
36
original . CaretLine [ original . CaretPosition . StartColumn ] == pair . ClosingChar ;
@@ -33,49 +40,45 @@ public CodeString Execute(SelfClosingPair pair, CodeString original, char input)
33
40
previousCharIsClosingChar && ! nextCharIsClosingChar
34
41
|| original . IsComment || ( original . IsInsideStringLiteral && ! nextCharIsClosingChar ) )
35
42
{
36
- return null ;
43
+ return false ;
37
44
}
38
45
39
46
if ( input == pair . OpeningChar )
40
47
{
41
- var result = HandleOpeningChar ( pair , original ) ;
42
- return result ;
48
+ return HandleOpeningChar ( pair , original , out result ) ;
43
49
}
44
-
50
+
45
51
if ( input == pair . ClosingChar )
46
52
{
47
- return HandleClosingChar ( pair , original ) ;
53
+ return HandleClosingChar ( pair , original , out result ) ;
48
54
}
49
55
50
56
if ( input == '\b ' )
51
57
{
52
- return Execute ( pair , original , Keys . Back ) ;
58
+ return Execute ( pair , original , Keys . Back , out result ) ;
53
59
}
54
60
55
- return null ;
61
+ return false ;
56
62
}
57
63
58
- public CodeString Execute ( SelfClosingPair pair , CodeString original , Keys input )
64
+ public bool Execute ( SelfClosingPair pair , CodeString original , Keys input , out CodeString result )
59
65
{
66
+ result = null ;
60
67
if ( original . IsComment )
61
68
{
62
- return null ;
69
+ // not handling backspace in comments
70
+ return false ;
63
71
}
64
72
65
- if ( input == Keys . Back )
66
- {
67
- return HandleBackspace ( pair , original ) ;
68
- }
69
-
70
- return null ;
73
+ return input == Keys . Back && HandleBackspace ( pair , original , out result ) ;
71
74
}
72
75
73
- private CodeString HandleOpeningChar ( SelfClosingPair pair , CodeString original )
76
+ private bool HandleOpeningChar ( SelfClosingPair pair , CodeString original , out CodeString result )
74
77
{
75
78
var nextPosition = original . CaretPosition . ShiftRight ( ) ;
76
79
var autoCode = new string ( new [ ] { pair . OpeningChar , pair . ClosingChar } ) ;
77
80
var lines = original . Lines ;
78
- var line = lines [ original . CaretPosition . StartLine ] ;
81
+ var line = original . CaretLine ;
79
82
80
83
string newCode ;
81
84
if ( string . IsNullOrEmpty ( line ) )
@@ -94,14 +97,17 @@ private CodeString HandleOpeningChar(SelfClosingPair pair, CodeString original)
94
97
}
95
98
lines [ original . CaretPosition . StartLine ] = newCode ;
96
99
97
- return new CodeString ( string . Join ( "\r \n " , lines ) , nextPosition , new Selection ( original . SnippetPosition . StartLine , 1 , original . SnippetPosition . EndLine , 1 ) ) ;
100
+ result = new CodeString ( string . Join ( "\r \n " , lines ) , nextPosition , new Selection ( original . SnippetPosition . StartLine , 1 , original . SnippetPosition . EndLine , 1 ) ) ;
101
+ return true ;
98
102
}
99
103
100
- private CodeString HandleClosingChar ( SelfClosingPair pair , CodeString original )
104
+ private bool HandleClosingChar ( SelfClosingPair pair , CodeString original , out CodeString result )
101
105
{
106
+ result = null ;
102
107
if ( pair . IsSymetric )
103
108
{
104
- return null ;
109
+ // a symetric pair would have already been handled with the opening character.
110
+ return false ;
105
111
}
106
112
107
113
var nextIsClosingChar = original . CaretLine . Length > original . CaretCharIndex &&
@@ -111,26 +117,24 @@ private CodeString HandleClosingChar(SelfClosingPair pair, CodeString original)
111
117
var nextPosition = original . CaretPosition . ShiftRight ( ) ;
112
118
var newCode = original . Code ;
113
119
114
- return new CodeString ( newCode , nextPosition , new Selection ( original . SnippetPosition . StartLine , 1 , original . SnippetPosition . EndLine , 1 ) ) ;
120
+ result = new CodeString ( newCode , nextPosition , new Selection ( original . SnippetPosition . StartLine , 1 , original . SnippetPosition . EndLine , 1 ) ) ;
121
+ return true ;
115
122
}
116
- return null ;
117
- }
118
123
119
- private CodeString HandleBackspace ( SelfClosingPair pair , CodeString original )
120
- {
121
- return DeleteMatchingTokens ( pair , original ) ;
124
+ return false ;
122
125
}
123
126
124
- private CodeString DeleteMatchingTokens ( SelfClosingPair pair , CodeString original )
127
+ private bool HandleBackspace ( SelfClosingPair pair , CodeString original , out CodeString result )
125
128
{
129
+ result = null ;
126
130
var position = original . CaretPosition ;
127
131
var lines = original . Lines ;
128
132
129
133
var line = lines [ original . CaretPosition . StartLine ] ;
130
134
if ( line . Length == 0 )
131
135
{
132
136
// nothing to delete at caret position... bail out.
133
- return null ;
137
+ return false ;
134
138
}
135
139
136
140
var previous = Math . Max ( 0 , position . StartColumn - 1 ) ;
@@ -146,24 +150,25 @@ private CodeString DeleteMatchingTokens(SelfClosingPair pair, CodeString origina
146
150
if ( line . Length == 2 )
147
151
{
148
152
// entire line consists in the self-closing pair itself.
149
- return new CodeString ( string . Empty , default , Selection . Empty . ShiftRight ( ) ) ;
153
+ result = new CodeString ( string . Empty , default , Selection . Empty . ShiftRight ( ) ) ;
150
154
}
151
155
152
156
// simple case; caret is between the opening and closing chars - remove both.
153
157
lines [ original . CaretPosition . StartLine ] = line . Remove ( previous , 2 ) ;
154
- return new CodeString ( string . Join ( "\r \n " , lines ) , original . CaretPosition . ShiftLeft ( ) , original . SnippetPosition ) ;
158
+ result = new CodeString ( string . Join ( "\r \n " , lines ) , original . CaretPosition . ShiftLeft ( ) , original . SnippetPosition ) ;
155
159
}
156
160
157
161
if ( previous < line . Length - 1 && previousChar == pair . OpeningChar )
158
162
{
159
- return DeleteMatchingTokensMultiline ( pair , original ) ;
163
+ return DeleteMatchingTokensMultiline ( pair , original , out result ) ;
160
164
}
161
165
162
- return null ;
166
+ return result != null ;
163
167
}
164
168
165
- private CodeString DeleteMatchingTokensMultiline ( SelfClosingPair pair , CodeString original )
169
+ private bool DeleteMatchingTokensMultiline ( SelfClosingPair pair , CodeString original , out CodeString result )
166
170
{
171
+ result = null ;
167
172
var position = original . CaretPosition ;
168
173
var lines = original . Lines ;
169
174
var line = lines [ original . CaretPosition . StartLine ] ;
@@ -177,7 +182,7 @@ private CodeString DeleteMatchingTokensMultiline(SelfClosingPair pair, CodeStrin
177
182
if ( closingTokenPosition == default )
178
183
{
179
184
// could not locate the closing token... bail out.
180
- return null ;
185
+ return false ;
181
186
}
182
187
183
188
var closingLine = lines [ closingTokenPosition . EndLine ] . Remove ( closingTokenPosition . StartColumn , 1 ) ;
@@ -243,8 +248,9 @@ private CodeString DeleteMatchingTokensMultiline(SelfClosingPair pair, CodeStrin
243
248
// remove any dangling empty lines...
244
249
lines = lines . Where ( ( x , i ) => i <= position . StartLine || ! string . IsNullOrWhiteSpace ( x ) ) . ToArray ( ) ;
245
250
246
- return new CodeString ( string . Join ( "\r \n " , lines ) , finalCaretPosition ,
251
+ result = new CodeString ( string . Join ( "\r \n " , lines ) , finalCaretPosition ,
247
252
new Selection ( original . SnippetPosition . StartLine , 1 , original . SnippetPosition . EndLine , 1 ) ) ;
253
+ return true ;
248
254
}
249
255
250
256
private static Selection HandleBackspaceContinuations ( string [ ] nonEmptyLines , Selection finalCaretPosition )
0 commit comments