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 99x 99x 99x 99x 99x 99x 99x 99x 99x     99x 99x 99x 97x 97x 99x 99x 2x 2x 99x 45x 45x 99x     99x 99x 99x 1x 1x 98x 98x 98x 98x 98x 98x 98x 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;
  }
}