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 93 94 95 96 97 98 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11010x 11010x 11010x 11010x 11010x 32901x 32901x 32901x 32901x 32901x 32901x 32901x 32901x 32901x 32901x 32901x 32901x 32901x 32901x 11010x 11010x 10516x 10516x 11010x 11010x 243x 243x 11010x 11010x 269x 269x 269x 89x 89x 180x 180x 269x 10x 10x 170x 170x 170x 269x 386x 7x 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 386x 158x 158x 158x 116x 116x 42x 379x 221x 221x 221x 386x 170x 269x 28x 28x 28x 28x 28x 28x 28x 170x 170x 170x 11010x 11010x | 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 ImplicitStartOfSelectionConf extends BasicRuleConfig {
}
export class ImplicitStartOfSelection extends ABAPRule {
private conf = new ImplicitStartOfSelectionConf();
public getMetadata(): IRuleMetadata {
return {
key: "implicit_start_of_selection",
title: "Implicit START-OF-SELECTION",
shortDescription: `Add explicit selection screen event handling`,
extendedInformation: `Only runs for executable programs
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapstart-of-selection.htm`,
tags: [RuleTag.SingleFile],
badExample: `REPORT zfoo.
WRITE 'hello'.`,
goodExample: `START-OF-SELECTION.
WRITE 'hello'.`,
};
}
public getConfig() {
return this.conf;
}
public setConfig(conf: ImplicitStartOfSelectionConf) {
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 inEvent = false;
let collected: (StatementNode | StructureNode)[] = [];
for (const s of stru.getChildren() || []) {
if (SELECTION_EVENTS.some(f => s.get() instanceof f)) {
if (inEvent === false && collected.length > 0) {
// implicit START-OF-SELECTION
let first = collected[0];
if (first instanceof StructureNode) {
first = first.getFirstStatement()!;
}
issues.push(Issue.atStatement(file, first, "Implicit START-OF-SELECTION", this.getMetadata().key, this.getConfig().severity));
}
collected = [];
inEvent = true;
} 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;
}
collected.push(s);
} else {
if (inEvent === true) {
inEvent = false;
}
collected = [];
}
}
if (inEvent === false && collected.length > 0) {
// implicit START-OF-SELECTION
let first = collected[0];
if (first instanceof StructureNode) {
first = first.getFirstStatement()!;
}
issues.push(Issue.atStatement(file, first, "Implicit START-OF-SELECTION", this.getMetadata().key, this.getConfig().severity));
}
return issues;
}
}
|