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

86.53% Statements 45/52
62.5% Branches 5/8
100% Functions 1/1
86.53% Lines 45/52

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