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

85% Statements 34/40
55.55% Branches 5/9
100% Functions 1/1
85% Lines 34/40

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 401x 1x 1x 1x 1x 1x 1x 1x 1x 1x 12x 12x     12x 12x 12x 1x 1x 12x 12x 12x 12x 12x 12x 12x 12x 1x 1x 1x 12x 11x 11x 12x 12x         1x
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {IdentifierMeta, TypedIdentifier} from "../../types/_typed_identifier";
import {StatementSyntax} from "../_statement_syntax";
import {UnknownType} from "../../types/basic/unknown_type";
import {ScopeType} from "../_scope_type";
import {SyntaxInput} from "../_syntax_input";
 
export class Tables implements StatementSyntax {
  public runSyntax(node: StatementNode, input: SyntaxInput): void {
    const nameToken = node.findFirstExpression(Expressions.Field)?.getFirstToken();
    if (nameToken === undefined) {
      return undefined;
    }
 
    let name = nameToken.getStr();
    if (name.startsWith("*")) {
      name = name.substring(1);
    }
 
    // lookupTableOrView will also give Unknown and Void
    const found = input.scope.getDDIC()?.lookupTableOrView(name);
    if (found) {
      input.scope.getDDICReferences().addUsing(input.scope.getParentObj(),
                                               {object: found.object, filename: input.filename, token: nameToken});
 
      if (input.scope.getType() === ScopeType.Form || input.scope.getType() === ScopeType.FunctionModule) {
        // hoist TABLES definitions to global scope
        input.scope.addNamedIdentifierToParent(nameToken.getStr(),
                                               new TypedIdentifier(nameToken, input.filename, found.type, [IdentifierMeta.Tables]));
      } else {
        input.scope.addIdentifier(new TypedIdentifier(nameToken, input.filename, found.type, [IdentifierMeta.Tables]));
      }
      return;
    }

    // this should never happen,
    input.scope.addIdentifier(new TypedIdentifier(nameToken, input.filename, new UnknownType("Tables, fallback")));
  }
}