import { PropriedadeClasse } from '../../declaracoes';
import { InterpretadorInterface, SimboloInterface } from '../../interfaces';
import { Chamavel } from './chamavel';
import { DeleguaFuncao } from './delegua-funcao';
import { MetodoPolimorfico } from './metodo-polimorfico';
import { ObjetoDeleguaClasse } from './objeto-delegua-classe';
/**
 * Descritor de tipo de classe. Quando uma declaração de classe é visitada, o que
 * vai para a pilha de escopos de execução é esta estrutura. Quando uma nova instância
 * de classe é criada, a referência para a instância é implementada aqui.
 */
export declare class DescritorTipoClasse extends Chamavel {
    simboloOriginal: SimboloInterface | undefined;
    superClasses: DescritorTipoClasse[];
    /** OReM (Ordem de Resolução de Métodos, ou _Method Resolution Order_) calculado via C3.
     * Inclui a própria classe como primeiro elemento. */
    orem: DescritorTipoClasse[];
    metodos: {
        [nome: string]: DeleguaFuncao | DeleguaFuncao[];
    };
    metodosEstaticos: {
        [nome: string]: DeleguaFuncao | DeleguaFuncao[];
    };
    membrosEstaticos: {
        [nome: string]: any;
    };
    obtenedores: {
        [nome: string]: DeleguaFuncao;
    };
    definidores: {
        [nome: string]: DeleguaFuncao;
    };
    obtenedoresEstaticos: {
        [nome: string]: DeleguaFuncao;
    };
    definidoresEstaticos: {
        [nome: string]: DeleguaFuncao;
    };
    propriedades: PropriedadeClasse[];
    dialetoRequerExpansaoPropriedadesEspacoMemoria: boolean;
    dialetoRequerDeclaracaoPropriedades: boolean;
    abstrata: boolean;
    estrangeira: boolean;
    classeEstatica: boolean;
    metodosAbstratos: string[];
    acessoMetodos: {
        [nome: string]: 'privado' | 'protegido' | 'publico';
    };
    acessoPropriedades: {
        [nome: string]: 'privado' | 'protegido' | 'publico';
    };
    sombrearPropriedadesDeClasse: boolean;
    /** Obtenedor de compat: primeiro pai direto (usado por tradutores e partes do interpretador). */
    get superClasse(): DescritorTipoClasse | null;
    /** Definidor de compat: atribui um único pai direto (usado pela atribuição implícita de OBJETO_BASE). */
    set superClasse(v: DescritorTipoClasse | null);
    constructor(simboloOriginal?: SimboloInterface, superClasses?: DescritorTipoClasse | DescritorTipoClasse[], metodos?: {
        [nome: string]: DeleguaFuncao | DeleguaFuncao[];
    }, propriedades?: PropriedadeClasse[]);
    private static mesclaC3;
    /** Calcula e armazena o OReM (linearização C3) para esta classe e retorna a lista resultante. */
    static computarOReM(cls: DescritorTipoClasse): DescritorTipoClasse[];
    /**
     * Verifica se todos os métodos abstratos da superclasse estão implementados
     * na subclasse fornecida. Lança erro em tempo de execução se algum faltar.
     */
    verificarImplementacaoAbstrata(subclasse: DescritorTipoClasse): void;
    encontrarObtenedor(nome: string, estatico?: boolean): DeleguaFuncao | undefined;
    encontrarDefinidor(nome: string, estatico?: boolean): DeleguaFuncao | undefined;
    obterEstatico(nome: string, visitante?: InterpretadorInterface): Promise<any>;
    definirEstatico(nome: string, valor: any, visitante?: InterpretadorInterface): Promise<void>;
    /**
     * Mescla sobrecargas da classe atual com as de ancestrais (respeitando MRO).
     * Sobrecargas da subclasse com mesma assinatura substituem as do ancestral.
     */
    private mesclarComSuperclasse;
    private obterSobrecargasDaSuperclasse;
    encontrarMetodo(nome: string): DeleguaFuncao | MetodoPolimorfico | undefined;
    encontrarPropriedade(nome: string): PropriedadeClasse | undefined;
    /**
     * Método utilizado por Delégua para representar esta classe quando impressa.
     * @returns {string} A representação da classe como texto.
     */
    paraTexto(): string;
    /**
     * Método utilizado pelo VSCode para inspecionar esta classe em depuração.
     * @returns {string} A representação da classe como texto.
     */
    toString(): string;
    aridade(): number;
    chamar(visitante: InterpretadorInterface, argumentos: any[]): Promise<ObjetoDeleguaClasse>;
}
//# sourceMappingURL=descritor-tipo-classe.d.ts.map