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 402x 402x 402x 402x 402x 76x 76x 402x 402x 402x 402x 402x 402x 2x 2x 2x 2x 402x 399x 402x 1x 1x 399x 402x     399x 399x 402x 11x 11x 2x 2x 2x 2x 11x 402x 402x 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));
      }
    }
 
  }
}