UNPKG

@abaplint/core

Version:
80 lines 3.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.StaticCallViaInstance = exports.StaticCallViaInstanceConf = void 0; /* eslint-disable max-len */ const issue_1 = require("../issue"); const _abap_rule_1 = require("./_abap_rule"); const _basic_rule_config_1 = require("./_basic_rule_config"); const _irule_1 = require("./_irule"); const syntax_1 = require("../abap/5_syntax/syntax"); const _reference_1 = require("../abap/5_syntax/_reference"); const types_1 = require("../abap/types"); class StaticCallViaInstanceConf extends _basic_rule_config_1.BasicRuleConfig { constructor() { super(...arguments); /** Allow in test class includes */ this.allowInTestclassIncludes = false; } } exports.StaticCallViaInstanceConf = StaticCallViaInstanceConf; class StaticCallViaInstance extends _abap_rule_1.ABAPRule { constructor() { super(...arguments); this.conf = new StaticCallViaInstanceConf(); } getMetadata() { return { key: "static_call_via_instance", title: "Static call via instance variable", shortDescription: `Static method call via instance variable`, extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-call-static-methods-through-instance-variables`, tags: [_irule_1.RuleTag.Styleguide], }; } getConfig() { return this.conf; } setConfig(conf) { this.conf = conf; } runParsed(file, obj) { const issues = []; if (this.getConfig().allowInTestclassIncludes === true && file.getFilename().includes(".testclasses.")) { return []; } const staticMethodCalls = this.listMethodCalls(file.getFilename(), new syntax_1.SyntaxLogic(this.reg, obj).run().spaghetti.getTop()); const tokens = file.getTokens(); for (let i = 0; i < tokens.length - 1; i++) { const token = tokens[i]; if (token.getStr() !== "->") { continue; } const next = tokens[i + 1]; for (const s of staticMethodCalls) { if (s.equals(next.getStart())) { const message = "Avoid calling static method via instance"; issues.push(issue_1.Issue.atToken(file, token, message, this.getMetadata().key)); break; } } } return issues; } listMethodCalls(filename, node) { const ret = []; for (const r of node.getData().references) { if (r.referenceType !== _reference_1.ReferenceType.MethodReference || r.position.getFilename() !== filename) { continue; } if (r.resolved instanceof types_1.MethodDefinition && r.resolved.isStatic() === true) { ret.push(r.position.getStart()); } } for (const child of node.getChildren()) { ret.push(...this.listMethodCalls(filename, child)); } return ret; } } exports.StaticCallViaInstance = StaticCallViaInstance; //# sourceMappingURL=static_call_via_instance.js.map