/Neznayka/VariableNamingRules/ParameterNameLengthRule.cs

http://neznayka.codeplex.com · C# · 82 lines · 60 code · 10 blank · 12 comment · 2 complexity · 7035ec6f4f761f7062bbbfb72a47357b MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Globalization;
  5. using Microsoft.Data.Schema.Extensibility;
  6. using Microsoft.Data.Schema.SchemaModel;
  7. using Microsoft.Data.Schema.ScriptDom.Sql;
  8. using Microsoft.Data.Schema.Sql.SchemaModel;
  9. using Microsoft.Data.Schema.Sql;
  10. using Microsoft.Data.Schema.StaticCodeAnalysis;
  11. using System.IO;
  12. using System.Text.RegularExpressions;
  13. using System.Linq;
  14. namespace Neznayka
  15. {
  16. /// <summary>
  17. /// This is a SQL rule which returns a warning message
  18. /// whenever it finds a parameter name that is too short.
  19. /// </summary>
  20. [DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))]
  21. [DataRuleAttribute(
  22. NeznaykaConstants.NameSpace,
  23. NeznaykaConstants.ParameterNameLengthRuleId,
  24. NeznaykaConstants.ResourceBaseName,
  25. NeznaykaConstants.ParameterNameLength_RuleName,
  26. NeznaykaConstants.CategoryVariableNaming,
  27. DescriptionResourceId = NeznaykaConstants.ParameterNameLength_ProblemDescription)]
  28. [SupportedElementType(typeof(ISqlFunction))]
  29. [SupportedElementType(typeof(ISqlTableValuedFunction))]
  30. [SupportedElementType(typeof(ISqlMultiStatementTableValuedFunction))]
  31. [SupportedElementType(typeof(ISqlProcedure))]
  32. public class ParameterNameLengthRule : StaticCodeAnalysisRule
  33. {
  34. #region Overrides
  35. /// <summary>
  36. /// Analyze the model element
  37. /// </summary>
  38. public override IList<DataRuleProblem> Analyze(DataRuleSetting ruleSetting, DataRuleExecutionContext context)
  39. {
  40. // (Re)-Load Environment settings
  41. List<DataRuleProblem> problems;
  42. SqlSchemaModel sqlSchemaModel;
  43. ISqlModelElement sqlElement;
  44. TSqlFragment sqlFragment;
  45. DMVRuleSetup.RuleSetup(context, out problems, out sqlSchemaModel, out sqlElement, out sqlFragment);
  46. // visitor to get the declarations of parameters
  47. ParameterDeclarationVisitor parameterDeclarationVisitor = new ParameterDeclarationVisitor();
  48. sqlFragment.Accept(parameterDeclarationVisitor);
  49. IEnumerable<ProcedureParameter> parameterDeclarations = parameterDeclarationVisitor.ParameterDeclarations;
  50. // Create problems for non builtin int variable found with a short name
  51. foreach (ProcedureParameter parameterDeclaration in parameterDeclarations)
  52. {
  53. //ExcludedVariableTypesForNameLengthRuleReadOnlyCollection
  54. //MinimumVariableNameLength
  55. string typeRegex = @"(?i:^(" + String.Join(@"|", DMVSettings.ExcludedParameterTypesForNameLengthRule) + @")$)";
  56. string typename = parameterDeclaration.DataType.Name.Identifiers[0].Value.ToLower();
  57. if (!Regex.IsMatch(typename, typeRegex, RegexOptions.None)
  58. && parameterDeclaration.Name.Value.Length <= DMVSettings.MinimumParameterNameLength // name includes leading @
  59. )
  60. {
  61. DataRuleProblem problem = new DataRuleProblem(this,
  62. String.Format(CultureInfo.CurrentCulture, this.RuleProperties.Description, SqlRuleUtils.GetElementName(sqlSchemaModel, sqlElement)),
  63. sqlElement);
  64. SqlRuleUtils.UpdateProblemPosition(problem, parameterDeclaration.StartOffset, parameterDeclaration.FragmentLength);
  65. problems.Add(problem);
  66. }
  67. }
  68. return problems;
  69. }
  70. #endregion
  71. }
  72. }