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 27338x 27338x 27338x 27338x 1x 13670x 13670x 13670x 13670x 13670x 40856x 40856x 40856x 40856x 40856x 40856x 40856x 40856x 40856x 40856x 40856x 40856x 13670x 13670x 2x 2x 13670x 13670x 13158x 13158x 13670x 13670x 240x 240x 13670x 13670x 262x 262x 262x 262x 12x 12x 250x 262x 1434x 1434x 8x 8x 1434x 242x 242x 262x 6010x 21x 6010x 1288x 1288x 6010x 2x 2x 2x 2x 6010x 1288x 6010x 4701x 4701x 4701x 6010x 242x 242x 242x 13670x 13670x | 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;
}
} |