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

82.97% Statements 39/47
66.66% Branches 4/6
100% Functions 1/1
82.97% Lines 39/47

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 471x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x         2x 2x 2x 1x 1x 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 {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;
      }
    }
 
  }
}