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

90.24% Statements 37/41
66.66% Branches 4/6
100% Functions 1/1
90.24% Lines 37/41

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 411x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x     2x 2x 2x 1x 1x 1x 1x 2x 2x 1x 1x 1x 1x 1x 1x     1x 1x 1x 1x
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import {ReferenceType} from "../_reference";
import {StatementSyntax} from "../_statement_syntax";
 
export class ClassLocalFriends implements StatementSyntax {
  public runSyntax(node: StatementNode, scope: CurrentScope, filename: string): void {
 
    const classNames = node.findAllExpressions(Expressions.ClassName);
 
    const found = classNames[0];
    if (found) {
      const token = found.getFirstToken();
      const name = token.getStr();
 
      if (scope.getParentObj().getType() === "CLAS"
          && name.toUpperCase() !== scope.getParentObj().getName().toUpperCase()) {
        throw new Error(`Befriending must be ` + scope.getParentObj().getName().toUpperCase());
      }
 
      const def = scope.findClassDefinition(name);
      if (def) {
        scope.addReference(token, def, ReferenceType.ObjectOrientedReference, filename);
      } else {
        throw new Error(`Class ${name.toUpperCase()} not found`);
      }
 
    }
 
    for (let i = 1; i < classNames.length; i++) {
      const className = classNames[i].concatTokens();
      // make sure to check also DEFINITION DEFERRED
      const found = scope.existsObject(className);
      if (found === undefined) {
        throw new Error(`Class ${className.toUpperCase()} not found`);
      }
    }
 
  }
}