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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 12077x 12077x 12077x 12077x 12077x 47628x 47628x 47628x 47628x 47628x 47628x 47628x 47628x 47628x 47628x 12077x 12077x 11536x 11536x 12077x 12077x 255x 255x 12077x 12077x 279x 279x 279x 279x 12x 12x 267x 279x 4x 2x 2x 2x 4x 267x 267x 267x 12077x 12077x | import * as Statements from "../abap/2_statements/statements";
import * as Expressions from "../abap/2_statements/expressions";
import {ABAPRule} from "./_abap_rule";
import {BasicRuleConfig} from "./_basic_rule_config";
import {Issue} from "../issue";
import {IRuleMetadata, RuleTag} from "./_irule";
import {ABAPFile} from "../abap/abap_file";
export class NoExternalFormCallsConf extends BasicRuleConfig {
}
export class NoExternalFormCalls extends ABAPRule {
private conf = new NoExternalFormCallsConf();
public getMetadata(): IRuleMetadata {
return {
key: "no_external_form_calls",
title: "No external FORM calls",
shortDescription: `Detect external form calls`,
badExample: `PERFORM foo IN PROGRAM bar.
PERFORM foo(bar).`,
tags: [RuleTag.SingleFile],
};
}
public getConfig() {
return this.conf;
}
public setConfig(conf: NoExternalFormCallsConf): void {
this.conf = conf;
}
public runParsed(file: ABAPFile) {
const issues: Issue[] = [];
const stru = file.getStructure();
if (stru === undefined) {
return issues; // parser error
}
for (const p of stru.findAllStatements(Statements.Perform)) {
if (p.findDirectExpression(Expressions.IncludeName) || p.findDirectTokenByText("PROGRAM")) {
const message = "No external FORM calls";
issues.push(Issue.atStatement(file, p, message, this.getMetadata().key, this.conf.severity));
}
}
return issues;
}
} |