Skip to content

Commit

Permalink
Implementação de caso em que método finalizar é definido em classe.
Browse files Browse the repository at this point in the history
  • Loading branch information
leonelsanchesdasilva committed Feb 11, 2024
1 parent 735f180 commit 70bf5f0
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 4 deletions.
13 changes: 11 additions & 2 deletions fontes/interpretador/interpretador-base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,17 @@ export class InterpretadorBase implements InterpretadorInterface {
async visitarDeclaracaoTendoComo(declaracao: TendoComo): Promise<any> {
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<any> {
Expand Down
34 changes: 32 additions & 2 deletions testes/interpretador.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
});
});
});
Expand Down

0 comments on commit 70bf5f0

Please sign in to comment.