PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Release 0.6/StyleFix.cs

#
C# | 262 lines | 211 code | 33 blank | 18 comment | 66 complexity | 52a1c343fbd3f20a7f18f046967969fc MD5 | raw file
  1. //-------------------------------------------------------------------------------------------------
  2. // <copyright file="StyleFix.cs" company="OfficeClip LLC">
  3. // Copyright (c) OfficeClip LLC. All rights reserved.
  4. // </copyright>
  5. //-------------------------------------------------------------------------------------------------
  6. namespace OfficeClip.OpenSource.StyleFix
  7. {
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Diagnostics;
  11. using System.IO;
  12. using System.Text;
  13. using System.Text.RegularExpressions;
  14. using StyleCop;
  15. using System.Linq;
  16. /// <summary>
  17. /// A class to fix the styles
  18. /// </summary>
  19. public class StyleFix
  20. {
  21. public static StringBuilder ViolationContent;
  22. protected string FilePath;
  23. private bool fileChanged;
  24. List<SFWorkingLine> sfWorkingLines = new List<SFWorkingLine>();
  25. public List<SAObject> Violations
  26. {
  27. get
  28. {
  29. return violations;
  30. }
  31. }
  32. List<SAObject> violations = new List<SAObject>();
  33. public StyleFix(string projectPath, string filePath)
  34. {
  35. fileChanged = false;
  36. decimal lineNumber = 0;
  37. SFWorkingLine sfWorkingLine;
  38. string input;
  39. if (File.Exists(filePath))
  40. {
  41. StreamReader sr = new StreamReader(File.OpenRead(filePath));
  42. Encoding fileEncoding = sr.CurrentEncoding;
  43. while ((input = sr.ReadLine()) != null)
  44. {
  45. lineNumber++;
  46. sfWorkingLine = new SFWorkingLine(lineNumber, input, false, new List<SAObject>());
  47. sfWorkingLines.Add(sfWorkingLine);
  48. }
  49. sr.Close();
  50. if (sfWorkingLines.Count == 0)
  51. {
  52. return;
  53. }
  54. RunStyleCop(projectPath, filePath);
  55. if (Violations.Count > 0)
  56. {
  57. FixStyleCop();
  58. }
  59. if (fileChanged)
  60. {
  61. // Write the output file
  62. using (StreamWriter sw = new StreamWriter(filePath, false, fileEncoding))
  63. {
  64. sw.Write(OutputFileContent());
  65. }
  66. }
  67. }
  68. }
  69. /// <summary>
  70. /// Outputs the content of the file.
  71. /// </summary>
  72. /// <returns>The output content</returns>
  73. public string OutputFileContent()
  74. {
  75. StringBuilder sb = new StringBuilder();
  76. foreach (SFWorkingLine workingLine in sfWorkingLines)
  77. {
  78. if (!workingLine.IsRemove)
  79. {
  80. sb.Append(workingLine.Line);
  81. sb.Append(System.Environment.NewLine);
  82. }
  83. }
  84. string outputLines = sb.ToString();
  85. (new Drivers.DocumentationRules()).SA1633_FileMustHaveHeader(Path.GetFileName(FilePath), ref outputLines);
  86. return outputLines;
  87. }
  88. public void CalculateViolations(out int total, out int corrected)
  89. {
  90. total = 0;
  91. corrected = 0;
  92. foreach (SFWorkingLine workingLine in sfWorkingLines)
  93. {
  94. total += workingLine.TotalViolationsCount;
  95. corrected += workingLine.TotalFixedViolationsCount;
  96. }
  97. }
  98. private void OnViolationEncountered(object sender, ViolationEventArgs e)
  99. {
  100. int column = 1;
  101. if (e.Location != null)
  102. column = e.Location.StartPoint.IndexOnLine;
  103. SAObject Violation = new SAObject(e.Violation.Rule.CheckId, e.LineNumber, column, e.Message, false);
  104. sfWorkingLines[e.LineNumber - 1].AddViolation(Violation);
  105. violations.Add(Violation);
  106. ViolationContent.AppendFormat(
  107. "{0}:{1}:{2}:{3} - {4}{5}",
  108. e.Violation.Rule.CheckId,
  109. e.Violation.SourceCode.Name,
  110. e.LineNumber,
  111. column,
  112. e.Message,
  113. System.Environment.NewLine);
  114. }
  115. private void RunStyleCop(string projectPath, string filePath)
  116. {
  117. FilePath = filePath;
  118. Debug.Assert(sfWorkingLines.Count > 0);
  119. ViolationContent = new StringBuilder();
  120. StyleCopConsole console = new StyleCopConsole(null, false, null, null, true);
  121. CodeProject project = new CodeProject(0, projectPath, new Configuration(null));
  122. if (console.Core.Environment.AddSourceCode(project, FilePath, null))
  123. {
  124. console.OutputGenerated += OnOutputGenerated;
  125. console.ViolationEncountered += OnViolationEncountered;
  126. console.Start(new[] { project }, true);
  127. console.ViolationEncountered -= OnViolationEncountered;
  128. console.OutputGenerated -= OnOutputGenerated;
  129. }
  130. }
  131. private void OnOutputGenerated(object sender, OutputEventArgs e)
  132. {
  133. }
  134. private void FixSpacingRules()
  135. {
  136. Drivers.SpacingRules spacingRules = new Drivers.SpacingRules();
  137. if (Violations.Any(v => v.ErrorId == "SA1000"))
  138. spacingRules.SA1000_KeywordsMustBeSpacedCorrectly(ref sfWorkingLines);
  139. if (Violations.Any(v => v.ErrorId == "SA1001"))
  140. spacingRules.SA1001_CommasMustBeSpaceCorrectly(ref sfWorkingLines);
  141. if (Violations.Any(v => v.ErrorId == "SA1002"))
  142. spacingRules.SA1002_SemicolonsMustBeSpaceCorrectly(ref sfWorkingLines);
  143. if (Violations.Any(v => v.ErrorId == "SA1003"))
  144. spacingRules.SA1003_SymbolsMustBeSpaceCorrectly(ref sfWorkingLines);
  145. if (Violations.Any(v => v.ErrorId == "SA1004"))
  146. spacingRules.SA1004_DocumentationLinesMustBeginWithSingleSpace(ref sfWorkingLines);
  147. if (Violations.Any(v => v.ErrorId == "SA1005"))
  148. spacingRules.SA1005_SingleLineCommentsMustBeginWithSingleSpace(ref sfWorkingLines);
  149. if (Violations.Any(v => v.ErrorId == "SA1009"))
  150. spacingRules.SA1009_ClosingParenthesisMustBeSpacedCorrectly(ref sfWorkingLines);
  151. if (Violations.Any(v => v.ErrorId == "SA1010"))
  152. spacingRules.SA1010_OpeningSquareBracketsMustBeSpacedCorrectly(ref sfWorkingLines);
  153. if (Violations.Any(v => v.ErrorId == "SA1012"))
  154. spacingRules.SA1012_OpeningCurlyBracketsMustBeSpacedCorrectly(ref sfWorkingLines);
  155. if (Violations.Any(v => v.ErrorId == "SA1013"))
  156. spacingRules.SA1013_ClosingCurlyBracketsMustBeSpacedCorrectly(ref sfWorkingLines);
  157. if (Violations.Any(v => v.ErrorId == "SA1027"))
  158. spacingRules.SA1027_TabsMustNotBeUsed(ref sfWorkingLines);
  159. if (spacingRules.RuleFound)
  160. fileChanged = true;
  161. }
  162. private void FixReadabilityRules()
  163. {
  164. Drivers.ReadabilityRules readibilityRules = new Drivers.ReadabilityRules();
  165. if (Violations.Any(v => v.ErrorId == "SA1101"))
  166. readibilityRules.SA1101_PrefixLocalCallsWithThis(ref sfWorkingLines);
  167. if (Violations.Any(v => v.ErrorId == "SA1115"))
  168. readibilityRules.SA1115_ParameterMustFollowComma(ref sfWorkingLines);
  169. if (Violations.Any(v => v.ErrorId == "SA1116"))
  170. readibilityRules.SA1116_SplitParametersMustStartOnLineAfterDeclaration(ref sfWorkingLines);
  171. if (Violations.Any(v => v.ErrorId == "SA1119"))
  172. readibilityRules.SA1119_StatementMustNotUseUnnecessaryParenthesis(ref sfWorkingLines);
  173. if (Violations.Any(v => v.ErrorId == "SA1120"))
  174. readibilityRules.SA1120_CommentsMustContainText(ref sfWorkingLines);
  175. if (Violations.Any(v => v.ErrorId == "SA1121"))
  176. readibilityRules.SA1121_UseBuiltInTypeAlias(ref sfWorkingLines);
  177. if (Violations.Any(v => v.ErrorId == "SA1126"))
  178. readibilityRules.SA1126_PrefixCallsCorrectly(ref sfWorkingLines);
  179. if (readibilityRules.RuleFound)
  180. fileChanged = true;
  181. }
  182. private void FixNamingRules()
  183. {
  184. //Disable Naming rules since this can cause breaking changes in code
  185. return;
  186. //TODO SA1306
  187. Drivers.NamingRules namingRules = new Drivers.NamingRules();
  188. if (Violations.Any(v => v.ErrorId == "SA1300"))
  189. namingRules.SA1300_ElementMustBeginWithUpperCaseLetter(ref sfWorkingLines);
  190. if (namingRules.RuleFound)
  191. fileChanged = true;
  192. }
  193. private void FixMaintainabilityRules()
  194. {
  195. Drivers.MaintainabilityRules layoutRules = new Drivers.MaintainabilityRules();
  196. if (Violations.Any(v => v.ErrorId == "SA1400"))
  197. layoutRules.SA1400_AccessModifierMustBeDeclared(ref sfWorkingLines);
  198. if (layoutRules.RuleFound)
  199. fileChanged = true;
  200. }
  201. private void FixLayoutRules()
  202. {
  203. Drivers.LayoutRules layoutRules = new Drivers.LayoutRules();
  204. if (Violations.Any(v => v.ErrorId == "SA1503"))
  205. layoutRules.SA1503_CurlyBracketsMustNotBeOmittedTest(ref sfWorkingLines);
  206. if (Violations.Any(v => v.ErrorId == "SA1505"))
  207. layoutRules.SA1505_AnOpeningCurlyBracketMustNotBeFollowedByABlankLine(ref sfWorkingLines);
  208. //TODO SA1508
  209. //TODO SA1512
  210. if (Violations.Any(v => v.ErrorId == "SA1513"))
  211. layoutRules.SA1513_ClosingCurlyBracketMustBeFollowedByBlankLine(ref sfWorkingLines);
  212. //TODO SA1514
  213. if (Violations.Any(v => v.ErrorId == "SA1515"))
  214. layoutRules.SA1515_SingleLineCommentMeBePreceededByABlankLine(ref sfWorkingLines);
  215. if (Violations.Any(v => v.ErrorId == "SA1516"))
  216. layoutRules.SA1516_ElementsMustBeSeparatedByBlankLine(ref sfWorkingLines);
  217. if (layoutRules.RuleFound)
  218. fileChanged = true;
  219. }
  220. private void FixStyleCop()
  221. {
  222. FixSpacingRules();
  223. FixReadabilityRules();
  224. FixNamingRules();
  225. FixLayoutRules();
  226. FixMaintainabilityRules();
  227. }
  228. }
  229. }