All files / src/abap/5_syntax/statements method_implementation.ts

91.83% Statements 45/49
75% Branches 9/12
100% Functions 1/1
91.83% Lines 45/49

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 491x 1x 1x 1x 1x 1x 1x 1x 1x 1x 449x 449x 449x 449x 449x 449x 449x 449x     449x 449x 449x 5x 5x 444x 444x 449x 346x 346x 346x 444x 444x 444x 444x 444x 444x 449x 38x 19x 19x 19x 38x     19x 19x 444x 1x
import {StatementNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import * as Expressions from "../../2_statements/expressions";
import {ObjectOriented} from "../_object_oriented";
import {ScopeType} from "../_scope_type";
import {ReferenceType} from "../_reference";
import {StatementSyntax} from "../_statement_syntax";
 
export class MethodImplementation implements StatementSyntax {
  public runSyntax(node: StatementNode, scope: CurrentScope, filename: string): void {
    const helper = new ObjectOriented(scope);
 
    const className = scope.getName();
    const methodToken = node.findFirstExpression(Expressions.MethodName)!.getFirstToken();
    const methodName = methodToken?.getStr();
 
    const classDefinition = scope.findClassDefinition(className);
    if (classDefinition === undefined) {
      throw new Error("Class definition for \"" + className + "\" not found");
    }
 
    const {method: methodDefinition} = helper.searchMethodName(classDefinition, methodName);
    if (methodDefinition === undefined) {
      throw new Error("Method definition \"" + methodName + "\" not found");
    }
 
    const start = node.getFirstToken().getStart();
    if (methodDefinition.isStatic() === false) {
      scope.push(ScopeType.MethodInstance, methodName, start, filename);
      scope.addList(classDefinition.getAttributes().getInstance());
    }
 
    scope.push(ScopeType.Method, methodName, start, filename);
 
    scope.addReference(methodToken, methodDefinition, ReferenceType.MethodImplementationReference, filename);
    scope.addList(methodDefinition.getParameters().getAll());
 
    for (const i of helper.findInterfaces(classDefinition)) {
      if (methodName.toUpperCase().startsWith(i.name.toUpperCase() + "~") === false) {
        continue;
      }
      const idef = scope.findInterfaceDefinition(i.name);
      if (idef === undefined) {
        continue;
      }
      scope.addReference(methodToken, idef, ReferenceType.ObjectOrientedReference, filename);
    }
  }
}