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 15477x 15477x 15477x 15477x 15477x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 105911x 15477x 15477x 14916x 14916x 15477x 15477x 264x 264x 15477x 15477x 299x 299x 299x 106x 106x 193x 193x 299x 10x 10x 183x 183x 183x 299x 434x 15x 2x 2x 15x 15x 15x 434x 180x 180x 180x 130x 130x 50x 419x 239x 1x 1x 239x 239x 239x 239x 434x 183x 299x 5x 5x 183x 183x 183x 15477x 15477x | 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;
}
}
|