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 22703x 22703x 22703x 22703x 22703x 1x 1x 1x 1x 11351x 11351x 11351x 11351x 33911x 33911x 33911x 33911x 33911x 33911x 33911x 33911x 33911x 33911x 33911x 33911x 33911x 33911x 11351x 11351x 15x 15x 15x 15x 15x 11351x 11351x 11105x 11105x 11351x 11351x 249x 249x 11351x 11351x 258x 258x 258x 7x 7x 251x 251x 258x 251x 251x 258x 1675x 1675x 15x 15x 1675x 251x 258x 1415x 1415x 25x 25x 10x 10x 15x 15x 15x 15x 15x 15x 15x 25x 1x 1x 25x 1415x 251x 251x 11351x | 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;
}
} |