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