noUnusedExpressionRule.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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 Lint = require("../lint");
  8. var ts = require("typescript");
  9. var Rule = (function (_super) {
  10. __extends(Rule, _super);
  11. function Rule() {
  12. _super.apply(this, arguments);
  13. }
  14. Rule.prototype.apply = function (sourceFile) {
  15. return this.applyWithWalker(new NoUnusedExpressionWalker(sourceFile, this.getOptions()));
  16. };
  17. Rule.FAILURE_STRING = "expected an assignment or function call";
  18. return Rule;
  19. }(Lint.Rules.AbstractRule));
  20. exports.Rule = Rule;
  21. var NoUnusedExpressionWalker = (function (_super) {
  22. __extends(NoUnusedExpressionWalker, _super);
  23. function NoUnusedExpressionWalker(sourceFile, options) {
  24. _super.call(this, sourceFile, options);
  25. this.expressionIsUnused = true;
  26. }
  27. NoUnusedExpressionWalker.prototype.visitExpressionStatement = function (node) {
  28. this.expressionIsUnused = true;
  29. _super.prototype.visitExpressionStatement.call(this, node);
  30. if (this.expressionIsUnused) {
  31. if (node.expression.kind === ts.SyntaxKind.StringLiteral) {
  32. var expressionText = node.expression.getText();
  33. if (expressionText === "\"use strict\"" || expressionText === "'use strict'") {
  34. return;
  35. }
  36. }
  37. else if (node.expression.kind === ts.SyntaxKind.DeleteExpression || node.expression.kind === ts.SyntaxKind.YieldExpression) {
  38. return;
  39. }
  40. this.addFailure(this.createFailure(node.getStart(), node.getWidth(), Rule.FAILURE_STRING));
  41. }
  42. };
  43. NoUnusedExpressionWalker.prototype.visitBinaryExpression = function (node) {
  44. _super.prototype.visitBinaryExpression.call(this, node);
  45. switch (node.operatorToken.kind) {
  46. case ts.SyntaxKind.EqualsToken:
  47. case ts.SyntaxKind.PlusEqualsToken:
  48. case ts.SyntaxKind.MinusEqualsToken:
  49. case ts.SyntaxKind.AsteriskEqualsToken:
  50. case ts.SyntaxKind.SlashEqualsToken:
  51. case ts.SyntaxKind.PercentEqualsToken:
  52. case ts.SyntaxKind.AmpersandEqualsToken:
  53. case ts.SyntaxKind.CaretEqualsToken:
  54. case ts.SyntaxKind.BarEqualsToken:
  55. case ts.SyntaxKind.LessThanLessThanEqualsToken:
  56. case ts.SyntaxKind.GreaterThanGreaterThanEqualsToken:
  57. case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:
  58. this.expressionIsUnused = false;
  59. break;
  60. default:
  61. this.expressionIsUnused = true;
  62. }
  63. };
  64. NoUnusedExpressionWalker.prototype.visitPrefixUnaryExpression = function (node) {
  65. _super.prototype.visitPrefixUnaryExpression.call(this, node);
  66. switch (node.operator) {
  67. case ts.SyntaxKind.PlusPlusToken:
  68. case ts.SyntaxKind.MinusMinusToken:
  69. this.expressionIsUnused = false;
  70. break;
  71. default:
  72. this.expressionIsUnused = true;
  73. }
  74. };
  75. NoUnusedExpressionWalker.prototype.visitPostfixUnaryExpression = function (node) {
  76. _super.prototype.visitPostfixUnaryExpression.call(this, node);
  77. this.expressionIsUnused = false;
  78. };
  79. NoUnusedExpressionWalker.prototype.visitBlock = function (node) {
  80. _super.prototype.visitBlock.call(this, node);
  81. this.expressionIsUnused = true;
  82. };
  83. NoUnusedExpressionWalker.prototype.visitArrowFunction = function (node) {
  84. _super.prototype.visitArrowFunction.call(this, node);
  85. this.expressionIsUnused = true;
  86. };
  87. NoUnusedExpressionWalker.prototype.visitCallExpression = function (node) {
  88. _super.prototype.visitCallExpression.call(this, node);
  89. this.expressionIsUnused = false;
  90. };
  91. NoUnusedExpressionWalker.prototype.visitConditionalExpression = function (node) {
  92. this.visitNode(node.condition);
  93. this.expressionIsUnused = true;
  94. this.visitNode(node.whenTrue);
  95. var firstExpressionIsUnused = this.expressionIsUnused;
  96. this.expressionIsUnused = true;
  97. this.visitNode(node.whenFalse);
  98. var secondExpressionIsUnused = this.expressionIsUnused;
  99. this.expressionIsUnused = firstExpressionIsUnused || secondExpressionIsUnused;
  100. };
  101. return NoUnusedExpressionWalker;
  102. }(Lint.RuleWalker));