"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeleguaFuncaoNativa = void 0;
const delegua_funcao_1 = require("./delegua-funcao");
/**
 * Uma função nativa que implementa lógica em TypeScript em vez de código Delégua.
 * Usada internamente para métodos embutidos como os da classe base `Objeto`.
 */
class DeleguaFuncaoNativa extends delegua_funcao_1.DeleguaFuncao {
    constructor(nome, aridade, funcaoASerChamada) {
        super(nome, null, undefined, false);
        this._aridade = aridade;
        this.funcaoASerChamada = funcaoASerChamada;
    }
    aridade() {
        return this._aridade;
    }
    async chamar(visitante, argumentos) {
        var _a, _b;
        // Argumentos chegam como ArgumentoInterface = { nome, valor: VariavelInterface }.
        // VariavelInterface tem a forma { tipo, valor: valorReal, imutavel }.
        // Usamos o método resolverValor() do interpretador para remover ambas as camadas de encapsulamento.
        const resolver = (_b = (_a = visitante.resolverValor) === null || _a === void 0 ? void 0 : _a.bind(visitante)) !== null && _b !== void 0 ? _b : ((v) => v);
        const args = argumentos.map((a) => {
            const nivel1 = a && Object.prototype.hasOwnProperty.call(a, 'valor') ? a.valor : a;
            return resolver(nivel1);
        });
        return await this.funcaoASerChamada(this.instancia, args);
    }
    funcaoPorMetodoDeClasse(instancia) {
        const nativa = new DeleguaFuncaoNativa(this.nome, this._aridade, this.funcaoASerChamada);
        nativa.instancia = instancia;
        return nativa;
    }
    paraTexto() {
        return `<função-nativa nome=${this.nome} />`;
    }
    toString() {
        return this.paraTexto();
    }
}
exports.DeleguaFuncaoNativa = DeleguaFuncaoNativa;
//# sourceMappingURL=delegua-funcao-nativa.js.map