Skip to content

Commit 84d6896

Browse files
author
Kapil Borle
committed
Fixes to AvoidNullOrEmptyHelpMessageAttribute.
Instead of using ast.extent property for comparing empty string or null argument we use the parsed values.
1 parent e74ea46 commit 84d6896

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

Rules/AvoidNullOrEmptyHelpMessageAttribute.cs

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)