"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MontaoTipos = void 0;
const geracao_identificadores_1 = require("../geracao-identificadores");
const erro_avaliador_sintatico_1 = require("./erro-avaliador-sintatico");
/**
 * O montão de tipos é muito semelhante ao montão original do interpretador, mas
 * sua função é apenas armazenas informações de tipos de estruturas de dados
 * com N níveis de profundidade, como dicionários e objetos em Delégua.
 */
class MontaoTipos {
    constructor() {
        this.referencias = {};
    }
    /**
     * Adiciona uma nova referência ao montão de tipos, retornando seu endereço.
     * @param {any} objeto Qualquer objeto que pertença ao montão de tipos.
     * @returns {string} O endereço onde a referência foi registrada.
     */
    adicionarReferencia(objeto) {
        const novoEndereco = (0, geracao_identificadores_1.uuidv4)();
        this.referencias[novoEndereco] = objeto;
        return novoEndereco;
    }
    /**
     * Exclui referências do montão de tipos, normalmente por finalização de um
     * escopo de execução.
     * @param enderecos
     */
    excluirReferencias(...enderecos) {
        for (const endereco of enderecos) {
            delete this.referencias[endereco];
        }
    }
    /**
     * Obtém uma referência com base no símbolo executado e endereço da referência.
     * @param {number} hashArquivo O _hash_ correspondente ao caminho do arquivo em execução.
     * @param {number} linha A linha correspondente à declaração sendo executada.
     * @param {string} endereco O endereço da referência.
     * @returns {any} O objeto armazenado no endereço.
     */
    obterReferencia(hashArquivo, linha, endereco) {
        if (!(endereco in this.referencias)) {
            throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico({ hashArquivo, linha }, `Referência para montão de tipos com endereco ${endereco} não existe.`);
        }
        return this.referencias[endereco];
    }
}
exports.MontaoTipos = MontaoTipos;
//# sourceMappingURL=montao-tipos.js.map