Repository: DesignLiquido/delegua
Pull request #383 (2023-05-16 02:26:55)

#380 Resolve problema de funções que retornam vetor diretamente.
Resolve: https://github.com/DesignLiquido/delegua/issues/380

github-actions[bot]: <!-- jest coverage report action for options with hash 781087021f8e6c43aac1e668f4520603 -->

## Coverage report 



| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | Category   | Percentage | Covered / Total |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------- | :--------- | :-------------: |
|                                                                           🟡                                                                           | Statements | 73.32%     |    5913/8065    |
|                                                                           🟡                                                                           | Branches   | 62.63%     |    1897/3029    |
|                                                                           🟡                                                                           | Functions  | 69.62%     |     871/1251    |
|                                                                           🟡                                                                           | Lines      | 73.81%     |    5761/7805    |


## Test suite run success
456 tests passing in 37 suites.

<p align="right">Report generated by <a href="https://github.com/ArtiomTr/jest-coverage-report-action">🧪jest coverage report action</a> from e245ec796cbfbc11558f7a7c4e3fb8e14515b7a0</p>
<!-- Sticky Pull Request Comment -->

Patch:
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts
index 45360f67..e548b143 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts
@@ -696,16 +696,17 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
 
         if (
             [
+                tiposDeSimbolos.COLCHETE_ESQUERDO,
+                tiposDeSimbolos.FALSO,
                 tiposDeSimbolos.IDENTIFICADOR,
                 tiposDeSimbolos.ISTO,
-                tiposDeSimbolos.TEXTO,
+                tiposDeSimbolos.NEGACAO,
                 tiposDeSimbolos.NUMERO,
                 tiposDeSimbolos.NULO,
-                tiposDeSimbolos.VERDADEIRO,
-                tiposDeSimbolos.NEGACAO,
-                tiposDeSimbolos.FALSO,
                 tiposDeSimbolos.PARENTESE_ESQUERDO,
                 tiposDeSimbolos.SUPER,
+                tiposDeSimbolos.TEXTO,
+                tiposDeSimbolos.VERDADEIRO,
             ].includes(this.simbolos[this.atual].tipo)
         ) {
             valor = this.expressao();
diff --git a/fontes/tradutores/tradutor-javascript.ts b/fontes/tradutores/tradutor-javascript.ts
index f241c52b..61b2d24c 100644
--- a/fontes/tradutores/tradutor-javascript.ts
+++ b/fontes/tradutores/tradutor-javascript.ts
@@ -602,8 +602,13 @@ export class TradutorJavaScript implements TradutorInterface {
 
     traduzirConstrutoUnario(unario: Unario): string {
         let resultado = '';
-        resultado += this.traduzirSimboloOperador(unario.operador);
-        resultado += unario.operando.valor ?? unario.operando.simbolo.lexema;
+        if ([tiposDeSimbolos.INCREMENTAR, tiposDeSimbolos.DECREMENTAR].includes(unario.operador.tipo)) {
+            resultado += unario.operando.valor ?? unario.operando.simbolo.lexema;
+            resultado += unario.operador.tipo === tiposDeSimbolos.INCREMENTAR ? '++' : '--';
+        } else {
+            resultado += this.traduzirSimboloOperador(unario.operador);
+            resultado += unario.operando.valor ?? unario.operando.simbolo.lexema;
+        }
         return resultado;
     }
 


Test patch:
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index 3a43fcf3..0cef857d 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -593,6 +593,22 @@ describe('Interpretador', () => {
             });
 
             describe('Declaração e chamada de funções', () => {
+                it('Chamada de função com retorno de vetor', async () => {
+                    const codigo = [
+                        "funcao executar() {",
+                        "   retorna [1, 2, \'3\']",
+                        "}",
+                        "escreva(executar())"
+                    ];
+
+                    const retornoLexador = lexador.mapear(codigo, -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                    const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros).toHaveLength(0);
+                });
+
                 it('Chamada de função com inferência de tipos na passagem de parametros', async () => {
                     const codigo = [
                         "funcao escreverMensagem(vetor) {",
diff --git a/testes/tradutores/tradutor-javascript.test.ts b/testes/tradutores/tradutor-javascript.test.ts
index 6faeecbc..32a73429 100644
--- a/testes/tradutores/tradutor-javascript.test.ts
+++ b/testes/tradutores/tradutor-javascript.test.ts
@@ -303,6 +303,24 @@ describe('Tradutor Delégua -> JavaScript', () => {
             expect(resultado).toMatch(/}/i);
         });
 
+        it('para -> for i++ / i--', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'para (var i = 0; i < 5; i = i++) {', 'escreva(i);', '}',
+                    'para (var i = 5; i > 0; i = i--) {', 'escreva(i);', '}'
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/for \(let i = 0; i < 5; i = i\+\+\) {/i);
+            expect(resultado).toMatch(/for \(let i = 5; i > 0; i = i\-\-\) {/i);
+            expect(resultado).toMatch(/console\.log\(i\)/i);
+            expect(resultado).toMatch(/}/i);
+        });
+
         it('\'para\' sem parenteses -> for', () => {
             const retornoLexador = lexador.mapear(
                 ['para var i = 0; i < 5; i = i + 1 {', 'escreva(i);', '}'],