Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | 1x 1x 1x 1x 1x 1x 1x 1x 23159x 23159x 23159x 23159x 23159x 23159x 1x 11585x 11585x 11585x 11585x 11585x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 34570x 11585x 11585x 11072x 11072x 11585x 11585x 236x 236x 236x 11585x 11585x 247x 247x 247x 11585x 11585x 318x 318x 318x 68x 68x 250x 250x 318x 257x 6x 6x 6x 2x 2x 2x 2x 2x 2x 6x 257x 250x 250x 250x 11585x 11585x | import {Issue} from "../issue";
import {BasicRuleConfig} from "./_basic_rule_config";
import {IRegistry} from "../_iregistry";
import {IRule, IRuleMetadata, RuleTag} from "./_irule";
import {IObject} from "../objects/_iobject";
import {ABAPObject} from "../objects/_abap_object";
import {EditHelper} from "../edit_helper";
export class UnusedMacrosConf extends BasicRuleConfig {
/** skip specific names, case insensitive
* @uniqueItems true
*/
public skipNames?: string[] = [];
}
export class UnusedMacros implements IRule {
private conf = new UnusedMacrosConf();
private reg: IRegistry;
public getMetadata(): IRuleMetadata {
return {
key: "unused_macros",
title: "Unused macros",
shortDescription: `Checks for unused macro definitions definitions`,
tags: [RuleTag.Quickfix],
badExample: `DEFINE foobar1.
WRITE 'hello'.
END-OF-DEFINITION.`,
goodExample: `DEFINE foobar2.
WRITE 'hello'.
END-OF-DEFINITION.
foobar2.`,
};
}
public getConfig() {
return this.conf;
}
public setConfig(conf: UnusedMacrosConf) {
this.conf = conf;
if (this.conf.skipNames === undefined) {
this.conf.skipNames = [];
}
}
public initialize(reg: IRegistry) {
this.reg = reg;
return this;
}
public run(obj: IObject): Issue[] {
const result: Issue[] = [];
if (!(obj instanceof ABAPObject)) {
return [];
}
const references = this.reg.getMacroReferences();
for (const file of obj.getABAPFiles()) {
for (const macroToken of references.listDefinitionsByFile(file.getFilename())) {
const usages = references.listUsagesbyMacro(file.getFilename(), macroToken);
if (usages.length === 0 && this.conf.skipNames?.includes(macroToken.getStr().toUpperCase()) === false) {
const message = "Unused macro definition: " + macroToken.getStr();
const pos = references.getDefinitionRange(file.getFilename(), macroToken);
const fix = EditHelper.deleteRange(file, pos!.start, pos!.end);
result.push(Issue.atToken(file, macroToken, message, this.getMetadata().key, this.conf.severity, fix));
}
}
}
return result;
}
} |