Repository: DesignLiquido/delegua
Pull request #260 (2023-01-31 06:28:53)

Implementando e corrigindo declarações do tradutor
https://github.com/DesignLiquido/delegua/issues/202

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

## 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 | <div title="Base coverage is: 68.49%">68.61% (+0.11% 🔼)</div> |    3940/5743    |
|                                                                           🔴                                                                           | Branches   | <div title="Base coverage is: 56.79%">56.8% (+0.01% 🔼)</div>  |    1161/2044    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 68.52%">68.55% (+0.04% 🔼)</div> |     569/830     |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 68.85%">68.97% (+0.12% 🔼)</div> |    3806/5518    |


<details><summary>Show files with reduced coverage 🔻</summary>
<br/>

| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | File                                                                                                | Statements                                                    | Branches                                                      | Functions | Lines                                                          |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------- | :------------------------------------------------------------ | :------------------------------------------------------------ | :-------- | :------------------------------------------------------------- |
|                                                                           🟢                                                                           | <div title="tradutores/tradutor-reverso-javascript.ts">`...` / tradutor-reverso-javascript.ts</div> | <div title="Base coverage is: 98.31%">98.01% (-0.3% 🔻)</div> | <div title="Base coverage is: 87.5%">86.27% (-1.23% 🔻)</div> | 100%      | <div title="Base coverage is: 98.31%">98.49% (+0.19% 🔼)</div> |

</details>

## Test suite run success
275 tests passing in 23 suites.

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

Patch:
diff --git a/fontes/tradutores/tradutor-reverso-javascript.ts b/fontes/tradutores/tradutor-reverso-javascript.ts
index 2f96ec3a..950dfd6c 100644
--- a/fontes/tradutores/tradutor-reverso-javascript.ts
+++ b/fontes/tradutores/tradutor-reverso-javascript.ts
@@ -13,6 +13,7 @@ import {
     MethodDefinition,
     NewExpression,
     ReturnStatement,
+    SwitchStatement,
     TryStatement,
     UpdateExpression,
     VariableDeclaration,
@@ -31,9 +32,12 @@ export class TradutorReversoJavaScript {
 
     traduzirSimboloOperador(operador: any): string {
         switch (operador) {
-            case '==':
             case '===':
                 return '==';
+            case '&&':
+                return 'e'
+            case '||':
+                return 'ou';
             default:
                 return operador;
         }
@@ -92,6 +96,10 @@ export class TradutorReversoJavaScript {
         return `${objeto}${propriedade}`;
     }
 
+    traduzirConstrutoLogico(logico: any): string {
+        return this.dicionarioConstrutos[logico.constructor.name](logico)
+    }
+
     dicionarioConstrutos = {
         AssignmentExpression: this.traduzirConstrutoAtribuir.bind(this),
         ArrayExpression: this.traduzirConstrutoVetor.bind(this),
@@ -103,6 +111,7 @@ export class TradutorReversoJavaScript {
         // Isto: this.traduzirConstrutoIsto.bind(this),
         Identifier: this.traduzirIdentificador.bind(this),
         Literal: this.traduzirConstrutoLiteral.bind(this),
+        LogicalExpression: this.traduzirConstrutoLogico.bind(this),
         MemberExpression: this.traduzirExpressao.bind(this),
         NewExpression: this.traduzirNovo.bind(this),
         ThisExpression: (expressao) => 'isto.',
@@ -136,6 +145,8 @@ export class TradutorReversoJavaScript {
     }
 
     traduzirConstrutoLiteral(literal: Literal): string {
+        if(literal.raw === 'true') return 'verdadeiro';
+        else if (literal.raw === 'false') return 'falso';
         return `${literal.raw}`;
     }
 
@@ -195,7 +206,9 @@ export class TradutorReversoJavaScript {
 
     traduzirDeclaracaoFuncao(declaracao: any): string {
         let resultado = '';
-        resultado += `funcao ${declaracao.id.name}(`;
+        const eFuncaoSeta = !declaracao.id;
+
+        resultado += eFuncaoSeta ? '(' : `funcao ${declaracao.id.name}(`;
 
         for (let parametro of declaracao.params) {
             resultado += parametro.name + ', ';
@@ -203,13 +216,15 @@ export class TradutorReversoJavaScript {
         if (declaracao.params.length > 0) {
             resultado = resultado.slice(0, -2);
         }
-        resultado += ') ';
+
+        resultado += eFuncaoSeta ? ') => ' : ') ';
         resultado += this.logicaComumBlocoEscopo(declaracao);
+
         return resultado;
     }
 
     //TODO: Refatorar esse método. @Samuel
-    traduzirDeclaracaoClasse(declaracao: ClassDeclaration) {
+    traduzirDeclaracaoClasse(declaracao: ClassDeclaration): string {
         let resultado = `classe ${declaracao.id.name} `;
         if (declaracao.superClass) {
             let identificador = declaracao.superClass as Identifier;
@@ -281,19 +296,22 @@ export class TradutorReversoJavaScript {
     }
 
     traduzirDeclaracaoSe(declaracao: IfStatement): string {
-        let resultado = 'if (';
+        let resultado = 'se (';
         resultado += this.dicionarioConstrutos[declaracao.test.type](declaracao.test);
         resultado += ')';
         resultado += this.logicaComumBlocoEscopo(declaracao.consequent);
-        if (declaracao?.alternate) {
-            resultado += 'else ';
+
+        if(declaracao?.alternate){
+            resultado += 'senao '
             if (declaracao.alternate.constructor.name === 'BlockStatement') {
-                resultado += this.logicaComumBlocoEscopo(declaracao.consequent);
+                const bloco = declaracao.alternate as BlockStatement;
+                resultado += this.logicaComumBlocoEscopo(bloco);
                 return resultado;
             }
-            resultado += this.traduzirDeclaracao(declaracao.alternate);
-            return resultado;
+            const se = declaracao.alternate as IfStatement;
+            resultado += this.traduzirDeclaracao(se);
         }
+
         return resultado;
     }
 
@@ -318,6 +336,36 @@ export class TradutorReversoJavaScript {
         return resultado;
     }
 
+    traduzirDeclaracaoEscolha(declaracao: SwitchStatement): string {
+        let resultado = '';
+        this.indentacao += 4;
+
+        resultado += `escolha(${this.dicionarioConstrutos[declaracao.discriminant.type](declaracao.discriminant)}) {`;
+        resultado += ' '.repeat(this.indentacao);
+        for(let caso of declaracao.cases){
+            if(!caso.test){
+                resultado += 'padrao:';
+                resultado += ' '.repeat(this.indentacao + 4);
+                for(let bloco of caso.consequent) {
+                    if(bloco.type === 'BreakStatement') continue;
+                    resultado += this.traduzirDeclaracao(bloco) + '\n'
+                }
+                break;
+            }
+            resultado += `caso ${this.dicionarioConstrutos[caso.test.type](caso.test)}:`
+            resultado += ' '.repeat(this.indentacao + 4);
+            for(let bloco of caso.consequent) {
+                if(bloco.type === 'BreakStatement') continue;
+                resultado += this.traduzirDeclaracao(bloco) + '\n'
+            }
+        }
+
+        this.indentacao -= 4;
+        resultado += ' '.repeat(this.indentacao) + '}\n';
+
+        return resultado;
+    }
+
     traduzirDeclaracao(declaracao: any): string {
         switch (declaracao.type) {
             case 'ClassDeclaration':
@@ -334,6 +382,8 @@ export class TradutorReversoJavaScript {
                 return this.traduzirDeclaracaoSe(declaracao);
             case 'ReturnStatement':
                 return this.traduzirDeclaracaoRetorna(declaracao);
+            case 'SwitchStatement':
+                return this.traduzirDeclaracaoEscolha(declaracao);
             case 'TryStatement':
                 return this.traduzirDeclaracaoTente(declaracao);
             case 'VariableDeclaration':


Test patch:
diff --git a/testes/tradutores/tradutor-reverso-javascript.test.ts b/testes/tradutores/tradutor-reverso-javascript.test.ts
index 8206f3ae..5d983e75 100644
--- a/testes/tradutores/tradutor-reverso-javascript.test.ts
+++ b/testes/tradutores/tradutor-reverso-javascript.test.ts
@@ -127,6 +127,15 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
             expect(resultado).toMatch(/teste\(1, 2, 3\)/i);
         });
 
+        it('arrow function -> função seta', () => {
+            const codigo = `const func = (a, b, c) => {console.log(\'Oi\')}\nfunc(1,2,3)`;
+
+            const resultado = tradutor.traduzir(codigo);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/var func = \(a, b, c\) => {/i);
+            expect(resultado).toMatch(/escreva\('Oi'\)/i);
+        });
+
         it('class -> classe', () => {
             const codigo = `
                 class Base {
@@ -185,8 +194,7 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
         it('do while -> fazer enquanto', () => {
             const codigo = `
                 let result = '';
-                let i = 0;
-                
+                let i = 0;                
                 do {
                 i = i + 1;
                 result = result + i;
@@ -201,6 +209,43 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
             expect(resultado).toMatch(/enquanto\(i < 5\)/i);
         });
 
+        it('switch -> escolha', () => {
+            const codigo = `
+            const palavra = 'Papayas';
+            switch (palavra) {
+              case 'Laranja':
+                console.log('Laranja custa 0.59R$ centavos.');
+                break;
+              case 'Morango':
+              case 'Uva':
+                console.log('Morango e Uva custam 2.79R$ Reais.');
+                break;
+              default:
+                console.log('Valor padrão de 5R$');
+            }
+            `
+
+            const resultado = tradutor.traduzir(codigo);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/escolha\(palavra\)/i);
+            expect(resultado).toMatch(/caso \'Laranja\':/i);
+            expect(resultado).toMatch(/caso \'Morango\':/i);
+            expect(resultado).toMatch(/caso \'Uva\':/i);
+            expect(resultado).toMatch(/padrao:/i);
+        });
+
+        it('And e Or -> E e Ou', () => {
+            const codigo = `
+            const v = true && true;
+            const f = true || false;
+            `
+
+            const resultado = tradutor.traduzir(codigo);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/var v = verdadeiro e verdadeiro/i);
+            expect(resultado).toMatch(/var f = verdadeiro ou falso/i);
+        });
+
         it('if -> se', () => {
             const codigo = `
                 let i = 1;                
@@ -212,7 +257,22 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
             const resultado = tradutor.traduzir(codigo);
             expect(resultado).toBeTruthy();
             expect(resultado).toMatch(/var i = 1/i);
-            expect(resultado).toMatch(/if \(i == 1\)/i);
+            expect(resultado).toMatch(/se \(i == 1\)/i);
+        });
+
+        it('if/true/false -> se/verdadeiro/falso', () => {
+            const codigo = `             
+                if(true){
+                    console.log(\'verdadeiro\')
+                } else if(false){
+                    console.log(\'falso\')
+                }
+            `
+
+            const resultado = tradutor.traduzir(codigo);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/se \(verdadeiro\)/i);
+            expect(resultado).toMatch(/senao se \(falso\)/i);
         });
 
         it('if/else if/else -> se/senao se/senao', () => {
@@ -223,18 +283,22 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
                 } 
                 else if(i === 2){
                     console.log(\'i é igual a 2\')
+                }
+                else if(i === 3){
+                    console.log(\'i é igual a 3\')
                 } 
                 else{
-                    console.log(\'i não é igual a 1 e nem igual a 2\')
+                    console.log(\'i é diferente de 1, 2 e 3\')
                 }
             `
 
             const resultado = tradutor.traduzir(codigo);
             expect(resultado).toBeTruthy();
             expect(resultado).toMatch(/var i = 1/i);
-            expect(resultado).toMatch(/if \(i == 1\)/i);
-            expect(resultado).toMatch(/else if \(i == 2\)/i);
-            expect(resultado).toMatch(/else {/i);
+            expect(resultado).toMatch(/se \(i == 1\)/i);
+            expect(resultado).toMatch(/senao se \(i == 2\)/i);
+            expect(resultado).toMatch(/senao se \(i == 3\)/i);
+            expect(resultado).toMatch(/senao {/i);
         });
 
         it('try/catch/finally -> tente/pegue/finalmente', () => {