OverriddableMember.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Компилятор языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    Copyright © 2021, 2024 Малик Разработчик

    Это свободная программа: вы можете перераспространять ее и/или изменять
    ее на условиях Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она будет полезной,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <https://www.gnu.org/licenses/>.
*/

package ru.malik.elaborarer.avtoo.lang;

import avt.lang.array.*;

public abstract class OverriddableMember(Member, Cloneable, Measureable, ObjectArray, TypedItem, TypedMember, AVTOOConstants)
{
    public static final int TYPE         = 1;
    public static final int TYPE_ONLY    = 1;
    public static final int SUPERCLASSES = 2;
    public static final int SUPERTYPES   = 4;

    private final Type fldType;

    package (ClassType parentType, int attributes, Type type, String specialSimpleName, int declarationPosition, int documentationPosition):
        super(parentType, attributes, specialSimpleName, declarationPosition, documentationPosition) {
        fldType = type;
    }

    public boolean isOverrides(OverriddableMember anot) {
        if(anot == null)
        {
            throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "anot" }));
        }
        return this == anot || getClass() == anot.getClass() && !isStatic() && !anot.isStatic() && specialSimpleName.equals(anot.specialSimpleName);
    }

    public final OverriddableMember overridesIn(ClassType type, int place) {
        if(type == null)
        {
            throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "type" }));
        }
        switch(place)
        {
        default:
            throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "place" }));
        case TYPE_ONLY:
            return directOverridesIn(type);
        case SUPERTYPES:
        case SUPERTYPES | SUPERCLASSES:
            int index = -1;
            int length = type.getSuperservicesLength();
            ClassType current = type.getSuperclassType();
            if(current == null && length > 0)
            {
                current = type.getSuperserviceTypeAt(0);
                index = 1;
            }
            while(current != null)
            {
                OverriddableMember result = directOverridesIn(current);
                if(result != null)
                {
                    return result;
                }
                if(index < 0 && (current = current.getSuperclassType()) == null)
                {
                    index = 0;
                }
                if(index >= 0)
                {
                    current = index >= length ? null : type.getSuperserviceTypeAt(index);
                    index++;
                }
            }
            return null;
        case TYPE | SUPERTYPES:
        case TYPE | SUPERTYPES | SUPERCLASSES:
            int index = -1;
            int length = type.getSuperservicesLength();
            ClassType current = type;
            do
            {
                OverriddableMember result = directOverridesIn(current);
                if(result != null)
                {
                    return result;
                }
                if(index < 0 && (current = current.getSuperclassType()) == null)
                {
                    index = 0;
                }
                if(index >= 0)
                {
                    current = index >= length ? null : type.getSuperserviceTypeAt(index);
                    index++;
                }
            } while(current != null);
            return null;
        case SUPERCLASSES:
            for(ClassType current = type.getSuperclassType(); current != null; current = current.getSuperclassType())
            {
                OverriddableMember result = directOverridesIn(current);
                if(result != null) return result;
            }
            return null;
        case TYPE | SUPERCLASSES:
            ClassType current = type;
            do
            {
                OverriddableMember result = directOverridesIn(current);
                if(result != null) return result;
            } while((current = current.getSuperclassType()) != null);
            return null;
        }
    }

    public final Type type { read = fldType }

    protected abstract String composeFasmSimpleName();

    protected abstract String composeFasmFullName();

    protected String composeRecompilableName() { return specialSimpleName; }

    private OverriddableMember directOverridesIn(ClassType type) {
        for(ProgrammeItem current = type.getChildItem(specialSimpleName); current != null; current = current.nextItem) if(current instanceof OverriddableMember)
        {
            OverriddableMember overrides = (OverriddableMember) current;
            if(isOverrides(overrides)) return overrides;
        }
        return null;
    }
}