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

90.69% Statements 39/43
72.72% Branches 8/11
100% Functions 1/1
90.69% Lines 39/43

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 431x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 83x 83x 83x 83x     83x 83x 83x 81x 81x 82x 83x 2x 2x 83x     82x 82x 83x 1x 1x 81x 81x 81x 81x 81x 81x 81x 1x
import {ExpressionNode, StatementNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import {TypedIdentifier, IdentifierMeta} from "../../types/_typed_identifier";
import {Source} from "./source";
import * as Expressions from "../../2_statements/expressions";
import {AbstractType} from "../../types/basic/_abstract_type";
import {BasicTypes} from "../basic_types";
import {UnknownType} from "../../types/basic/unknown_type";
import {ReferenceType} from "../_reference";
 
export class InlineFieldDefinition {
  public runSyntax(node: ExpressionNode | StatementNode, scope: CurrentScope, filename: string): AbstractType | undefined {
    let type: AbstractType | undefined = undefined;
 
    const field = node.findDirectExpression(Expressions.Field)?.getFirstToken();
    if (field === undefined) {
      return undefined;
    }
 
    const source = node.findDirectExpression(Expressions.Source);
    if (source) {
      type = new Source().runSyntax(source, scope, filename);
    }
    const typeName = node.findDirectExpression(Expressions.TypeName);
    if (typeName) {
      type = new BasicTypes(filename, scope).parseType(typeName);
    }
    if (type === undefined) {
      type = new UnknownType("InlineFieldDefinition, fallback");
    }
 
    const name = field.getStr();
    if (scope.findVariable(name) !== undefined) {
      throw new Error(`Variable ${name} already defined`);
    }
 
    const identifier = new TypedIdentifier(field, filename, type, [IdentifierMeta.InlineDefinition]);
    scope.addReference(field, identifier, ReferenceType.DataWriteReference, filename);
    scope.addIdentifier(identifier);
 
    return type;
  }
}