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 | 1x 1x 1x 1x 1x 1x 1x 22175x 22175x 22175x 22175x 22175x 1x 1x 1x 1x 11087x 11087x 11087x 11087x 43704x 43704x 43704x 43704x 43704x 43704x 43704x 43704x 43704x 43704x 43704x 43704x 43704x 43704x 11087x 11087x 15x 15x 15x 15x 15x 11087x 11087x 10840x 10840x 11087x 11087x 260x 260x 11087x 11087x 279x 279x 279x 7x 7x 272x 272x 279x 272x 272x 279x 1803x 1803x 17x 17x 1803x 272x 279x 1516x 1516x 25x 25x 10x 10x 15x 15x 15x 15x 15x 15x 15x 25x 1x 1x 25x 1516x 272x 272x 11087x | import {Issue} from "../issue";
import {Comment} from "../abap/2_statements/statements/_statement";
import {BasicRuleConfig} from "./_basic_rule_config";
import {ABAPRule} from "./_abap_rule";
import {IRuleMetadata, RuleTag} from "./_irule";
import {ABAPFile} from "../abap/abap_file";
export class CheckCommentsConf extends BasicRuleConfig {
/** Allows the use of end-of-line comments. */
public allowEndOfLine: boolean = false;
public maxIssuesPerFile: number | undefined = 10;
}
enum IssueType {
EndOfLine,
}
export class CheckComments extends ABAPRule {
private conf = new CheckCommentsConf();
public getMetadata(): IRuleMetadata {
return {
key: "check_comments",
title: "Check Comments",
shortDescription: `
Various checks for comment usage.`,
extendedInformation: `
Detects end of line comments. Comments starting with "#EC" or "##" are ignored
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#put-comments-before-the-statement-they-relate-to`,
tags: [RuleTag.Styleguide, RuleTag.SingleFile],
badExample: `WRITE 2. " descriptive comment`,
goodExample: `" descriptive comment\nWRITE 2.`,
};
}
private getDescription(issueType: IssueType): string {
switch (issueType) {
case IssueType.EndOfLine: return `Do not use end of line comments - move comment to previous row instead`;
default: return "";
}
}
public getConfig() {
return this.conf;
}
public setConfig(conf: CheckCommentsConf) {
this.conf = conf;
}
public runParsed(file: ABAPFile): Issue[] {
const issues: Issue[] = [];
const rows = file.getRawRows();
if (this.conf.allowEndOfLine === true) {
return [];
}
let max = this.getConfig().maxIssuesPerFile;
if (max === undefined || max < 1) {
max = 10;
}
const commentRows: number[] = [];
for (let i = 0; i < rows.length; i++) {
const row = rows[i];
if (row.trim().startsWith("*") || row.trim().startsWith(`"`)) {
commentRows.push(i);
}
}
const statements = file.getStatements();
for (let i = statements.length - 1; i >= 0; i--) {
const statement = statements[i];
if (statement.get() instanceof Comment && !commentRows.includes(statement.getStart().getRow() - 1)) {
if (statement.getFirstToken().getStr().startsWith(`"#EC`)
|| statement.getFirstToken().getStr().startsWith(`"##`)) {
continue;
}
issues.push(
Issue.atStatement(
file,
statement,
this.getDescription(IssueType.EndOfLine),
this.getMetadata().key,
this.conf.severity));
if (issues.length >= max) {
break;
}
}
}
return issues;
}
} |