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

100% Statements 47/47
100% Branches 10/10
100% Functions 1/1
100% Lines 47/47

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 471x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 734x 734x 734x 734x 734x 734x 734x 3x 3x 731x 734x 125x 125x 731x 731x 734x 149x 734x 582x 582x 582x 731x 731x 731x 731x 731x 731x 734x 81x 81x 731x 731x 731x 1x
import {StatementNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import {ObjectOriented} from "../_object_oriented";
import {ObjectReferenceType, VoidType} from "../../types/basic";
import {Identifier} from "../../1_lexer/tokens";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {Position} from "../../../position";
import {BuiltIn} from "../_builtin";
import {ScopeType} from "../_scope_type";
import {StatementSyntax} from "../_statement_syntax";
 
export class ClassImplementation implements StatementSyntax {
  public runSyntax(node: StatementNode, scope: CurrentScope, filename: string): void {
    const helper = new ObjectOriented(scope);
 
    const className = helper.findClassName(node);
    scope.push(ScopeType.ClassImplementation, className, node.getFirstToken().getStart(), filename);
 
    const classDefinition = scope.findClassDefinition(className);
    if (classDefinition === undefined) {
      throw new Error("Class definition for \"" + className + "\" not found");
    }
 
    for (const t of classDefinition.getTypeDefinitions().getAll()) {
      scope.addType(t.type);
    }
 
    const sup = scope.findClassDefinition(classDefinition.getSuperClass());
    if (sup) {
      scope.addIdentifier(new TypedIdentifier(new Identifier(new Position(1, 1), "super"), BuiltIn.filename, new ObjectReferenceType(sup)));
    } else {
      // todo: instead of the void type, do proper typing, ie. only empty constructor method
      scope.addIdentifier(new TypedIdentifier(new Identifier(new Position(1, 1), "super"), BuiltIn.filename, new VoidType("noSuper")));
    }
    scope.addIdentifier(new TypedIdentifier(new Identifier(new Position(1, 1), "me"), BuiltIn.filename, new ObjectReferenceType(classDefinition)));
    helper.addAliasedAttributes(classDefinition); // todo, this is not correct, take care of instance vs static
 
    const classAttributes = classDefinition.getAttributes();
    scope.addList(classAttributes.getConstants());
    scope.addList(classAttributes.getStatic());
    for (const i of classAttributes.getInstance()) {
      scope.addExtraLikeType(i);
    }
 
    helper.fromSuperClassesAndInterfaces(classDefinition);
  }
}