All files / src/abap/types method_definitions.ts

94.44% Statements 68/72
93.1% Branches 27/29
100% Functions 5/5
94.44% Lines 68/72

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 721x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1517x 1517x 1517x 1x 1x 4884x 2446x 1650x 4088x 1x 1x 309x     309x 309x 309x 1x 1x 1x 1x 276x 276x 82x 82x 82x 276x 1x 1x 1517x 1517x 276x 276x 1241x 1241x 1517x     1241x 1241x 1517x 49x 49x 49x 1241x 1241x 1517x 12x 12x 12x 1241x 1241x 1517x 548x 548x 548x 1241x 1x 1x
import {MethodDefinition} from "./method_definition";
import {StructureNode} from "../nodes";
import * as Structures from "../3_structures/structures";
import {MethodDef} from "../2_statements/statements";
import {Visibility} from "../4_file_information/visibility";
import {IMethodDefinitions} from "./_method_definitions";
import {IMethodDefinition} from "./_method_definition";
import {SyntaxInput} from "../5_syntax/_syntax_input";
 
export class MethodDefinitions implements IMethodDefinitions {
  private readonly all: {[index: string]: IMethodDefinition} = {};
 
  public constructor(node: StructureNode, input: SyntaxInput) {
    this.all = {};
    this.parse(node, input);
  }
 
  public* getAll(): Generator<IMethodDefinition, void, undefined> {
    for (const a in this.all) {
      yield this.all[a];
    }
  }
 
  public getByName(name: string | undefined): IMethodDefinition | undefined {
    if (name === undefined) {
      return undefined;
    }
 
    return this.all[name.toUpperCase()];
  }
 
///////////////////////
 
  private parseInterface(node: StructureNode, input: SyntaxInput) {
    const defs = node.findAllStatements(MethodDef);
    for (const def of defs) {
      const m = new MethodDefinition(def, Visibility.Public, input);
      this.all[m.getName().toUpperCase()] = m;
    }
  }
 
  private parse(node: StructureNode, input: SyntaxInput) {
    const idef = node.findDirectStructure(Structures.Interface);
    if (idef) {
      return this.parseInterface(node, input);
    }
 
    const cdef = node.findDirectStructure(Structures.ClassDefinition);
    if (!cdef) {
      throw new Error("MethodDefinitions, expected ClassDefinition as part of input node");
    }
 
    const pri = cdef.findDirectStructure(Structures.PrivateSection);
    for (const def of pri?.findAllStatements(MethodDef) || []) {
      const m = new MethodDefinition(def, Visibility.Private, input);
      this.all[m.getName().toUpperCase()] = m;
    }
 
    const pro = node.findDirectStructure(Structures.ProtectedSection);
    for (const def of pro?.findAllStatements(MethodDef) || []) {
      const m = new MethodDefinition(def, Visibility.Protected, input);
      this.all[m.getName().toUpperCase()] = m;
    }
 
    const pub = node.findDirectStructure(Structures.PublicSection);
    for (const def of pub?.findAllStatements(MethodDef) || []) {
      const m = new MethodDefinition(def, Visibility.Public, input);
      this.all[m.getName().toUpperCase()] = m;
    }
  }
 
}