@@ -35,7 +35,7 @@ public IterativeVariableRename(string NewName, int StartLineNumber, int StartCol
35
35
this . StartColumnNumber = StartColumnNumber ;
36
36
this . ScriptAst = ScriptAst ;
37
37
38
- VariableExpressionAst Node = ( VariableExpressionAst ) VariableRename . GetVariableTopAssignment ( StartLineNumber , StartColumnNumber , ScriptAst ) ;
38
+ VariableExpressionAst Node = ( VariableExpressionAst ) GetVariableTopAssignment ( StartLineNumber , StartColumnNumber , ScriptAst ) ;
39
39
if ( Node != null )
40
40
{
41
41
if ( Node . Parent is ParameterAst )
@@ -70,7 +70,7 @@ public static Ast GetAstNodeByLineAndColumn(int StartLineNumber, int StartColumn
70
70
{
71
71
return ast . Extent . StartLineNumber == StartLineNumber &&
72
72
ast . Extent . StartColumnNumber == StartColumnNumber &&
73
- ast is VariableExpressionAst or CommandParameterAst ;
73
+ ast is VariableExpressionAst or CommandParameterAst or StringConstantExpressionAst ;
74
74
} , true ) ;
75
75
if ( result == null )
76
76
{
@@ -85,17 +85,40 @@ public static Ast GetVariableTopAssignment(int StartLineNumber, int StartColumnN
85
85
// Look up the target object
86
86
Ast node = GetAstNodeByLineAndColumn ( StartLineNumber , StartColumnNumber , ScriptAst ) ;
87
87
88
- string name = node is CommandParameterAst commdef
89
- ? commdef . ParameterName
90
- : node is VariableExpressionAst varDef ? varDef . VariablePath . UserPath : throw new TargetSymbolNotFoundException ( ) ;
88
+ string name = node switch
89
+ {
90
+ CommandParameterAst commdef => commdef . ParameterName ,
91
+ VariableExpressionAst varDef => varDef . VariablePath . UserPath ,
92
+ // Key within a Hashtable
93
+ StringConstantExpressionAst strExp => strExp . Value ,
94
+ _ => throw new TargetSymbolNotFoundException ( )
95
+ } ;
96
+
97
+ VariableExpressionAst splatAssignment = null ;
98
+ if ( node is StringConstantExpressionAst )
99
+ {
100
+ Ast parent = node ;
101
+ while ( parent != null )
102
+ {
103
+ if ( parent is AssignmentStatementAst assignmentStatementAst )
104
+ {
105
+ splatAssignment = ( VariableExpressionAst ) assignmentStatementAst . Left . Find ( ast => ast is VariableExpressionAst , false ) ;
91
106
92
- Ast TargetParent = GetAstParentScope ( node ) ;
107
+ break ;
108
+ }
109
+ parent = parent . Parent ;
110
+ }
111
+ }
93
112
113
+ Ast TargetParent = GetAstParentScope ( node ) ;
114
+ // Find All Variables and Parameter Assignments with the same name before
115
+ // The node found above
94
116
List < VariableExpressionAst > VariableAssignments = ScriptAst . FindAll ( ast =>
95
117
{
96
118
return ast is VariableExpressionAst VarDef &&
97
119
VarDef . Parent is AssignmentStatementAst or ParameterAst &&
98
120
VarDef . VariablePath . UserPath . ToLower ( ) == name . ToLower ( ) &&
121
+ // Look Backwards from the node above
99
122
( VarDef . Extent . EndLineNumber < node . Extent . StartLineNumber ||
100
123
( VarDef . Extent . EndColumnNumber <= node . Extent . StartColumnNumber &&
101
124
VarDef . Extent . EndLineNumber <= node . Extent . StartLineNumber ) ) ;
@@ -123,7 +146,7 @@ VarDef.Parent is AssignmentStatementAst or ParameterAst &&
123
146
CorrectDefinition = node ;
124
147
break ;
125
148
}
126
- // node is proably just a reference of an assignment statement within the global scope or higher
149
+ // node is proably just a reference to an assignment statement or Parameter within the global scope or higher
127
150
if ( node . Parent is not AssignmentStatementAst )
128
151
{
129
152
if ( null == parent || null == parent . Parent )
@@ -132,8 +155,32 @@ VarDef.Parent is AssignmentStatementAst or ParameterAst &&
132
155
CorrectDefinition = element ;
133
156
break ;
134
157
}
135
- if ( parent is FunctionDefinitionAst funcDef && node is CommandParameterAst )
158
+
159
+ if ( parent is FunctionDefinitionAst funcDef && node is CommandParameterAst or StringConstantExpressionAst )
136
160
{
161
+ if ( node is StringConstantExpressionAst )
162
+ {
163
+ List < VariableExpressionAst > SplatReferences = ScriptAst . FindAll ( ast =>
164
+ {
165
+ return ast is VariableExpressionAst varDef &&
166
+ varDef . Splatted &&
167
+ varDef . Parent is CommandAst &&
168
+ varDef . VariablePath . UserPath . ToLower ( ) == splatAssignment . VariablePath . UserPath . ToLower ( ) ;
169
+ } , true ) . Cast < VariableExpressionAst > ( ) . ToList ( ) ;
170
+
171
+ if ( SplatReferences . Count >= 1 )
172
+ {
173
+ CommandAst splatFirstRefComm = ( CommandAst ) SplatReferences . First ( ) . Parent ;
174
+ if ( funcDef . Name == splatFirstRefComm . GetCommandName ( )
175
+ && funcDef . Parent . Parent == TargetParent )
176
+ {
177
+ CorrectDefinition = element ;
178
+ break ;
179
+ }
180
+ }
181
+ }
182
+
183
+
137
184
if ( node . Parent is CommandAst commDef )
138
185
{
139
186
if ( funcDef . Name == commDef . GetCommandName ( )
0 commit comments