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 99 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 10968x 10968x 10968x 10968x 10968x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 32745x 10968x 10968x 10459x 10459x 10968x 10968x 258x 258x 10968x 10968x 273x 273x 273x 80x 80x 193x 193x 273x 10x 10x 183x 183x 183x 273x 370x 6x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 370x 132x 132x 132x 69x 69x 63x 364x 232x 232x 232x 370x 183x 273x 41x 41x 41x 41x 41x 41x 41x 183x 183x 183x 10968x 10968x | 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 "../abap/flow/selection_events"; 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; } } |