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 11212x 11212x 11212x 11212x 11212x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 33450x 11212x 11212x 10672x 10672x 11212x 11212x 266x 266x 11212x 11212x 283x 283x 283x 80x 80x 203x 203x 283x 10x 10x 193x 193x 193x 283x 392x 8x 1x 1x 1x 1x 1x 1x 1x 8x 8x 8x 392x 140x 140x 140x 97x 97x 43x 384x 244x 244x 244x 392x 193x 283x 28x 28x 28x 28x 28x 28x 28x 193x 193x 193x 11212x 11212x | 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; } } |