From 84d689611d32f99a4a6ffcac00fcfb9c2e699962 Mon Sep 17 00:00:00 2001 From: Kapil Borle Date: Mon, 22 Feb 2016 19:54:07 -0800 Subject: [PATCH] Fixes to AvoidNullOrEmptyHelpMessageAttribute. Instead of using ast.extent property for comparing empty string or null argument we use the parsed values. --- Rules/AvoidNullOrEmptyHelpMessageAttribute.cs | 55 ++++++++++++++----- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/Rules/AvoidNullOrEmptyHelpMessageAttribute.cs b/Rules/AvoidNullOrEmptyHelpMessageAttribute.cs index 78311388b..07fd76e2d 100644 --- a/Rules/AvoidNullOrEmptyHelpMessageAttribute.cs +++ b/Rules/AvoidNullOrEmptyHelpMessageAttribute.cs @@ -38,43 +38,45 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName) foreach (FunctionDefinitionAst funcAst in functionAsts) { - if (funcAst.Body == null || funcAst.Body.ParamBlock == null - || funcAst.Body.ParamBlock.Attributes == null || funcAst.Body.ParamBlock.Parameters == null) + if (funcAst.Body == null || funcAst.Body.ParamBlock == null || funcAst.Body.ParamBlock.Parameters == null) { continue; } - foreach (var paramAst in funcAst.Body.ParamBlock.Parameters) - { - foreach (var paramAstAttribute in paramAst.Attributes) + foreach (ParameterAst paramAst in funcAst.Body.ParamBlock.Parameters) + { + if (paramAst == null) { - if (!(paramAstAttribute is AttributeAst)) + continue; + } + + foreach (AttributeBaseAst attributeAst in paramAst.Attributes) + { + var paramAttributeAst = attributeAst as AttributeAst; + if (paramAttributeAst == null) { continue; } - var namedArguments = (paramAstAttribute as AttributeAst).NamedArguments; - + var namedArguments = paramAttributeAst.NamedArguments; if (namedArguments == null) { continue; } - + foreach (NamedAttributeArgumentAst namedArgument in namedArguments) { - if (!(namedArgument.ArgumentName.Equals("HelpMessage", StringComparison.OrdinalIgnoreCase))) + if (namedArgument == null || !(namedArgument.ArgumentName.Equals("HelpMessage", StringComparison.OrdinalIgnoreCase))) { continue; } string errCondition; - if (namedArgument.ExpressionOmitted - || namedArgument.Argument.Extent.Text.Equals("\"\"") - || namedArgument.Argument.Extent.Text.Equals("\'\'")) + if (namedArgument.ExpressionOmitted || HasEmptyStringInExpression(namedArgument.Argument)) { errCondition = "empty"; } - else if (namedArgument.Argument.Extent.Text.Equals("$null", StringComparison.OrdinalIgnoreCase)) + else if (HasNullInExpression(namedArgument.Argument)) { errCondition = "null"; } @@ -82,7 +84,6 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName) { errCondition = null; } - if (!String.IsNullOrEmpty(errCondition)) { string message = string.Format(CultureInfo.CurrentCulture, @@ -102,6 +103,30 @@ public IEnumerable AnalyzeScript(Ast ast, string fileName) } } + /// + /// Checks if the given ast is an empty string. + /// + /// + /// + private bool HasEmptyStringInExpression(ExpressionAst ast) + { + var constStrAst = ast as StringConstantExpressionAst; + return constStrAst != null && constStrAst.Value.Equals(String.Empty); + } + + /// + /// Checks if the ast contains null expression. + /// + /// + /// + private bool HasNullInExpression(Ast ast) + { + var varExprAst = ast as VariableExpressionAst; + return varExprAst != null + && varExprAst.VariablePath.IsUnqualified + && varExprAst.VariablePath.UserPath.Equals("null", StringComparison.OrdinalIgnoreCase); + } + /// /// GetName: Retrieves the name of this rule. ///