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

96.15% Statements 50/52
87.5% Branches 14/16
100% Functions 1/1
96.15% Lines 50/52

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 531x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 406x 406x 406x 406x 406x 76x 76x 406x 406x 406x 406x 406x 406x 2x 2x 2x 2x 406x 403x 406x 1x 1x 403x 406x     403x 403x 406x 11x 11x 2x 2x 2x 2x 11x 406x 406x 1x  
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {Source} from "../expressions/source";
import {Target} from "../expressions/target";
import {StatementSyntax} from "../_statement_syntax";
import {Dynamic} from "../expressions/dynamic";
import {TypeUtils} from "../_type_utils";
import {FieldChain} from "../expressions/field_chain";
import {ReferenceType} from "../_reference";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
 
export class Write implements StatementSyntax {
  public runSyntax(node: StatementNode, input: SyntaxInput): void {
 
// todo, more
 
    let second = node.getChildren()[1];
    if (second.get() instanceof Expressions.WriteOffsetLength) {
      second = node.getChildren()[2];
    }
 
    for (const s of node.findDirectExpressions(Expressions.Source)) {
      const type = Source.runSyntax(s, input);
      if (s === second
          && new TypeUtils(input.scope).isCharLike(type) === false
          && new TypeUtils(input.scope).isHexLike(type) === false) {
        const message = "Source not character like";
        input.issues.push(syntaxIssue(input, s.getFirstToken(), message));
        return;
      }
    }
 
    for (const s of node.findDirectExpression(Expressions.WriteOffsetLength)?.findDirectExpressions(Expressions.SimpleFieldChain2) || []) {
      FieldChain.runSyntax(s, input, ReferenceType.DataReadReference);
    }
 
    for (const s of node.findAllExpressions(Expressions.Dynamic)) {
      Dynamic.runSyntax(s, input);
    }
 
    const target = node.findDirectExpression(Expressions.Target);
    if (target) {
      const targetType = Target.runSyntax(target, input);
      if (new TypeUtils(input.scope).isCharLikeField(targetType) === false) {
        const message = `"${target.concatTokens()}" must be a character-like field (data type C, N, D, or T, got "${
          targetType?.constructor.name}")`;
        input.issues.push(syntaxIssue(input, target.getFirstToken(), message));
      }
    }
 
  }
}