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 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x         6x 6x 6x 5x 6x 1x 1x 1x 1x 6x 6x 5x 5x 5x 5x 5x 5x       5x 5x 5x 5x 5x 5x 5x 5x 5x 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);
        }
      }
    }
 
  }
}