/*
Генератор кода для языка программирования
Объектно-ориентированный продвинутый векторный транслятор
Copyright © 2021, 2024 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Стандартной
общественной лицензии GNU.
Вы должны были получить копию Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package ru.malik.elaborarer.avtoo.generator;
import avt.io.*;
import avt.util.*;
import platform.independent.filesystem.*;
import ru.malik.elaborarer.avtoo.compiler.*;
import ru.malik.elaborarer.avtoo.lang.*;
public abstract class CodeGenerator(ImmediateBuilder, AVTOOConstants, AVTOORecompilable, AVTOOService)
{
public static void createImmediateDirectories(FileSystem fileSystem, String directoryPath, String relativePath) throws IOException {
if(fileSystem == null)
{
fileSystem = Platform.instance.localFileSystem;
}
for(ObjectAttributes attributes = new ObjectAttributes(fileSystem), int index = -1; (index = relativePath.indexOf('/', index + 1)) >= 0; )
{
String directoryName = directoryPath + relativePath.substring(0, index);
if(!fileSystem.isObjectExists(directoryName))
{
fileSystem.createDirectory(directoryName);
continue;
}
fileSystem.readAttributes(directoryName, attributes);
if(!attributes.directory) fileSystem.createDirectory(directoryName);
}
}
public static String prepareDestinationPath(FileSystem fileSystem, String destinationPath) throws IOException {
if(fileSystem == null)
{
fileSystem = Platform.instance.localFileSystem;
}
if(!fileSystem.isObjectExists(destinationPath))
{
fileSystem.createDirectory(destinationPath);
return destinationPath + '/';
}
ObjectAttributes attributes = new ObjectAttributes(fileSystem);
fileSystem.readAttributes(destinationPath, attributes);
if(!attributes.directory)
{
fileSystem.createDirectory(destinationPath);
return destinationPath + '/';
}
clearDirectory(fileSystem, destinationPath = destinationPath + '/');
return destinationPath;
}
private static void clearDirectory(FileSystem fileSystem, String directoryPath) throws IOException {
Vector dirs = new Vector();
Vector files = new Vector();
with(fileSystem.findFirst(directoryPath)) try
{
do
{
String name = name;
if(!name.equals(".") && !name.equals("..")) (directory ? dirs : files) + name;
} while(findNext());
} finally
{
close();
}
for(int length = dirs.length, int index = 0; index < length; index++)
{
String dir = directoryPath + dirs[index].toString();
clearDirectory(fileSystem, dir + '/');
fileSystem.deleteDirectory(dir);
}
for(int length = files.length, int index = 0; index < length; index++)
{
fileSystem.deleteFile(directoryPath + files[index].toString());
}
}
protected (int pointerSize, boolean library): super(pointerSize, false, library) { }
public abstract String overwritten { read }
public final boolean library { read = super.library }
public final boolean staticFieldsOnly { read = false }
}