CodeGenerator.avt

Переключить прокрутку окна
Загрузить этот исходный код

/*
    Генератор кода для языка программирования
    Объектно-ориентированный продвинутый векторный транслятор

    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 }
}