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 26022x 26022x 26022x 26022x 1x 13012x 13012x 13012x 13012x 13012x 76250x 76250x 76250x 76250x 76250x 76250x 76250x 76250x 76250x 76250x 76250x 76250x 13012x 13012x 2x 2x 13012x 13012x 12451x 12451x 13012x 13012x 263x 263x 13012x 13012x 301x 301x 301x 301x 12x 12x 289x 301x 1642x 1642x 9x 9x 1642x 280x 280x 301x 6871x 23x 6871x 1473x 1473x 6871x 2x 2x 2x 2x 6871x 1472x 6871x 5376x 5376x 5376x 6871x 280x 280x 280x 13012x 13012x | 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;
}
} |