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 1430x 1430x 1430x 1x 1x 4594x 2281x 1544x 3857x 1x 1x 299x     299x 299x 299x 1x 1x 1x 1x 271x 271x 79x 79x 79x 271x 1x 1x 1430x 1430x 271x 271x 1159x 1159x 1430x     1159x 1159x 1430x 47x 47x 47x 1159x 1159x 1430x 11x 11x 11x 1159x 1159x 1430x 507x 507x 507x 1159x 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;
    }
  }
 
}