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 8x 8x     8x 8x 8x 1x 1x 8x 8x 8x 8x 8x 8x 8x 8x 1x 1x 1x 8x 7x 7x 8x 8x         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")));
  }
}