@designliquido/delegua
Version:
Linguagem de programação simples e moderna usando português estruturado.
66 lines • 2.82 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjetoDeleguaClasse = void 0;
const excecoes_1 = require("../excecoes");
/**
* A instância de uma classe em Delégua.
* Possui propriedades e métodos. Propriedades são definidas localmente.
* Métodos são extraídos do descritor da classe, uma `DeleguaClasse`.
*/
class ObjetoDeleguaClasse {
constructor(classe) {
this.classe = classe;
this.propriedades = {};
if (this.classe.superClasse) {
for (let propriedade of this.classe.superClasse.propriedades) {
this.propriedades[propriedade.nome.lexema] = undefined;
}
}
for (let propriedade of classe.propriedades) {
this.propriedades[propriedade.nome.lexema] = undefined;
}
}
obter(simbolo) {
if (this.propriedades.hasOwnProperty(simbolo.lexema)) {
return this.propriedades[simbolo.lexema];
}
const metodo = this.classe.encontrarMetodo(simbolo.lexema);
if (metodo)
return metodo.funcaoPorMetodoDeClasse(this);
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Método ou propriedade "${simbolo.lexema}" não existe neste objeto.`);
}
obterMetodo(nomeMetodo) {
const metodo = this.classe.encontrarMetodo(nomeMetodo);
if (metodo)
return metodo.funcaoPorMetodoDeClasse(this);
throw new excecoes_1.ErroEmTempoDeExecucao(null, `Método "${nomeMetodo}" não existe neste objeto.`);
}
obterPropriedade(nomePropriedade) {
if (this.propriedades.hasOwnProperty(nomePropriedade)) {
return this.propriedades[nomePropriedade];
}
throw new excecoes_1.ErroEmTempoDeExecucao(null, `Propriedade "${nomePropriedade}" não existe neste objeto.`);
}
definir(simbolo, valor) {
if (this.classe.dialetoRequerDeclaracaoPropriedades && !this.propriedades.hasOwnProperty(simbolo.lexema)) {
throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Propriedade "${simbolo.lexema}" não foi definida na declaração da classe ${this.classe.simboloOriginal.lexema}.`);
}
this.propriedades[simbolo.lexema] = valor;
}
/**
* Método utilizado por Delégua para inspecionar este objeto em depuração.
* @returns {string} A representação do objeto como texto.
*/
paraTexto() {
return '<Objeto ' + this.classe.simboloOriginal.lexema + '>';
}
/**
* Método utilizado pelo VSCode para representar este objeto quando impresso.
* @returns {string} A representação do objeto como texto.
*/
toString() {
return this.paraTexto();
}
}
exports.ObjetoDeleguaClasse = ObjetoDeleguaClasse;
//# sourceMappingURL=objeto-delegua-classe.js.map