Type.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 Type(RequiredReflectItem, Cloneable, Measureable, ObjectArray, AVTOOConstants)
{
    private static String getSpecialCanonicalName(RequiredReflectItem parentItem, String specialSimpleName) {
        String name = parentItem != null ? parentItem.specialCanonicalName : "";
        return name.isEmpty() ? specialSimpleName : (new StringBuilder() + name + '.' + specialSimpleName).toString();
    }

    private int fldFieldWidth;
    private int fldStackElements;
    private final Package fldParentPackage;

    package (Package parentPackage, int attributes, String specialSimpleName, Source source, int declarationPosition, int documentationPosition):
        super(parentPackage, attributes, specialSimpleName, getSpecialCanonicalName(parentPackage, specialSimpleName), source, declarationPosition, documentationPosition) {
        fldParentPackage = parentPackage;
    }

    public abstract boolean isAssignableFrom(Type anot);

    public abstract boolean isConvertableFrom(Type anot);

    public abstract boolean isCompatibleWith(Type anot);

    public abstract Type getScalarCommonType(Type anot);

    public abstract Type getVectorCommonType(Type anot);

    public boolean isVisibleFrom(ClassType type) {
        if(type == null)
        {
            throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "type" }));
        }
        if(type.parentProgramme != parentProgramme)
        {
            throw new IllegalArgumentException(package.getResourceString("type.not-same-programme.package"));
        }
        switch(visibility)
        {
        default:
            /* Недостижимый код. Нужен только для того, чтобы избежать сообщений об ошибках от компилятора. */
            throw new IllegalMemberStateException(/*этот член имеет неизвестную видимость*/);
        case PUBLIC:
        case PUBLISHED:
            ReflectItem pack = parentPackage;
            return pack == null || pack.isVisibleFrom(type);
        case PROTECTED:
        case PACKAGE:
        case RESERVED_PACKAGE:
            Object pack = parentPackage;
            return pack != null && pack == type.parentPackage;
        case PRIVATE:
        case SOURCE:
        case RESERVED_SOURCE:
            Source src = source;
            Object pack = parentPackage;
            return pack != null && pack == type.parentPackage && src != null && src.isSameSource(type.source);
        }
    }

    public void makeCompilable() {  }

    public boolean isCompilable() { return true; }

    public boolean isNull() { return false; }

    public boolean isArray() { return false; }

    public boolean isClass() { return false; }

    public boolean isStruct() { return false; }

    public boolean isService() { return false; }

    public boolean isInterface() { return false; }

    public boolean isHelper() { return false; }

    public boolean isPrimitive() { return false; }

    public boolean isVoid() { return false; }

    public boolean isBoolean() { return false; }

    public boolean isChar() { return false; }

    public boolean isInt() { return false; }

    public boolean isLong() { return false; }

    public boolean isVector() { return false; }

    public boolean isNumeric() { return false; }

    public boolean isFloating() { return false; }

    public boolean isStackable() { return true; }

    public int toStackable() { return kind; }

    public Type getRealType() { return this; }

    public abstract int kind { read }

    public final int fieldWidth { read = fldFieldWidth }

    public final int stackElements { read = fldStackElements }

    public final Package parentPackage { read = fldParentPackage }

    protected abstract String composeRecompilableName();

    protected abstract String composeFasmSimpleName();

    protected abstract String composeFasmFullName();

    protected abstract String composeFasmFileName();

    protected abstract int computeFieldWidth();

    protected void afterConstruction() {
        super.afterConstruction();
        int width = fldFieldWidth = computeFieldWidth();
        fldStackElements = (width + (-width & 0x0f)) >> 4;
    }
}