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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11093x 11093x 11093x 11093x 11093x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 33127x 11093x 11093x 10575x 10575x 11093x 11093x 244x 244x 11093x 11093x 270x 270x 270x 89x 89x 181x 181x 270x 10x 10x 171x 171x 171x 270x 390x 12x 2x 2x 12x 12x 12x 390x 156x 156x 156x 114x 114x 42x 378x 222x 1x 1x 222x 222x 222x 222x 390x 171x 270x 4x 4x 171x 171x 171x 11093x 11093x | import {Issue} from "../issue";
import {ABAPRule} from "./_abap_rule";
import {BasicRuleConfig} from "./_basic_rule_config";
import * as Structures from "../abap/3_structures/structures";
import {IRuleMetadata, RuleTag} from "./_irule";
import {ABAPFile} from "../abap/abap_file";
import {ABAPObject} from "../objects/_abap_object";
import {Program} from "../objects";
import {StatementNode, StructureNode} from "../abap/nodes";
import {DECLARATION_STUFF, SELECTION_EVENTS} from "../stuff";
export class EmptyEventConf extends BasicRuleConfig {
}
export class EmptyEvent extends ABAPRule {
private conf = new EmptyEventConf();
public getMetadata(): IRuleMetadata {
return {
key: "empty_event",
title: "Empty selection screen or list processing event block",
shortDescription: `Empty selection screen or list processing event block`,
extendedInformation: ``,
tags: [RuleTag.SingleFile],
badExample: `
INITIALIZATION.
WRITE 'hello'.
END-OF-SELECTION.`,
goodExample: `
START-OF-SELECTION.
PERFORM sdf.
COMMIT WORK.`,
};
}
public getConfig() {
return this.conf;
}
public setConfig(conf: EmptyEventConf) {
this.conf = conf;
}
public runParsed(file: ABAPFile, obj: ABAPObject) {
const issues: Issue[] = [];
if (!(obj instanceof Program) || obj.isInclude()) {
return issues;
}
const stru = file.getStructure();
if (stru === undefined) {
return [];
}
let currentEvent: StatementNode | undefined = undefined;
let children: (StatementNode | StructureNode)[] = [];
for (const s of stru.getChildren() || []) {
if (SELECTION_EVENTS.some(f => s.get() instanceof f)) {
if (currentEvent !== undefined && children.length === 0) {
issues.push(Issue.atStatement(file, currentEvent, "Empty event", this.getMetadata().key, this.getConfig().severity));
}
children = [];
currentEvent = s as StatementNode;
} else if (s.get() instanceof Structures.Normal) {
const stru = s as StructureNode;
// ignore declaration stuff
if (DECLARATION_STUFF.some(d => stru.getFirstStatement()?.get() instanceof d)) {
continue;
}
children.push(s);
} else {
if (currentEvent !== undefined && children.length === 0) {
issues.push(Issue.atStatement(file, currentEvent, "Empty event", this.getMetadata().key, this.getConfig().severity));
}
children = [];
currentEvent = undefined;
}
}
if (currentEvent !== undefined && children.length === 0) {
issues.push(Issue.atStatement(file, currentEvent, "Empty event", this.getMetadata().key, this.getConfig().severity));
}
return issues;
}
}
|