@abaplint/core
Version:
abaplint - Core API
80 lines • 3.2 kB
JavaScript
;
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