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

88.89% Statements 24/27
75% Branches 9/12
100% Functions 1/1
88.89% Lines 24/27

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    1x 1x 1x 1x     1x   185x   185x 185x 185x 185x   185x 185x         185x 185x 5x 5x     180x   180x   180x 24x 10x   14x 14x     14x      
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();
    scope.push(ScopeType.Method, methodName, node.getFirstToken().getStart(), filename);
 
    const classDefinition = scope.findClassDefinition(className);
    Iif (classDefinition === undefined) {
      scope.pop(node.getLastToken().getEnd());
      throw new Error("Class definition for \"" + className + "\" not found");
    }
 
    const {method: methodDefinition} = helper.searchMethodName(classDefinition, methodName);
    if (methodDefinition === undefined) {
      scope.pop(node.getLastToken().getEnd());
      throw new Error("Method definition \"" + methodName + "\" not found");
    }
 
    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);
      Iif (idef === undefined) {
        continue;
      }
      scope.addReference(methodToken, idef, ReferenceType.ObjectOrientedReference, filename);
    }
  }
}