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

75% Statements 45/60
77.77% Branches 14/18
100% Functions 4/4
75% Lines 45/60

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 52 53 54 55 56 57 58 59 60 611x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2394x 2394x 2394x 2394x 2394x 2394x 1x 1x 1x 1x 2394x 1x 1x 1x 2394x 2394x 3x 3x 3x 3x 2386x 2386x                               1x 1x 2389x 2389x 1x 1x 2390x 2390x 1x 1x 3x 3x 1x  
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {DataDefinition} from "../expressions/data_definition";
import {UnknownType} from "../../types/basic/unknown_type";
import {CheckSyntaxKey, SyntaxInput, syntaxIssue} from "../_syntax_input";
import {VoidType} from "../../types/basic";
 
export class Data {
  public runSyntax(node: StatementNode, input: SyntaxInput): TypedIdentifier | undefined {
 
    const name = node.findFirstExpression(Expressions.DefinitionName);
    const dd = node.findFirstExpression(Expressions.DataDefinition);
    if (dd) {
      const id = DataDefinition.runSyntax(dd, input);
      if (id && this.isOnlyDigits(id.getName()) && this.allowOnlyDigitsName(node, input) === false) {
        const message = "not possible to have a name with only digits";
        input.issues.push(syntaxIssue(input, id.getToken(), message));
        return new TypedIdentifier(id.getToken(), input.filename, VoidType.get(CheckSyntaxKey));
      }
      if (id && this.isNameTooLong(id.getName())) {
        const message = "DATA name too long, " + id.getName();
        input.issues.push(syntaxIssue(input, id.getToken(), message));
      }
      if (id?.getType().isGeneric() === true
          && id?.getType().containsVoid() === false) {
        const message = "DATA definition cannot be generic, " + name?.concatTokens();
        input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
        return new TypedIdentifier(id.getToken(), input.filename, VoidType.get(CheckSyntaxKey));
      }
      return id;
    }

    if (name) {
      if (this.isOnlyDigits(name.concatTokens()) && this.allowOnlyDigitsName(node, input) === false) {
        const message = "not possible to have a name with only digits";
        input.issues.push(syntaxIssue(input, name.getFirstToken(), message));
      }
      if (this.isNameTooLong(name.concatTokens())) {
        const message = "DATA name too long, " + name.concatTokens();
        input.issues.push(syntaxIssue(input, name.getFirstToken(), message));
      }
      return new TypedIdentifier(name.getFirstToken(), input.filename, new UnknownType("data, fallback"));
    }

    return undefined;
  }
 
  private isNameTooLong(name: string): boolean {
    return name.length > 30;
  }
 
  private isOnlyDigits(name: string): boolean {
    return /^[0-9]+$/.test(name);
  }
 
  private allowOnlyDigitsName(node: StatementNode, input: SyntaxInput): boolean {
    return input.scope.isAnyOO() === false && node.getColon() !== undefined;
  }
}