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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 22430x 22430x 22430x 22430x 1x 11216x 11216x 11216x 11216x 11216x 33491x 33491x 33491x 33491x 33491x 33491x 33491x 33491x 33491x 33491x 33491x 33491x 11216x 11216x 2x 2x 11216x 11216x 10730x 10730x 11216x 11216x 227x 227x 11216x 11216x 249x 249x 249x 249x 12x 12x 237x 249x 1367x 1367x 8x 8x 1367x 229x 229x 249x 5729x 21x 5729x 1223x 1223x 5729x 2x 2x 2x 2x 5729x 1223x 5729x 4485x 4485x 4485x 5729x 229x 229x 229x 11216x 11216x | import {Issue} from "../issue"; import {ABAPRule} from "./_abap_rule"; import {BasicRuleConfig} from "./_basic_rule_config"; import {Punctuation, Comment as CommentToken} from "../abap/1_lexer/tokens"; import {NativeSQL, Unknown} from "../abap/2_statements/statements/_statement"; import {EditHelper} from "../edit_helper"; import {IRuleMetadata, RuleTag} from "./_irule"; import {Position} from "../position"; import {ABAPFile} from "../abap/abap_file"; export class EmptyLineinStatementConf extends BasicRuleConfig { /** Allow changed empty lines in chanined statements */ public allowChained: boolean = false; } export class EmptyLineinStatement extends ABAPRule { private conf = new EmptyLineinStatementConf(); public getMetadata(): IRuleMetadata { return { key: "empty_line_in_statement", title: "Find empty lines in statements", shortDescription: `Checks that statements do not contain empty lines.`, extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-obsess-with-separating-blank-lines https://docs.abapopenchecks.org/checks/41/`, tags: [RuleTag.Quickfix, RuleTag.Whitespace, RuleTag.SingleFile, RuleTag.Styleguide], badExample: `WRITE\n\nhello.`, goodExample: `WRITE hello.`, }; } private getMessage(): string { return "Remove empty line in statement"; } public getConfig() { return this.conf; } public setConfig(conf: EmptyLineinStatementConf) { this.conf = conf; } public runParsed(file: ABAPFile) { const issues: Issue[] = []; const stru = file.getStructure(); if (stru === undefined) { return []; } for (const s of file.getStatements()) { if (s.get() instanceof Unknown || s.get() instanceof NativeSQL) { return []; // skip the file if there are parser errors or native/sqlscript } } let prevLine: number | undefined = undefined; for (const t of file.getTokens()) { if (prevLine === undefined && t instanceof CommentToken) { continue; } else if (prevLine === undefined) { prevLine = t.getRow(); } if (prevLine && t.getRow() - prevLine >= 2) { const fix = EditHelper.deleteRange(file, new Position(prevLine + 1, 1), t.getStart()); const issue = Issue.atToken(file, t, this.getMessage(), this.getMetadata().key, this.conf.severity, fix); issues.push(issue); } if (t instanceof Punctuation && t.getStr() === ".") { prevLine = undefined; } else if (this.conf.allowChained === true && t instanceof Punctuation && t.getStr() === ",") { prevLine = undefined; } else { prevLine = t.getRow(); } } return issues; } } |