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

90.69% Statements 39/43
70% Branches 7/10
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 66x 66x 66x 66x     66x 66x 66x 65x 65x 65x 66x 1x 1x 66x     65x 65x 66x 1x 1x 64x 64x 64x 64x 64x 64x 64x 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;
  }
}