"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Classe = void 0;
const declaracao_1 = require("./declaracao");
class Classe extends declaracao_1.Declaracao {
    /** Compat com tradutores e analisador semântico que ainda usam .superClasse */
    get superClasse() {
        var _a;
        return (_a = this.superClasses[0]) !== null && _a !== void 0 ? _a : null;
    }
    constructor(simbolo, superClasses = [], metodos, propriedades = [], decoradores = [], abstrata = false, classeEstatica = false, implementa = [], mesclas = []) {
        super(Number(simbolo.linha), simbolo.hashArquivo);
        this.simbolo = simbolo;
        this.superClasses = superClasses;
        this.mesclas = mesclas;
        this.metodos = metodos;
        this.propriedades = propriedades;
        this.decoradores = decoradores;
        this.abstrata = abstrata;
        this.classeEstatica = classeEstatica;
        this.implementa = implementa;
    }
    async aceitar(visitante) {
        return await visitante.visitarDeclaracaoClasse(this);
    }
    paraTexto() {
        let resultado = `<classe nome=${this.simbolo.lexema} `;
        if (this.superClasses.length > 0) {
            resultado += `herda=${this.superClasses.map((s) => { var _a, _b; return (_b = (_a = s === null || s === void 0 ? void 0 : s.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : s; }).join(', ')} `;
        }
        if (this.mesclas.length > 0) {
            resultado += `mescla=${this.mesclas.map((m) => { var _a, _b; return (_b = (_a = m === null || m === void 0 ? void 0 : m.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : m; }).join(', ')} `;
        }
        resultado += '>';
        for (const propriedade of this.propriedades) {
            resultado += `${propriedade.paraTexto()}`;
        }
        for (const metodo of this.metodos) {
            resultado += `${metodo.paraTexto()}`;
        }
        resultado += `</classe>`;
        return resultado;
    }
}
exports.Classe = Classe;
//# sourceMappingURL=classe.js.map