All files / src/rules method_overwrites_builtin.ts

100% Statements 65/65
100% Branches 8/8
100% Functions 5/5
100% Lines 65/65

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 651x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11057x 11057x 11057x 11057x 11057x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 32982x 11057x 11057x 10504x 10504x 11057x 11057x 261x 261x 11057x 11057x 275x 275x 275x 275x 118x 118x 275x 275x 275x 46x 2x 2x 2x 46x 275x 275x 275x 11057x
import {InfoMethodDefinition} from "../abap/4_file_information/_abap_file_information";
import {BuiltIn} from "../abap/5_syntax/_builtin";
import {ABAPFile} from "../abap/abap_file";
import {Issue} from "../issue";
import {ABAPRule} from "./_abap_rule";
import {BasicRuleConfig} from "./_basic_rule_config";
import {IRuleMetadata, RuleTag} from "./_irule";
 
export class MethodOverwritesBuiltInConf extends BasicRuleConfig {
}
 
export class MethodOverwritesBuiltIn extends ABAPRule {
 
  private conf = new MethodOverwritesBuiltInConf();
 
  public getMetadata(): IRuleMetadata {
    return {
      key: "method_overwrites_builtin",
      title: "Method name overwrites builtin function",
      shortDescription: `Checks Method names that overwrite builtin SAP functions`,
      extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abenbuilt_in_functions_overview.htm
 
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obscuring-built-in-functions
 
Interface method names are ignored`,
      tags: [RuleTag.Naming, RuleTag.SingleFile, RuleTag.Styleguide],
      badExample: `CLASS lcl DEFINITION.
  PUBLIC SECTION.
    METHODS matches.
ENDCLASS.
 
CLASS lcl IMPLEMENTATION.
  METHOD matches.
  ENDMETHOD.
ENDCLASS.`,
    };
  }
 
  public getConfig() {
    return this.conf;
  }
 
  public setConfig(conf: MethodOverwritesBuiltInConf) {
    this.conf = conf;
  }
 
  public runParsed(file: ABAPFile): Issue[] {
    const issues: Issue[] = [];
    let methods: InfoMethodDefinition[] = [];
 
    for (const classDef of file.getInfo().listClassDefinitions()) {
      methods = methods.concat(classDef.methods);
    }
 
    const builtIn = new BuiltIn();
    for (const method of methods) {
      if (builtIn.searchBuiltin(method.name.toUpperCase())) {
        const message = `Method name "${method.name}" overwrites built-in SAP function name`;
        issues.push(Issue.atIdentifier(method.identifier, message, this.getMetadata().key));
      }
    }
 
    return issues;
  }
}