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

92.15% Statements 47/51
66.66% Branches 6/9
100% Functions 1/1
92.15% Lines 47/51

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 511x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 93x 93x 93x 93x 93x 93x 93x 93x 93x     93x 93x 93x 91x 91x 93x 93x 2x 2x 93x 41x 41x 93x     93x 93x 93x 1x 1x 92x 92x 92x 92x 92x 92x 92x 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,
    targetType?: AbstractType): 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 (targetType !== undefined) {
      type = targetType;
    }
    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;
  }
}