/*
Компилятор языка программирования
Объектно-ориентированный продвинутый векторный транслятор
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;
}
}