"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.InterfaceDeclaracao = exports.AssinaturaMetodo = void 0;
const declaracao_1 = require("./declaracao");
/**
 * Assinatura de um método em uma declaração de interface.
 * Contém apenas nome e parâmetros — sem corpo.
 */
class AssinaturaMetodo {
    constructor(nome, parametros = [], tipoRetorno) {
        this.nome = nome;
        this.parametros = parametros;
        this.tipoRetorno = tipoRetorno;
    }
}
exports.AssinaturaMetodo = AssinaturaMetodo;
/**
 * Declaração de uma interface.
 * Define um contrato de métodos e propriedades que as classes implementadoras devem respeitar.
 * A verificação é feita em tempo de análise sintática (parse-time), não em tempo de execução.
 */
class InterfaceDeclaracao extends declaracao_1.Declaracao {
    constructor(simbolo, metodos = [], propriedades = []) {
        super(Number(simbolo.linha), simbolo.hashArquivo);
        this.simbolo = simbolo;
        this.metodos = metodos;
        this.propriedades = propriedades;
    }
    async aceitar(visitante) {
        return await visitante.visitarDeclaracaoInterface(this);
    }
    paraTexto() {
        let resultado = `<interface nome=${this.simbolo.lexema}>`;
        for (const prop of this.propriedades) {
            resultado += prop.paraTexto();
        }
        for (const metodo of this.metodos) {
            resultado += `<assinatura-metodo nome=${metodo.nome.lexema} />`;
        }
        resultado += `</interface>`;
        return resultado;
    }
}
exports.InterfaceDeclaracao = InterfaceDeclaracao;
//# sourceMappingURL=interface.js.map