@@ -38,51 +38,52 @@ public IEnumerable<DiagnosticRecord> AnalyzeScript(Ast ast, string fileName)
3838
3939 foreach ( FunctionDefinitionAst funcAst in functionAsts )
4040 {
41- if ( funcAst . Body == null || funcAst . Body . ParamBlock == null
42- || funcAst . Body . ParamBlock . Attributes == null || funcAst . Body . ParamBlock . Parameters == null )
41+ if ( funcAst . Body == null || funcAst . Body . ParamBlock == null || funcAst . Body . ParamBlock . Parameters == null )
4342 {
4443 continue ;
4544 }
4645
47- foreach ( var paramAst in funcAst . Body . ParamBlock . Parameters )
48- {
49- foreach ( var paramAstAttribute in paramAst . Attributes )
46+ foreach ( ParameterAst paramAst in funcAst . Body . ParamBlock . Parameters )
47+ {
48+ if ( paramAst == null )
5049 {
51- if ( ! ( paramAstAttribute is AttributeAst ) )
50+ continue ;
51+ }
52+
53+ foreach ( AttributeBaseAst attributeAst in paramAst . Attributes )
54+ {
55+ var paramAttributeAst = attributeAst as AttributeAst ;
56+ if ( paramAttributeAst == null )
5257 {
5358 continue ;
5459 }
5560
56- var namedArguments = ( paramAstAttribute as AttributeAst ) . NamedArguments ;
57-
61+ var namedArguments = paramAttributeAst . NamedArguments ;
5862 if ( namedArguments == null )
5963 {
6064 continue ;
6165 }
62-
66+
6367 foreach ( NamedAttributeArgumentAst namedArgument in namedArguments )
6468 {
65- if ( ! ( namedArgument . ArgumentName . Equals ( "HelpMessage" , StringComparison . OrdinalIgnoreCase ) ) )
69+ if ( namedArgument == null || ! ( namedArgument . ArgumentName . Equals ( "HelpMessage" , StringComparison . OrdinalIgnoreCase ) ) )
6670 {
6771 continue ;
6872 }
6973
7074 string errCondition ;
71- if ( namedArgument . ExpressionOmitted
72- || namedArgument . Argument . Extent . Text . Equals ( "\" \" " )
73- || namedArgument . Argument . Extent . Text . Equals ( "\' \' " ) )
75+ if ( namedArgument . ExpressionOmitted || HasEmptyStringInExpression ( namedArgument . Argument ) )
7476 {
7577 errCondition = "empty" ;
7678 }
77- else if ( namedArgument . Argument . Extent . Text . Equals ( "$null" , StringComparison . OrdinalIgnoreCase ) )
79+ else if ( HasNullInExpression ( namedArgument . Argument ) )
7880 {
7981 errCondition = "null" ;
8082 }
8183 else
8284 {
8385 errCondition = null ;
8486 }
85-
8687 if ( ! String . IsNullOrEmpty ( errCondition ) )
8788 {
8889 string message = string . Format ( CultureInfo . CurrentCulture ,
@@ -102,6 +103,30 @@ public IEnumerable<DiagnosticRecord> AnalyzeScript(Ast ast, string fileName)
102103 }
103104 }
104105
106+ /// <summary>
107+ /// Checks if the given ast is an empty string.
108+ /// </summary>
109+ /// <param name="ast"></param>
110+ /// <returns></returns>
111+ private bool HasEmptyStringInExpression ( ExpressionAst ast )
112+ {
113+ var constStrAst = ast as StringConstantExpressionAst ;
114+ return constStrAst != null && constStrAst . Value . Equals ( String . Empty ) ;
115+ }
116+
117+ /// <summary>
118+ /// Checks if the ast contains null expression.
119+ /// </summary>
120+ /// <param name="ast"></param>
121+ /// <returns></returns>
122+ private bool HasNullInExpression ( Ast ast )
123+ {
124+ var varExprAst = ast as VariableExpressionAst ;
125+ return varExprAst != null
126+ && varExprAst . VariablePath . IsUnqualified
127+ && varExprAst . VariablePath . UserPath . Equals ( "null" , StringComparison . OrdinalIgnoreCase ) ;
128+ }
129+
105130 /// <summary>
106131 /// GetName: Retrieves the name of this rule.
107132 /// </summary>
0 commit comments