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

94.59% Statements 35/37
50% Branches 2/4
100% Functions 1/1
94.59% Lines 35/37

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 381x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 1x 1x 1x 6x 6x 6x 6x 6x     6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 1x  
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {StructureType, TableType, CharacterType, TableKeyType} from "../../types/basic";
import {BasicTypes} from "../basic_types";
import {StatementSyntax} from "../_statement_syntax";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
import {AssertError} from "../assert_error";
 
export class Ranges implements StatementSyntax {
  public runSyntax(node: StatementNode, input: SyntaxInput) {
    if (input.scope.isAnyOO()) {
      const message = "RANGES is not allowed within classes";
      input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
    }
 
    const nameToken = node.findFirstExpression(Expressions.DefinitionName)?.getFirstToken();
 
    const typeExpression = node.findFirstExpression(Expressions.SimpleFieldChain2);
    if (typeExpression === undefined) {
      throw new AssertError("Ranges, unexpected node");
    }
 
    const found = new BasicTypes(input).resolveLikeName(typeExpression);
    if (found && nameToken) {
      const structure = new StructureType([
        {name: "sign", type: new CharacterType(1)},
        {name: "option", type: new CharacterType(2)},
        {name: "low", type: found},
        {name: "high", type: found},
      ]);
      const type = new TableType(structure, {withHeader: true, keyType: TableKeyType.default});
      const id = new TypedIdentifier(nameToken, input.filename, type);
      input.scope.addIdentifier(id);
    }
  }
}