/*
Компилятор языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Стандартной
общественной лицензии GNU.
Вы должны были получить копию Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package ru.malik.elaborarer.avtoo.lang;
import avt.lang.array.*;
import platform.independent.filesystem.*;
public class Library(ProgrammeItem, Cloneable, Measureable, ObjectArray, AVTOOConstants)
{
private final boolean fldApplication;
private final ClassTypeArray fldClassesArray;
private final SourceArray fldSourcesArray;
private final FileSystem fldFileSystem;
private final String fldDirectoryPath;
public (Programme parentProgramme, FileSystem fileSystem, String directoryPath, boolean application): super(parentProgramme, AVTOOService.getObjectName(directoryPath)) {
fldApplication = application;
fldClassesArray = new ClassTypeArray();
fldSourcesArray = new SourceArray();
fldFileSystem = fileSystem != null ? fileSystem : Platform.instance.localFileSystem;
fldDirectoryPath = directoryPath == null ? "/" : directoryPath.endsWith("/") ? directoryPath : directoryPath + "/";
}
public Source createSource(String relativePath, String type) {
if(type == null)
{
throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "type" }));
}
Programme programme = parentProgramme;
Source result = programme == null ? null : programme.newSource(this, relativePath, type);
label0: if(result == null)
{
if(type.equals(TEXT_SOURCE))
{
result = new TextSource(this, relativePath);
break label0;
}
if(type.equals(BINARY_SOURCE))
{
result = new BinarySource(this, relativePath);
break label0;
}
throw new IllegalArgumentException(String.format(avt.lang.package.getResourceString("illegal-argument"), new Object[] { "type" }));
}
appendSource(result);
return result;
}
public Package createPackage(int visibility, String specialCanonicalName, Source source, int declarationPosition, int documentationPosition) {
if(source != null && fldSourcesArray.indexOf(source) < 0)
{
throw new IllegalArgumentException(package.getResourceString("library.source.not-owned-by"));
}
Programme programme = parentProgramme;
Package result = programme == null ? null : programme.newPackage(this, visibility, specialCanonicalName, source, declarationPosition, documentationPosition);
if(result == null) result = new Package(this, visibility, specialCanonicalName, source, declarationPosition, documentationPosition);
appendChildItem(result);
if(programme != null) programme.appendPackage(result);
return result;
}
public final Package getChildItem(String specialCanonicalName) { return (Package) super.getChildItem(specialCanonicalName); }
public final Package getChildItem(String specialCanonicalName, boolean ignoreCase) { return (Package) super.getChildItem(specialCanonicalName, ignoreCase); }
public final Package getChildPackage(String specialCanonicalName) { return (Package) super.getChildItem(specialCanonicalName); }
public final Package getChildPackage(String specialCanonicalName, boolean ignoreCase) { return (Package) super.getChildItem(specialCanonicalName, ignoreCase); }
public final boolean application { read = fldApplication }
public final ClassTypeArray classes { read = fldClassesArray }
public final SourceArray sources { read = fldSourcesArray }
public final FileSystem fileSystem { read = fldFileSystem }
public final String directoryPath { read = fldDirectoryPath }
public final Package operator [](int index) { return (Package) super.operator [](index); }
protected void insertChildItem(ProgrammeItem item, int position) {
if(item != null && !(item instanceof Package))
{
throw new IllegalArgumentException(package.getResourceString("adding-item.not-a-package"));
}
super.insertChildItem(item, position);
}
protected void appendClass(ClassType item) {
if(item == null)
{
throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "item" }));
}
fldClassesArray.append(item);
}
protected void appendSource(Source item) {
if(item == null)
{
throw new NullPointerException(String.format(avt.lang.package.getResourceString("null-pointer.argument"), new Object[] { "item" }));
}
fldSourcesArray.append(item);
}
}