"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.OBJETO_BASE = void 0;
const descritor_tipo_classe_1 = require("./descritor-tipo-classe");
const delegua_funcao_nativa_1 = require("./delegua-funcao-nativa");
const simboloObjeto = {
    tipo: 'IDENTIFICADOR',
    lexema: 'Objeto',
    literal: null,
    linha: 0,
    hashArquivo: -1,
};
function criarDescritorObjeto() {
    const descritor = new descritor_tipo_classe_1.DescritorTipoClasse(simboloObjeto, null, {});
    descritor.metodos['paraTexto'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('paraTexto', 0, (instancia) => {
        var _a, _b, _c, _d, _e, _f;
        const nome = (_c = (_b = (_a = instancia === null || instancia === void 0 ? void 0 : instancia.classe) === null || _a === void 0 ? void 0 : _a.simboloOriginal) === null || _b === void 0 ? void 0 : _b.lexema) !== null && _c !== void 0 ? _c : 'Objeto';
        const nomesMetodos = Object.keys((_e = (_d = instancia === null || instancia === void 0 ? void 0 : instancia.classe) === null || _d === void 0 ? void 0 : _d.metodos) !== null && _e !== void 0 ? _e : {}).join(', ');
        const nomesPropriedades = Object.keys((_f = instancia === null || instancia === void 0 ? void 0 : instancia.propriedades) !== null && _f !== void 0 ? _f : {}).join(', ');
        return `<[ ${nome} métodos=[${nomesMetodos}] propriedades=[${nomesPropriedades}] ]>`;
    });
    descritor.metodos['tipo'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('tipo', 0, (instancia) => {
        var _a, _b, _c;
        return (_c = (_b = (_a = instancia === null || instancia === void 0 ? void 0 : instancia.classe) === null || _a === void 0 ? void 0 : _a.simboloOriginal) === null || _b === void 0 ? void 0 : _b.lexema) !== null && _c !== void 0 ? _c : 'Objeto';
    });
    descritor.metodos['igual'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('igual', 1, (instancia, args) => {
        return instancia === args[0];
    });
    const implementacaoEInstanciaDe = (instancia, args) => {
        if (!instancia)
            return false;
        const classeAlvo = args[0];
        if (!(classeAlvo instanceof descritor_tipo_classe_1.DescritorTipoClasse))
            return false;
        let cls = instancia.classe;
        while (cls) {
            if (cls === classeAlvo)
                return true;
            cls = cls.superClasse;
        }
        return false;
    };
    descritor.metodos['eInstanciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('eInstanciaDe', 1, implementacaoEInstanciaDe);
    descritor.metodos['éInstânciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('éInstânciaDe', 1, implementacaoEInstanciaDe);
    const implementacaoMetodos = (instancia) => {
        if (!instancia)
            return [];
        const nomes = [];
        let cls = instancia.classe;
        while (cls) {
            for (const nome of Object.keys(cls.metodos)) {
                if (!nomes.includes(nome))
                    nomes.push(nome);
            }
            cls = cls.superClasse;
        }
        return nomes;
    };
    descritor.metodos['metodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('metodos', 0, implementacaoMetodos);
    descritor.metodos['métodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('métodos', 0, implementacaoMetodos);
    descritor.metodos['propriedades'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('propriedades', 0, (instancia) => {
        if (!instancia)
            return [];
        return Object.keys(instancia.propriedades);
    });
    descritor.metodos['respondeA'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('respondeA', 1, (instancia, args) => {
        if (!instancia)
            return false;
        const nome = String(args[0]);
        return instancia.classe.encontrarMetodo(nome) !== undefined;
    });
    return descritor;
}
exports.OBJETO_BASE = criarDescritorObjeto();
//# sourceMappingURL=objeto-base.js.map