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

77.08% Statements 37/48
73.33% Branches 11/15
100% Functions 3/3
77.08% Lines 37/48

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 491x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2184x 2184x 2184x 2184x 2184x 2184x 1x 1x 1x 1x 2184x 2184x 3x 3x 3x 3x 2176x 2176x                       1x 1x 2180x 2180x 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?.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));
      }
      return new TypedIdentifier(name.getFirstToken(), input.filename, new UnknownType("data, fallback"));
    }

    return undefined;
  }
 
  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;
  }
}