All files / src/rules method_implemented_twice.ts

100% Statements 28/28
100% Branches 4/4
100% Functions 5/5
100% Lines 28/28

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 631x 1x 1x 1x     1x     1x   7278x     21682x                 7018x       114x       135x   135x 77x 77x 33x 33x 32x   1x 1x         135x 79x 79x 28x 28x 26x   2x 2x         135x      
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 MethodImplementedTwiceConf extends BasicRuleConfig {
}
 
export class MethodImplementedTwice extends ABAPRule {
 
  private conf = new MethodImplementedTwiceConf();
 
  public getMetadata(): IRuleMetadata {
    return {
      key: "method_implemented_twice",
      title: "Method implemented twice",
      shortDescription: `Reports an error if a method is implemented or defined twice`,
      tags: [RuleTag.SingleFile, RuleTag.Syntax],
    };
  }
 
  public getConfig() {
    return this.conf;
  }
 
  public setConfig(conf: MethodImplementedTwiceConf): void {
    this.conf = conf;
  }
 
  public runParsed(file: ABAPFile) {
    const issues: Issue[] = [];
 
    for (const classDef of file.getInfo().listClassImplementations()) {
      const names: {[index: string]: boolean} = {};
      for (const m of classDef.methods) {
        const name = m.getName().toUpperCase();
        if (names[name] === undefined) {
          names[name] = true;
        } else {
          const message = `Method ${name} implemented twice`;
          issues.push(Issue.atToken(file, m.getToken(), message, this.getMetadata().key, this.getConfig().severity));
        }
      }
    }
 
    for (const classDef of file.getInfo().listClassDefinitions()) {
      const names: {[index: string]: boolean} = {};
      for (const m of classDef.methods) {
        const name = m.name.toUpperCase();
        if (names[name] === undefined) {
          names[name] = true;
        } else {
          const message = `Method ${name} defined twice`;
          issues.push(Issue.atToken(file, m.identifier.getToken(), message, this.getMetadata().key, this.getConfig().severity));
        }
      }
    }
 
    return issues;
  }
 
}