@@ -79,6 +79,31 @@ public IEnumerable<DiagnosticRecord> AnalyzeScript(Ast ast, string fileName)
79
79
}
80
80
}
81
81
82
+ IEnumerable < Ast > forEachStatementAsts = ast . FindAll ( testAst => testAst is ForEachStatementAst , searchNestedScriptBlocks : true ) ;
83
+ foreach ( ForEachStatementAst forEachStatementAst in forEachStatementAsts )
84
+ {
85
+ var variableExpressionAst = forEachStatementAst . Variable ;
86
+ var variableName = variableExpressionAst . VariablePath . UserPath ;
87
+ if ( _readOnlyAutomaticVariables . Contains ( variableName , StringComparer . OrdinalIgnoreCase ) )
88
+ {
89
+ yield return new DiagnosticRecord ( DiagnosticRecordHelper . FormatError ( Strings . AvoidAssignmentToReadOnlyAutomaticVariableError , variableName ) ,
90
+ variableExpressionAst . Extent , GetName ( ) , DiagnosticSeverity . Error , fileName , variableName ) ;
91
+ }
92
+
93
+ if ( _readOnlyAutomaticVariablesIntroducedInVersion6_0 . Contains ( variableName , StringComparer . OrdinalIgnoreCase ) )
94
+ {
95
+ var severity = IsPowerShellVersion6OrGreater ( ) ? DiagnosticSeverity . Error : DiagnosticSeverity . Warning ;
96
+ yield return new DiagnosticRecord ( DiagnosticRecordHelper . FormatError ( Strings . AvoidAssignmentToReadOnlyAutomaticVariableIntroducedInPowerShell6_0Error , variableName ) ,
97
+ variableExpressionAst . Extent , GetName ( ) , severity , fileName , variableName ) ;
98
+ }
99
+
100
+ if ( _writableAutomaticVariables . Contains ( variableName , StringComparer . OrdinalIgnoreCase ) )
101
+ {
102
+ yield return new DiagnosticRecord ( DiagnosticRecordHelper . FormatError ( Strings . AvoidAssignmentToWritableAutomaticVariableError , variableName ) ,
103
+ variableExpressionAst . Extent , GetName ( ) , DiagnosticSeverity . Warning , fileName , variableName ) ;
104
+ }
105
+ }
106
+
82
107
IEnumerable < Ast > parameterAsts = ast . FindAll ( testAst => testAst is ParameterAst , searchNestedScriptBlocks : true ) ;
83
108
foreach ( ParameterAst parameterAst in parameterAsts )
84
109
{
0 commit comments