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

95.83% Statements 46/48
90% Branches 9/10
100% Functions 1/1
95.83% Lines 46/48

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 481x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 9x 9x     9x 9x 9x 9x 8x 9x 1x 1x 8x 8x 9x 7x 7x 3x 2x 2x 1x 1x 1x 1x 1x 3x 1x 1x 1x 3x 7x 9x 9x 1x
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import {Target} from "../expressions/target";
import {Source} from "../expressions/source";
import {Dynamic} from "../expressions/dynamic";
import {StatementSyntax} from "../_statement_syntax";
import {BasicTypes} from "../basic_types";
import {UnknownType} from "../../types/basic";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {ReferenceType} from "../_reference";
 
export class CreateData implements StatementSyntax {
  public runSyntax(node: StatementNode, scope: CurrentScope, filename: string): void {
 
    for (const s of node.findDirectExpressions(Expressions.Source)) {
      new Source().runSyntax(s, scope, filename);
    }
 
    for (const t of node.findDirectExpressions(Expressions.Target)) {
      new Target().runSyntax(t, scope, filename);
    }
 
    for (const t of node.findDirectExpressions(Expressions.Dynamic)) {
      new Dynamic().runSyntax(t, scope, filename);
    }
 
    const type = node.findDirectExpression(Expressions.TypeName);
    if (type) {
      const found = new BasicTypes(filename, scope).resolveTypeName(type);
      if (found instanceof UnknownType) {
        if (node.concatTokens().toUpperCase().includes(" REF TO ")) {
          const def = scope.findObjectDefinition(type.concatTokens());
          if (def) {
            scope.addReference(type.getFirstToken(), def, ReferenceType.TypeReference, filename);
          } else {
            const identifier = new TypedIdentifier(type.getFirstToken(), filename, found);
            scope.addReference(type.getFirstToken(), identifier, ReferenceType.TypeReference, filename);
          }
        } else {
          const identifier = new TypedIdentifier(type.getFirstToken(), filename, found);
          scope.addReference(type.getFirstToken(), identifier, ReferenceType.TypeReference, filename);
        }
      }
    }
 
  }
}