@abaplint/core
Version:
abaplint - Core API
52 lines • 2.98 kB
JavaScript
;
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