"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjetoDeleguaClasse = void 0;
const excecoes_1 = require("../../excecoes");
/**
 * A instância de uma classe em Delégua.
 * Possui propriedades e métodos. Propriedades são definidas localmente.
 * Métodos são extraídos do descritor da classe, uma `DeleguaClasse`.
 */
class ObjetoDeleguaClasse {
    constructor(classe) {
        this.classe = classe;
        this.propriedades = {};
        if (this.classe.superClasse) {
            for (let propriedade of this.classe.superClasse.propriedades) {
                this.propriedades[propriedade.nome.lexema] = undefined;
            }
        }
        for (let propriedade of classe.propriedades) {
            this.propriedades[propriedade.nome.lexema] = undefined;
        }
    }
    obter(simbolo) {
        if (this.propriedades.hasOwnProperty(simbolo.lexema)) {
            return this.propriedades[simbolo.lexema];
        }
        const metodo = this.classe.encontrarMetodo(simbolo.lexema);
        if (metodo)
            return metodo.funcaoPorMetodoDeClasse(this);
        throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Método ou propriedade "${simbolo.lexema}" não existe neste objeto.`);
    }
    obterMetodo(nomeMetodo) {
        const metodo = this.classe.encontrarMetodo(nomeMetodo);
        if (metodo)
            return metodo.funcaoPorMetodoDeClasse(this);
        throw new excecoes_1.ErroEmTempoDeExecucao(null, `Método "${nomeMetodo}" não existe neste objeto.`);
    }
    obterPropriedade(nomePropriedade) {
        if (this.propriedades.hasOwnProperty(nomePropriedade)) {
            return this.propriedades[nomePropriedade];
        }
        throw new excecoes_1.ErroEmTempoDeExecucao(null, `Propriedade "${nomePropriedade}" não existe neste objeto.`);
    }
    definir(simbolo, valor) {
        if (this.classe.dialetoRequerDeclaracaoPropriedades &&
            !this.propriedades.hasOwnProperty(simbolo.lexema)) {
            throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Propriedade "${simbolo.lexema}" não foi definida na declaração da classe ${this.classe.simboloOriginal.lexema}.`);
        }
        this.propriedades[simbolo.lexema] = valor;
    }
    /**
     * Método utilizado por Delégua para inspecionar este objeto em depuração.
     * @returns {string} A representação do objeto como texto.
     */
    paraTexto() {
        return '<objeto nome=' + this.classe.simboloOriginal.lexema + ' />';
    }
    /**
     * Método utilizado pelo VSCode para representar este objeto quando impresso.
     * @returns {string} A representação do objeto como texto.
     */
    toString() {
        return this.paraTexto();
    }
}
exports.ObjetoDeleguaClasse = ObjetoDeleguaClasse;
//# sourceMappingURL=objeto-delegua-classe.js.map