From 70bf5f0a6e42f908caf0fbab339a3f5fa55ba956 Mon Sep 17 00:00:00 2001 From: Leonel Sanches da Silva <53848829+leonelsanchesdasilva@users.noreply.github.com> Date: Sun, 11 Feb 2024 14:12:44 -0800 Subject: [PATCH] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20de=20caso=20em=20que?= =?UTF-8?q?=20m=C3=A9todo=20`finalizar`=20=C3=A9=20definido=20em=20classe.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fontes/interpretador/interpretador-base.ts | 13 +++++++-- testes/interpretador.test.ts | 34 ++++++++++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts index 3b7a5b78..9167df0e 100644 --- a/fontes/interpretador/interpretador-base.ts +++ b/fontes/interpretador/interpretador-base.ts @@ -174,8 +174,17 @@ export class InterpretadorBase implements InterpretadorInterface { async visitarDeclaracaoTendoComo(declaracao: TendoComo): Promise { const retornoInicializacao = await this.avaliar(declaracao.inicializacaoVariavel); this.pilhaEscoposExecucao.definirConstante(declaracao.simboloVariavel.lexema, retornoInicializacao); - console.log(retornoInicializacao); - return Promise.resolve(); + await this.executar(declaracao.corpo); + + if (retornoInicializacao instanceof ObjetoDeleguaClasse) { + const metodoFinalizar = retornoInicializacao.classe.metodos['finalizar']; + if (metodoFinalizar) { + const chamavel = metodoFinalizar.funcaoPorMetodoDeClasse(retornoInicializacao); + chamavel.chamar(this, []); + } + } + + return null; } async visitarDeclaracaoInicioAlgoritmo(declaracao: InicioAlgoritmo): Promise { diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts index 249af954..5fdab8fd 100644 --- a/testes/interpretador.test.ts +++ b/testes/interpretador.test.ts @@ -1434,16 +1434,46 @@ describe('Interpretador', () => { }); describe('Tendo ... Como', () => { - it('Trivial', async () => { + it('Trivial, sem finalizar() definido', async () => { + let _saida: string = ''; + interpretador.funcaoDeRetorno = (saida: any) => { + _saida = saida; + }; + const retornoLexador = lexador.mapear([ 'funcao teste() { retorna "Ok" }', 'tendo teste() como a {', + ' escreva(a)', '}'], -1); const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1); const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes); - expect(retornoInterpretador.erros.length).toBeGreaterThanOrEqual(0); + expect(retornoInterpretador.erros).toHaveLength(0); + expect(_saida).toBe('Ok'); + }); + + it('Trivial, com finalizar() definido, classe em Delégua', async () => { + let _saida: string = ''; + interpretador.funcaoDeRetorno = (saida: any) => { + _saida = saida; + }; + + const retornoLexador = lexador.mapear([ + 'classe MinhaClasse {', + ' finalizar() {', + ' escreva("Finalizei")', + ' }', + '}', + 'funcao teste() { retorna "Ok" }', + 'tendo MinhaClasse() como a {', + '}'], -1); + const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1); + + const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes); + + expect(retornoInterpretador.erros).toHaveLength(0); + expect(_saida).toBe('Finalizei'); }); }); });