Advertisement
Guest User

Untitled

a guest
Aug 30th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.48 KB | None | 0 0
  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('tslint/lib/lint');
  9. var abstractRule_1 = require('tslint/lib/language/rule/abstractRule');
  10. var Rule = (function (_super) {
  11. __extends(Rule, _super);
  12. function Rule() {
  13. _super.apply(this, arguments);
  14. }
  15. Rule.prototype.apply = function (sourceFile) {
  16. return this.applyWithWalker(new Ng2InterfacesWalker(sourceFile, this.getOptions()));
  17. };
  18. Rule.metadata = {
  19. ruleName: 'ng2-intfs',
  20. type: 'typescript',
  21. description: 'Requires the class to declare Angular 2 interfaces if implements their methods',
  22. rationale: '',
  23. options: undefined,
  24. optionExamples: ['true']
  25. };
  26. return Rule;
  27. }(abstractRule_1.AbstractRule));
  28. exports.Rule = Rule;
  29. var memberDefs = {
  30. OnChanges: [{ name: 'ngOnChanges', kind: ts.SyntaxKind.MethodDeclaration }],
  31. OnInit: [{ name: 'ngOnInit', kind: ts.SyntaxKind.MethodDeclaration }],
  32. DoCheck: [{ name: 'ngDoCheck', kind: ts.SyntaxKind.MethodDeclaration }],
  33. AfterContentInit: [{ name: 'ngAfterContentInit', kind: ts.SyntaxKind.MethodDeclaration }],
  34. AfterContentChecked: [{ name: 'ngAfterContentChecked', kind: ts.SyntaxKind.MethodDeclaration }],
  35. AfterViewInit: [{ name: 'ngAfterViewInit', kind: ts.SyntaxKind.MethodDeclaration }],
  36. AfterViewChecked: [{ name: 'ngAfterViewChecked', kind: ts.SyntaxKind.MethodDeclaration }],
  37. OnDestroy: [{ name: 'ngOnDestroy', kind: ts.SyntaxKind.MethodDeclaration }]
  38. };
  39. var memberMap = new Map();
  40. Object.keys(memberDefs).forEach(function (nm) {
  41. memberDefs[nm].forEach(function (d) { return memberMap.set(d.name, {
  42. type: nm,
  43. kind: d.kind
  44. }); });
  45. });
  46. var Ng2InterfacesWalker = (function (_super) {
  47. __extends(Ng2InterfacesWalker, _super);
  48. function Ng2InterfacesWalker() {
  49. _super.apply(this, arguments);
  50. }
  51. Ng2InterfacesWalker.prototype.visitClassDeclaration = function (node) {
  52. var _this = this;
  53. var implementsClause = node.heritageClauses &&
  54. node.heritageClauses.filter(function (cl) { return cl.token === ts.SyntaxKind.ImplementsKeyword; })[0] || { types: [] };
  55. var extendsClause = node.heritageClauses &&
  56. node.heritageClauses.filter(function (cl) { return cl.token === ts.SyntaxKind.ExtendsKeyword; })[0] || { types: [] };
  57. var implementsNames = new Set(implementsClause.types.map(function (t) { return t.expression.text; }));
  58. var extendsNames = new Set(extendsClause.types.map(function (t) { return t.expression.text; }));
  59. node.members
  60. .filter(function (m) { return m.kind === ts.SyntaxKind.MethodDeclaration; })
  61. .forEach(function (m) {
  62. var meth = m;
  63. var def = memberMap.get(meth.name.text);
  64. if (def && def.kind === meth.kind) {
  65. if (!implementsNames.has(def.type)) {
  66. _this.addFailure(_this.createFailure(meth.name.pos + 4, meth.name.end - meth.name.pos, "The class " + node.name.text + " has member " + meth.name.text + ", but does not specify " + def.type + " type in implements clause"));
  67. }
  68. }
  69. });
  70. _super.prototype.visitClassDeclaration.call(this, node);
  71. };
  72. return Ng2InterfacesWalker;
  73. }(Lint.RuleWalker));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement