UNPKG

@abaplint/core

Version:
52 lines 2.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ClassImplementation = void 0; const _object_oriented_1 = require("../_object_oriented"); const basic_1 = require("../../types/basic"); const tokens_1 = require("../../1_lexer/tokens"); const _typed_identifier_1 = require("../../types/_typed_identifier"); const position_1 = require("../../../position"); const _builtin_1 = require("../_builtin"); const _scope_type_1 = require("../_scope_type"); const _syntax_input_1 = require("../_syntax_input"); class ClassImplementation { runSyntax(node, input) { const helper = new _object_oriented_1.ObjectOriented(input.scope); const className = helper.findClassName(node); input.scope.push(_scope_type_1.ScopeType.ClassImplementation, className, node.getFirstToken().getStart(), input.filename); const classDefinition = input.scope.findClassDefinition(className); if (classDefinition === undefined) { const message = "Class definition for \"" + className + "\" not found"; input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message)); return; } const types = classDefinition.getTypeDefinitions(); if (types !== undefined) { for (const t of types.getAll()) { input.scope.addType(t.type); } } const sup = input.scope.findClassDefinition(classDefinition.getSuperClass()); if (sup) { input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(new tokens_1.Identifier(new position_1.Position(1, 1), "super"), _builtin_1.BuiltIn.filename, new basic_1.ObjectReferenceType(sup))); } else { // todo: instead of the void type, do proper typing, ie. only empty constructor method input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(new tokens_1.Identifier(new position_1.Position(1, 1), "super"), _builtin_1.BuiltIn.filename, basic_1.VoidType.get("noSuper"))); } input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(new tokens_1.Identifier(new position_1.Position(1, 1), "me"), _builtin_1.BuiltIn.filename, new basic_1.ObjectReferenceType(classDefinition))); helper.addAliasedAttributes(classDefinition); // todo, this is not correct, take care of instance vs static helper.addAliasedTypes(classDefinition); const classAttributes = classDefinition.getAttributes(); if (classAttributes !== undefined) { input.scope.addList(classAttributes.getConstants()); input.scope.addList(classAttributes.getStatic()); for (const i of classAttributes.getInstance()) { input.scope.addExtraLikeType(i); } } helper.fromSuperClassesAndInterfaces(classDefinition); } } exports.ClassImplementation = ClassImplementation; //# sourceMappingURL=class_implementation.js.map