All files / src/abap/5_syntax/expressions field_assignment.ts

89.74% Statements 35/39
70% Branches 7/10
100% Functions 1/1
89.74% Lines 35/39

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 391x 1x 1x 1x 1x 1x 1x 1x 1x 1x 19x 19x 19x 19x 19x 19x 19x     19x 19x 19x     19x 19x 19x 13x 13x 1x 1x 19x 1x 1x 18x 18x 18x 1x 1x
import * as Expressions from "../../2_statements/expressions";
import {ExpressionNode, StatementNode} from "../../nodes";
import {StructureType, VoidType} from "../../types/basic";
import {AbstractType} from "../../types/basic/_abstract_type";
import {CurrentScope} from "../_current_scope";
import {Source} from "./source";
 
export class FieldAssignment {
 
  public runSyntax(
    node: ExpressionNode | StatementNode,
    scope: CurrentScope,
    filename: string,
    targetType: AbstractType | undefined): void {
 
    const name = node.findDirectExpression(Expressions.FieldSub)?.concatTokens();
    if (name === undefined) {
      throw new Error("FieldAssignment, FieldSub node not found");
    }
 
    const s = node.findDirectExpression(Expressions.Source);
    if (s === undefined) {
      throw new Error("FieldAssignment, Source node not found");
    }
 
    let type: AbstractType | undefined = undefined;
    if (targetType instanceof StructureType) {
      type = targetType.getComponentByName(name);
      if (type === undefined && targetType.containsVoid() === false) {
        throw new Error(`field ${name} does not exist in structure`);
      }
    } else if (targetType instanceof VoidType) {
      type = targetType;
    }
 
    new Source().runSyntax(s, scope, filename, type);
  }
 
}