1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
+ using Antlr4 . Runtime ;
4
5
using Antlr4 . Runtime . Misc ;
5
6
using Microsoft . Vbe . Interop ;
6
7
using Rubberduck . Common ;
@@ -96,22 +97,31 @@ private void AdjustReferences(IEnumerable<IdentifierReference> references, Decla
96
97
{
97
98
foreach ( var reference in references . Where ( item => item . Context != method . Context ) )
98
99
{
99
- var proc = ( dynamic ) reference . Context ;
100
100
var module = reference . QualifiedModuleName . Component . CodeModule ;
101
101
VBAParser . ArgumentListContext argumentList = null ;
102
102
var callStmt = ParserRuleContextHelper . GetParent < VBAParser . CallStmtContext > ( reference . Context ) ;
103
103
if ( callStmt != null )
104
104
{
105
105
argumentList = CallStatement . GetArgumentList ( callStmt ) ;
106
106
}
107
+
108
+ if ( argumentList == null )
109
+ {
110
+ var indexExpression = ParserRuleContextHelper . GetParent < VBAParser . IndexExprContext > ( reference . Context ) ;
111
+ if ( indexExpression != null )
112
+ {
113
+ argumentList = ParserRuleContextHelper . GetChild < VBAParser . ArgumentListContext > ( indexExpression ) ;
114
+ }
115
+ }
116
+
107
117
if ( argumentList == null ) { continue ; }
108
118
RemoveCallParameter ( argumentList , module ) ;
109
119
}
110
120
}
111
121
112
122
private void RemoveCallParameter ( VBAParser . ArgumentListContext paramList , CodeModule module )
113
123
{
114
- List < string > paramNames = new List < string > ( ) ;
124
+ var paramNames = new List < string > ( ) ;
115
125
if ( paramList . positionalOrNamedArgumentList ( ) . positionalArgumentOrMissing ( ) != null )
116
126
{
117
127
paramNames . AddRange ( paramList . positionalOrNamedArgumentList ( ) . positionalArgumentOrMissing ( ) . Select ( p =>
@@ -120,10 +130,8 @@ private void RemoveCallParameter(VBAParser.ArgumentListContext paramList, CodeMo
120
130
{
121
131
return ( ( VBAParser . SpecifiedPositionalArgumentContext ) p ) . positionalArgument ( ) . GetText ( ) ;
122
132
}
123
- else
124
- {
125
- return string . Empty ;
126
- }
133
+
134
+ return string . Empty ;
127
135
} ) . ToList ( ) ) ;
128
136
}
129
137
if ( paramList . positionalOrNamedArgumentList ( ) . namedArgumentList ( ) != null )
@@ -136,48 +144,46 @@ private void RemoveCallParameter(VBAParser.ArgumentListContext paramList, CodeMo
136
144
}
137
145
var lineCount = paramList . Stop . Line - paramList . Start . Line + 1 ; // adjust for total line count
138
146
139
- var newContent = module . Lines [ paramList . Start . Line , lineCount ] . Replace ( " _" + Environment . NewLine , string . Empty ) . RemoveExtraSpacesLeavingIndentation ( ) ;
140
- var currentStringIndex = 0 ;
147
+ var newContent = module . Lines [ paramList . Start . Line , lineCount ] ;
148
+ newContent = newContent . Remove ( paramList . Start . Column , paramList . GetText ( ) . Length ) ;
141
149
142
- foreach (
143
- var param in
144
- _model . Parameters . Where ( item => item . IsRemoved && item . Index < paramNames . Count )
145
- . Select ( item => item . Declaration ) )
150
+ var savedParamNames = paramNames ;
151
+ for ( var index = _model . Parameters . Count - 1 ; index >= 0 ; index -- )
146
152
{
147
- var paramIndex = _model . Parameters . FindIndex ( item => item . Declaration . Context . GetText ( ) == param . Context . GetText ( ) ) ;
148
- if ( paramIndex >= paramNames . Count ) { return ; }
149
-
150
- do
153
+ var param = _model . Parameters [ index ] ;
154
+ if ( ! param . IsRemoved )
151
155
{
152
- var paramToRemoveName = paramNames . ElementAt ( 0 ) . Contains ( ":=" )
153
- ? paramNames . Find ( item => item . Contains ( param . IdentifierName + ":=" ) )
154
- : paramNames . ElementAt ( paramIndex ) ;
156
+ continue ;
157
+ }
155
158
156
- if ( paramToRemoveName == null || ! newContent . Contains ( paramToRemoveName ) )
159
+ if ( param . Name . Contains ( "ParamArray" ) )
160
+ {
161
+ // handle param arrays
162
+ while ( savedParamNames . Count > index )
157
163
{
158
- continue ;
164
+ savedParamNames . RemoveAt ( index ) ;
159
165
}
160
-
161
- var valueToRemove = paramToRemoveName != paramNames . Last ( )
162
- ? paramToRemoveName + ","
163
- : paramToRemoveName ;
164
-
165
- var parameterStringIndex = newContent . IndexOf ( valueToRemove , currentStringIndex , StringComparison . Ordinal ) ;
166
- if ( parameterStringIndex <= - 1 ) { continue ; }
167
-
168
- newContent = newContent . Remove ( parameterStringIndex , valueToRemove . Length ) ;
169
-
170
- currentStringIndex = parameterStringIndex ;
171
-
172
- if ( paramToRemoveName == paramNames . Last ( ) && newContent . LastIndexOf ( ',' ) != - 1 )
166
+ }
167
+ else
168
+ {
169
+ if ( index < savedParamNames . Count && ! savedParamNames [ index ] . StripStringLiterals ( ) . Contains ( ":=" ) )
170
+ {
171
+ savedParamNames . RemoveAt ( index ) ;
172
+ }
173
+ else
173
174
{
174
- newContent = newContent . Remove ( newContent . LastIndexOf ( ',' ) , 1 ) ;
175
+ var paramIndex = savedParamNames . FindIndex ( s => s . StartsWith ( param . Declaration . IdentifierName + ":=" ) ) ;
176
+ if ( paramIndex != - 1 && paramIndex < savedParamNames . Count )
177
+ {
178
+ savedParamNames . RemoveAt ( paramIndex ) ;
179
+ }
175
180
}
176
- } while ( paramIndex >= _model . Parameters . Count - 1 && ++ paramIndex < paramNames . Count &&
177
- newContent . Contains ( paramNames . ElementAt ( paramIndex ) ) ) ;
181
+ }
178
182
}
179
183
180
- module . ReplaceLine ( paramList . Start . Line , newContent ) ;
184
+ newContent = newContent . Insert ( paramList . Start . Column , string . Join ( ", " , savedParamNames ) ) ;
185
+
186
+ module . ReplaceLine ( paramList . Start . Line , newContent . Replace ( " _" + Environment . NewLine , string . Empty ) ) ;
181
187
module . DeleteLines ( paramList . Start . Line + 1 , lineCount - 1 ) ;
182
188
}
183
189
@@ -251,26 +257,6 @@ private string GetOldSignature(Declaration target)
251
257
return rewriter . GetText ( new Interval ( firstTokenIndex , lastTokenIndex ) ) ;
252
258
}
253
259
254
- private string ReplaceCommas ( string signature , int indexParamRemoved )
255
- {
256
- if ( signature . Count ( c => c == ',' ) > indexParamRemoved ) { indexParamRemoved ++ ; }
257
-
258
- for ( int i = 0 , commaCounter = 0 ; i < signature . Length && indexParamRemoved != 0 ; i ++ )
259
- {
260
- if ( signature . ElementAt ( i ) == ',' )
261
- {
262
- commaCounter ++ ;
263
- }
264
-
265
- if ( commaCounter == indexParamRemoved )
266
- {
267
- return signature . Remove ( i , 1 ) ;
268
- }
269
- }
270
-
271
- return signature ;
272
- }
273
-
274
260
private void AdjustSignatures ( )
275
261
{
276
262
var proc = ( dynamic ) _model . TargetDeclaration . Context ;
@@ -345,25 +331,17 @@ private void AdjustSignatures(Declaration declaration)
345
331
346
332
private void RemoveSignatureParameters ( Declaration target , VBAParser . ArgListContext paramList , CodeModule module )
347
333
{
348
- var paramNames = paramList . arg ( ) ;
349
-
350
- var paramsRemoved = _model . Parameters . Where ( item => item . IsRemoved ) . ToList ( ) ;
334
+ // property set/let have one more parameter than is listed in the getter parameters
335
+ var nonRemovedParamNames = paramList . arg ( ) . Where ( ( a , s ) => s >= _model . Parameters . Count || ! _model . Parameters [ s ] . IsRemoved ) . Select ( s => s . GetText ( ) ) ;
351
336
var signature = GetOldSignature ( target ) ;
337
+ signature = signature . Remove ( signature . IndexOf ( '(' ) ) ;
338
+
339
+ var asTypeText = target . AsTypeContext == null ? string . Empty : " " + target . AsTypeContext . GetText ( ) ;
340
+ signature += '(' + string . Join ( ", " , nonRemovedParamNames ) + ")" + ( asTypeText == " " ? string . Empty : asTypeText ) ;
352
341
353
- foreach ( var param in paramsRemoved )
354
- {
355
- try
356
- {
357
- signature = ReplaceCommas ( signature . Replace ( paramNames . ElementAt ( param . Index ) . GetText ( ) , string . Empty ) , _model . Parameters . FindIndex ( item => item == param ) - paramsRemoved . FindIndex ( item => item == param ) ) ;
358
- }
359
- catch ( ArgumentOutOfRangeException )
360
- {
361
- }
362
- }
363
- var lineNum = paramList . GetSelection ( ) . LineCount ;
364
-
342
+ var lineCount = paramList . GetSelection ( ) . LineCount ;
365
343
module . ReplaceLine ( paramList . Start . Line , signature . Replace ( " _" + Environment . NewLine , string . Empty ) ) ;
366
- module . DeleteLines ( paramList . Start . Line + 1 , lineNum - 1 ) ;
344
+ module . DeleteLines ( paramList . Start . Line + 1 , lineCount - 1 ) ;
367
345
}
368
346
}
369
347
}
0 commit comments