@@ -116,7 +116,7 @@ private class SyntaxCompatibilityVisitor : AstVisitor
116
116
private static readonly IEnumerable < string > s_invokeCommandCmdletNamesAndAliases =
117
117
Helper . Instance . CmdletNameAndAliases ( "Invoke-Command" ) ;
118
118
119
- private readonly Dictionary < string , Dictionary < string , VariableExpressionAst > > _varsDeclaredPerSession ;
119
+ private readonly Dictionary < string , HashSet < string > > _varsDeclaredPerSession ;
120
120
121
121
private readonly List < DiagnosticRecord > _diagnosticAccumulator ;
122
122
@@ -127,7 +127,7 @@ private class SyntaxCompatibilityVisitor : AstVisitor
127
127
public SyntaxCompatibilityVisitor ( UseUsingScopeModifierInNewRunspaces rule , string analyzedScriptPath )
128
128
{
129
129
_diagnosticAccumulator = new List < DiagnosticRecord > ( ) ;
130
- _varsDeclaredPerSession = new Dictionary < string , Dictionary < string , VariableExpressionAst > > ( ) ;
130
+ _varsDeclaredPerSession = new Dictionary < string , HashSet < string > > ( ) ;
131
131
_rule = rule ;
132
132
_analyzedFilePath = analyzedScriptPath ;
133
133
}
@@ -183,15 +183,15 @@ public override AstVisitAction VisitScriptBlockExpression(ScriptBlockExpressionA
183
183
return AstVisitAction . Continue ;
184
184
}
185
185
186
- IReadOnlyDictionary < string , VariableExpressionAst > varsInLocalAssignments = FindVarsInAssignmentAsts ( scriptBlockExpressionAst ) ;
186
+ HashSet < string > varsInLocalAssignments = FindVarsInAssignmentAsts ( scriptBlockExpressionAst ) ;
187
187
if ( varsInLocalAssignments != null )
188
188
{
189
189
AddAssignedVarsToSession ( sessionName , varsInLocalAssignments ) ;
190
190
}
191
191
192
192
GenerateDiagnosticRecords (
193
193
FindNonAssignedNonUsingVarAsts (
194
- scriptBlockExpressionAst ,
194
+ scriptBlockExpressionAst ,
195
195
GetAssignedVarsInSession ( sessionName ) ) ) ;
196
196
197
197
return AstVisitAction . SkipChildren ;
@@ -205,10 +205,10 @@ public override AstVisitAction VisitScriptBlockExpression(ScriptBlockExpressionA
205
205
/// Example: `$foo = "foo"` ==> the VariableExpressionAst for $foo is returned
206
206
/// </summary>
207
207
/// <param name="ast"></param>
208
- private static IReadOnlyDictionary < string , VariableExpressionAst > FindVarsInAssignmentAsts ( Ast ast )
208
+ private static HashSet < string > FindVarsInAssignmentAsts ( Ast ast )
209
209
{
210
- Dictionary < string , VariableExpressionAst > variableDictionary =
211
- new Dictionary < string , VariableExpressionAst > ( ) ;
210
+ HashSet < string > variableDictionary =
211
+ new HashSet < string > ( ) ;
212
212
213
213
// Find all variables that are assigned within this ast
214
214
foreach ( AssignmentStatementAst statementAst in ast . FindAll ( IsAssignmentStatementAst , true ) )
@@ -217,11 +217,11 @@ private static IReadOnlyDictionary<string, VariableExpressionAst> FindVarsInAssi
217
217
{
218
218
string variableName = string . Format ( variable . VariablePath . UserPath ,
219
219
StringComparer . OrdinalIgnoreCase ) ;
220
- variableDictionary . Add ( variableName , variable ) ;
220
+ variableDictionary . Add ( variableName ) ;
221
221
}
222
222
} ;
223
223
224
- return new ReadOnlyDictionary < string , VariableExpressionAst > ( variableDictionary ) ;
224
+ return variableDictionary ;
225
225
}
226
226
227
227
/// <summary>
@@ -264,14 +264,14 @@ private static bool IsAssignmentStatementAst(Ast ast)
264
264
/// <param name="ast"></param>
265
265
/// <param name="varsInAssignments"></param>
266
266
private static IEnumerable < VariableExpressionAst > FindNonAssignedNonUsingVarAsts (
267
- Ast ast , IReadOnlyDictionary < string , VariableExpressionAst > varsInAssignments )
267
+ Ast ast , HashSet < string > varsInAssignments )
268
268
{
269
269
// Find all variables that are not locally assigned, and don't have $using: scope modifier
270
270
foreach ( VariableExpressionAst variable in ast . FindAll ( IsNonUsingNonSpecialVariableExpressionAst , true ) )
271
271
{
272
272
var varName = string . Format ( variable . VariablePath . UserPath , StringComparer . OrdinalIgnoreCase ) ;
273
273
274
- if ( varsInAssignments . ContainsKey ( varName ) )
274
+ if ( varsInAssignments . Contains ( varName ) )
275
275
{
276
276
yield break ;
277
277
}
@@ -368,7 +368,7 @@ private static bool TryGetSessionNameFromInvokeCommand(CommandAst invokeCommandA
368
368
/// GetAssignedVarsInSession: Retrieves all previously declared vars for a given session (as in Invoke-Command -Session $session).
369
369
/// </summary>
370
370
/// <param name="sessionName"></param>
371
- private IReadOnlyDictionary < string , VariableExpressionAst > GetAssignedVarsInSession ( string sessionName )
371
+ private HashSet < string > GetAssignedVarsInSession ( string sessionName )
372
372
{
373
373
return _varsDeclaredPerSession [ sessionName ] ;
374
374
}
@@ -378,16 +378,19 @@ private IReadOnlyDictionary<string,VariableExpressionAst> GetAssignedVarsInSessi
378
378
/// </summary>
379
379
/// <param name="sessionName"></param>
380
380
/// <param name="variablesToAdd"></param>
381
- private void AddAssignedVarsToSession ( string sessionName , IReadOnlyDictionary < string , VariableExpressionAst > variablesToAdd )
381
+ private void AddAssignedVarsToSession ( string sessionName , HashSet < string > variablesToAdd )
382
382
{
383
383
if ( ! _varsDeclaredPerSession . ContainsKey ( sessionName ) )
384
384
{
385
- _varsDeclaredPerSession . Add ( sessionName , new Dictionary < string , VariableExpressionAst > ( ) ) ;
385
+ _varsDeclaredPerSession . Add ( sessionName , new HashSet < string > ( ) ) ;
386
386
}
387
387
388
388
foreach ( var item in variablesToAdd )
389
389
{
390
- _varsDeclaredPerSession [ sessionName ] . Add ( item . Key , item . Value ) ;
390
+ if ( ! _varsDeclaredPerSession [ sessionName ] . Contains ( item ) )
391
+ {
392
+ _varsDeclaredPerSession [ sessionName ] . Add ( item ) ;
393
+ }
391
394
}
392
395
}
393
396
0 commit comments