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 22627x 22627x 22627x 22627x 22627x 22627x 1x 11319x 11319x 11319x 11319x 11319x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 33772x 11319x 11319x 10814x 10814x 11319x 11319x 232x 232x 232x 11319x 11319x 243x 243x 243x 11319x 11319x 312x 312x 312x 66x 66x 246x 246x 312x 253x 6x 6x 6x 2x 2x 2x 2x 2x 2x 6x 253x 246x 246x 246x 11319x 11319x | 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;
}
} |