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 22216x 22216x 22216x 22216x 1x 11109x 11109x 11109x 11109x 11109x 33185x 33185x 33185x 33185x 33185x 33185x 33185x 33185x 33185x 33185x 33185x 33185x 11109x 11109x 2x 2x 11109x 11109x 10585x 10585x 11109x 11109x 246x 246x 11109x 11109x 277x 277x 277x 277x 12x 12x 265x 277x 1502x 1502x 9x 9x 1502x 256x 256x 277x 6303x 23x 6303x 1338x 1338x 6303x 2x 2x 2x 2x 6303x 1337x 6303x 4943x 4943x 4943x 6303x 256x 256x 256x 11109x 11109x | 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;
}
} |