"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GerenciadorEscopos = void 0;
class GerenciadorEscopos {
    constructor() {
        this.escopos = [];
        // Escopo global
        this.empilharEscopo();
    }
    empilharEscopo() {
        this.escopos.push(new Map());
    }
    desempilharEscopo() {
        return this.escopos.pop();
    }
    declarar(nome, variavel) {
        const escopoAtual = this.escopos[this.escopos.length - 1];
        // Verifica se já existe no escopo atual
        if (escopoAtual.has(nome)) {
            return false; // Já declarada no escopo atual
        }
        escopoAtual.set(nome, variavel);
        return true;
    }
    buscar(nome) {
        // Busca do escopo mais interno para o mais externo
        for (let i = this.escopos.length - 1; i >= 0; i--) {
            const variavel = this.escopos[i].get(nome);
            if (variavel) {
                return variavel;
            }
        }
        return undefined;
    }
    buscarNoEscopoAtual(nome) {
        const escopoAtual = this.escopos[this.escopos.length - 1];
        return escopoAtual.get(nome);
    }
    marcarComoInicializada(nome, valor) {
        const variavel = this.buscar(nome);
        if (variavel) {
            variavel.inicializada = true;
            variavel.usada = true;
            if (valor !== undefined) {
                variavel.valor = this.extrairValor(valor);
            }
        }
    }
    extrairValor(construto) {
        if (construto === null || construto === undefined) {
            return undefined;
        }
        if (construto.hasOwnProperty('valor')) {
            return construto.valor;
        }
        return construto;
    }
    marcarComoUsada(nome) {
        const variavel = this.buscar(nome);
        if (variavel) {
            variavel.usada = true;
        }
    }
    obterVariaveisNaoUsadas() {
        const naoUsadas = [];
        for (let escopo of this.escopos) {
            for (let variavel of escopo.values()) {
                if (!variavel.usada) {
                    naoUsadas.push(variavel);
                }
            }
        }
        return naoUsadas;
    }
}
exports.GerenciadorEscopos = GerenciadorEscopos;
//# sourceMappingURL=gerenciador-escopos.js.map