11
11
//
12
12
13
13
using System ;
14
+ using System . Linq ;
14
15
using System . Collections . Generic ;
15
16
using System . Management . Automation . Language ;
16
17
using System . Management . Automation ;
@@ -83,6 +84,30 @@ private bool IsValidManifest(Ast ast, string fileName)
83
84
return ! missingManifestRule . AnalyzeScript ( ast , fileName ) . GetEnumerator ( ) . MoveNext ( ) ;
84
85
85
86
}
87
+
88
+ /// <summary>
89
+ /// Checks if the ast contains wildcard character.
90
+ /// </summary>
91
+ /// <param name="ast"></param>
92
+ /// <returns></returns>
93
+ private bool HasWildcardInExpression ( Ast ast )
94
+ {
95
+ var strConstExprAst = ast as StringConstantExpressionAst ;
96
+ return strConstExprAst != null && WildcardPattern . ContainsWildcardCharacters ( strConstExprAst . Value ) ;
97
+ }
98
+
99
+ /// <summary>
100
+ /// Checks if the ast contains null expression.
101
+ /// </summary>
102
+ /// <param name="ast"></param>
103
+ /// <returns></returns>
104
+ private bool HasNullInExpression ( Ast ast )
105
+ {
106
+ var varExprAst = ast as VariableExpressionAst ;
107
+ return varExprAst != null
108
+ && varExprAst . VariablePath . IsUnqualified
109
+ && varExprAst . VariablePath . UserPath . Equals ( "null" , StringComparison . OrdinalIgnoreCase ) ;
110
+ }
86
111
87
112
/// <summary>
88
113
/// Checks if the *ToExport fields are explicitly set to arrays, eg. @(...), and the array entries do not contain any wildcard.
@@ -97,32 +122,41 @@ private bool HasAcceptableExportField(string key, HashtableAst hast, string scri
97
122
extent = null ;
98
123
foreach ( var pair in hast . KeyValuePairs )
99
124
{
100
- if ( key . Equals ( pair . Item1 . Extent . Text . Trim ( ) , StringComparison . OrdinalIgnoreCase ) )
125
+ var keyStrConstAst = pair . Item1 as StringConstantExpressionAst ;
126
+ if ( keyStrConstAst != null && keyStrConstAst . Value . Equals ( key , StringComparison . OrdinalIgnoreCase ) )
101
127
{
102
- // checks if the right hand side of the assignment is an array .
103
- var arrayAst = pair . Item2 . Find ( x => x is ArrayLiteralAst || x is ArrayExpressionAst , true ) ;
104
- if ( arrayAst = = null )
105
- {
106
- extent = pair . Item2 . Extent ;
128
+ // Checks for wildcard character in the entry .
129
+ var astWithWildcard = pair . Item2 . Find ( HasWildcardInExpression , false ) ;
130
+ if ( astWithWildcard ! = null )
131
+ {
132
+ extent = astWithWildcard . Extent ;
107
133
return false ;
108
- }
134
+ }
109
135
else
110
136
{
111
- //checks if any entry within the array has a wildcard.
112
- var elementWithWildcard = arrayAst . Find ( x => x is StringConstantExpressionAst
113
- && x . Extent . Text . Contains ( "*" ) , false ) ;
114
- if ( elementWithWildcard != null )
137
+ // Checks for $null in the entry.
138
+ var astWithNull = pair . Item2 . Find ( HasNullInExpression , false ) ;
139
+ if ( astWithNull != null )
115
140
{
116
- extent = elementWithWildcard . Extent ;
141
+ extent = astWithNull . Extent ;
117
142
return false ;
118
- }
119
- return true ;
143
+ }
144
+ else
145
+ {
146
+ return true ;
147
+ }
120
148
}
121
149
}
122
150
}
123
151
return true ;
124
152
}
125
153
154
+
155
+ /// <summary>
156
+ /// Gets the error string of the rule.
157
+ /// </summary>
158
+ /// <param name="field"></param>
159
+ /// <returns></returns>
126
160
public string GetError ( string field )
127
161
{
128
162
return string . Format ( CultureInfo . CurrentCulture , Strings . UseToExportFieldsInManifestError , field ) ;
0 commit comments