commentFormatRule.js 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. "use strict";
  2. var __extends = (this && this.__extends) || function (d, b) {
  3. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  4. function __() { this.constructor = d; }
  5. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  6. };
  7. var ts = require("typescript");
  8. var Lint = require("../lint");
  9. var OPTION_SPACE = "check-space";
  10. var OPTION_LOWERCASE = "check-lowercase";
  11. var OPTION_UPPERCASE = "check-uppercase";
  12. var Rule = (function (_super) {
  13. __extends(Rule, _super);
  14. function Rule() {
  15. _super.apply(this, arguments);
  16. }
  17. Rule.prototype.apply = function (sourceFile) {
  18. return this.applyWithWalker(new CommentWalker(sourceFile, this.getOptions()));
  19. };
  20. Rule.LOWERCASE_FAILURE = "comment must start with lowercase letter";
  21. Rule.UPPERCASE_FAILURE = "comment must start with uppercase letter";
  22. Rule.LEADING_SPACE_FAILURE = "comment must start with a space";
  23. return Rule;
  24. }(Lint.Rules.AbstractRule));
  25. exports.Rule = Rule;
  26. var CommentWalker = (function (_super) {
  27. __extends(CommentWalker, _super);
  28. function CommentWalker() {
  29. _super.apply(this, arguments);
  30. }
  31. CommentWalker.prototype.visitSourceFile = function (node) {
  32. var _this = this;
  33. _super.prototype.visitSourceFile.call(this, node);
  34. Lint.scanAllTokens(ts.createScanner(ts.ScriptTarget.ES5, false, ts.LanguageVariant.Standard, node.text), function (scanner) {
  35. var startPos = scanner.getStartPos();
  36. if (_this.tokensToSkipStartEndMap[startPos] != null) {
  37. scanner.setTextPos(_this.tokensToSkipStartEndMap[startPos]);
  38. return;
  39. }
  40. if (scanner.getToken() === ts.SyntaxKind.SingleLineCommentTrivia) {
  41. var commentText = scanner.getTokenText();
  42. var startPosition = scanner.getTokenPos() + 2;
  43. var width = commentText.length - 2;
  44. if (_this.hasOption(OPTION_SPACE)) {
  45. if (!startsWithSpace(commentText)) {
  46. var leadingSpaceFailure = _this.createFailure(startPosition, width, Rule.LEADING_SPACE_FAILURE);
  47. _this.addFailure(leadingSpaceFailure);
  48. }
  49. }
  50. if (_this.hasOption(OPTION_LOWERCASE)) {
  51. if (!startsWithLowercase(commentText)) {
  52. var lowercaseFailure = _this.createFailure(startPosition, width, Rule.LOWERCASE_FAILURE);
  53. _this.addFailure(lowercaseFailure);
  54. }
  55. }
  56. if (_this.hasOption(OPTION_UPPERCASE)) {
  57. if (!startsWithUppercase(commentText)) {
  58. var uppercaseFailure = _this.createFailure(startPosition, width, Rule.UPPERCASE_FAILURE);
  59. _this.addFailure(uppercaseFailure);
  60. }
  61. }
  62. }
  63. });
  64. };
  65. return CommentWalker;
  66. }(Lint.SkippableTokenAwareRuleWalker));
  67. function startsWith(commentText, changeCase) {
  68. if (commentText.length <= 2) {
  69. return true;
  70. }
  71. var firstCharacterMatch = commentText.match(/^\/\/\s*(\w)/);
  72. if (firstCharacterMatch != null) {
  73. var firstCharacter = firstCharacterMatch[1];
  74. return firstCharacter === changeCase(firstCharacter);
  75. }
  76. else {
  77. return true;
  78. }
  79. }
  80. function startsWithLowercase(commentText) {
  81. return startsWith(commentText, function (c) { return c.toLowerCase(); });
  82. }
  83. function startsWithUppercase(commentText) {
  84. return startsWith(commentText, function (c) { return c.toUpperCase(); });
  85. }
  86. function startsWithSpace(commentText) {
  87. if (commentText.length <= 2) {
  88. return true;
  89. }
  90. if ((/^#(end)?region/).test(commentText.substring(2))) {
  91. return true;
  92. }
  93. var firstCharacter = commentText.charAt(2);
  94. return firstCharacter === " " || firstCharacter === "/";
  95. }