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

71.42% Statements 40/56
90.9% Branches 10/11
100% Functions 4/4
71.42% Lines 40/56

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 571x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 217x 217x 217x 217x 217x 217x 3x 3x 3x 3x 217x 1x 1x 1x 209x 209x                                 1x 1x 209x 209x 1x 1x 212x 212x 1x 1x 5x 5x 1x  
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {BasicTypes} from "../basic_types";
import {TypedIdentifier, IdentifierMeta} from "../../types/_typed_identifier";
import {UnknownType} from "../../types/basic";
import {CheckSyntaxKey, SyntaxInput, syntaxIssue} from "../_syntax_input";
import {AssertError} from "../assert_error";
import {VoidType} from "../../types/basic";
 
export class Constant {
  public runSyntax(node: StatementNode, input: SyntaxInput): TypedIdentifier {
    const basic = new BasicTypes(input);
    const found = basic.simpleType(node);
    if (found) {
      const val = basic.findValue(node);
      const meta = [IdentifierMeta.ReadOnly, IdentifierMeta.Static];
      if (this.isOnlyDigits(found.getName()) && this.allowOnlyDigitsName(node, input) === false) {
        const message = "not possible to have a name with only digits";
        input.issues.push(syntaxIssue(input, found.getToken(), message));
        return new TypedIdentifier(found.getToken(), input.filename, VoidType.get(CheckSyntaxKey), meta, val);
      }
      if (this.isNameTooLong(found.getName())) {
        const message = "CONSTANTS name too long, " + found.getName();
        input.issues.push(syntaxIssue(input, found.getToken(), message));
      }
      return new TypedIdentifier(found.getToken(), input.filename, found.getType(), meta, val);
    }

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

    throw new AssertError("Statement Constant: unexpected structure");
  }
 
  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;
  }
}