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 231x 231x 231x 231x 231x 231x 3x 3x 3x 3x 231x 1x 1x 1x 223x 223x                                 1x 1x 223x 223x 1x 1x 226x 226x 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;
  }
}