Repository: DesignLiquido/delegua
Pull request #355 (2023-05-06 02:20:57)

Tradução de funções nativas
Contém **_Easter egg_** imbutido.

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 | <div title="Base coverage is: 73.9%">73.84% (-0.05% 🔻)</div>  |    5703/7723    |
|                                                                           🟡                                                                           | Branches   | <div title="Base coverage is: 62.56%">62.5% (-0.05% 🔻)</div>  |    1822/2915    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 73.73%">73.77% (+0.05% 🔼)</div> |     841/1140    |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 74.37%">74.31% (-0.06% 🔻)</div> |    5554/7474    |


<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-javascript.ts">`...` / tradutor-javascript.ts</div>                 | <div title="Base coverage is: 96.83%">94.98% (-1.85% 🔻)</div> | <div title="Base coverage is: 82.31%">80.12% (-2.19% 🔻)</div> | <div title="Base coverage is: 97.67%">97.73% (+0.05% 🔼)</div> | <div title="Base coverage is: 97.11%">95.21% (-1.91% 🔻)</div> |
|                                                                           🟢                                                                           | <div title="tradutores/tradutor-reverso-javascript.ts">`...` / tradutor-reverso-javascript.ts</div> | <div title="Base coverage is: 99.07%">96.54% (-2.54% 🔻)</div> | <div title="Base coverage is: 95.24%">88.31% (-6.93% 🔻)</div> | 100%                                                           | <div title="Base coverage is: 99.53%">96.92% (-2.61% 🔻)</div> |

</details>

## Test suite run success
417 tests passing in 35 suites.

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

Patch:
diff --git a/fontes/tradutores/tradutor-javascript.ts b/fontes/tradutores/tradutor-javascript.ts
index 459e6c1d..f241c52b 100644
--- a/fontes/tradutores/tradutor-javascript.ts
+++ b/fontes/tradutores/tradutor-javascript.ts
@@ -91,6 +91,41 @@ export class TradutorJavaScript implements TradutorInterface {
         }
     }
 
+    //TODO: @Samuel
+    traduzirFuncoesNativas(metodo: string): string {
+        switch (metodo.toLowerCase()) {
+            case 'adicionar':
+            case 'empilhar':
+                return 'push';
+            case 'concatenar':
+                return 'concat'
+            case 'fatiar':
+                return 'slice';
+            case 'inclui':
+                return 'includes';
+            case 'inverter':
+                return 'reverse';
+            case 'juntar':
+                return 'join';
+            case 'ordenar':
+                return 'sort';
+            case 'removerprimeiro':
+                return 'shift';
+            case 'removerultimo':
+                return 'pop';
+            case 'tamanho':
+                return 'length';
+            case 'maiusculo':
+                return 'toUpperCase';
+            case 'minusculo':
+                return 'toLowerCase';
+            case 'substituir':
+                return 'replace';
+            default:
+                return metodo;
+        }
+    }
+
     traduzirConstrutoAgrupamento(agrupamento: Agrupamento): string {
         return this.dicionarioConstrutos[agrupamento.constructor.name](agrupamento.expressao || agrupamento);
     }
@@ -484,7 +519,7 @@ export class TradutorJavaScript implements TradutorInterface {
     trazudirConstrutoAcessoMetodo(acessoMetodo: AcessoMetodo): string {
         if (acessoMetodo.objeto instanceof Variavel) {
             let objetoVariavel = acessoMetodo.objeto as Variavel;
-            return `${objetoVariavel.simbolo.lexema}.${acessoMetodo.simbolo.lexema}`;
+            return `${objetoVariavel.simbolo.lexema}.${this.traduzirFuncoesNativas(acessoMetodo.simbolo.lexema)}`;
         }
         return `this.${acessoMetodo.simbolo.lexema}`;
     }
diff --git a/fontes/tradutores/tradutor-reverso-javascript.ts b/fontes/tradutores/tradutor-reverso-javascript.ts
index 67fe0e4a..4c38caf8 100644
--- a/fontes/tradutores/tradutor-reverso-javascript.ts
+++ b/fontes/tradutores/tradutor-reverso-javascript.ts
@@ -45,6 +45,42 @@ export class TradutorReversoJavaScript {
         }
     }
 
+    //TODO: @Samuel
+    traduzirFuncoesNativas(metodo: string): string {
+        switch (metodo.toLowerCase()) {
+            case 'push':
+                return 'adicionar';
+            case 'concat':
+                return 'concatenar'
+            case 'slice':
+                return 'fatiar';
+            case 'includes':
+                return 'inclui';
+            case 'reverse':
+                return 'inverter';
+            case 'join':
+                return 'juntar';
+            case 'sort':
+                return 'ordenar';
+            case 'shift':
+                return 'removerPrimeiro';
+            case 'pop':
+                return 'removerUltimo';
+            case 'length':
+                return 'tamanho()';
+            case 'log':
+                return 'escreva'
+            case 'touppercase':
+                return 'maiusculo';
+            case 'tolowercase':
+                return 'minusculo';
+            case 'replace':
+                return 'substituir';
+            default:
+                return metodo;
+        }
+    }
+
     traduzirConstrutoVetor(vetor: ArrayExpression) {
         if (!vetor.elements.length) {
             return '[]';
@@ -92,10 +128,7 @@ export class TradutorReversoJavaScript {
     traduzirExpressao(expressao: MemberExpression): string {
         let objeto = this.dicionarioConstrutos[expressao.object.type](expressao.object);
         let propriedade = this.dicionarioConstrutos[expressao.property.type](expressao.property);
-        if (objeto === 'console' && propriedade === 'log') {
-            return 'escreva';
-        }
-        return `${objeto}${propriedade}`;
+        return `${objeto}.${this.traduzirFuncoesNativas(propriedade)}`;
     }
 
     traduzirConstrutoLogico(logico: any): string {
@@ -116,7 +149,7 @@ export class TradutorReversoJavaScript {
         LogicalExpression: this.traduzirConstrutoLogico.bind(this),
         MemberExpression: this.traduzirExpressao.bind(this),
         NewExpression: this.traduzirNovo.bind(this),
-        ThisExpression: (expressao) => 'isto.',
+        ThisExpression: () => 'isto',
         UpdateExpression: this.traduzirAtualizacaoVariavel.bind(this),
         // Variavel: this.traduzirConstrutoVariavel.bind(this),
     };


Test patch:
diff --git a/testes/tradutores/tradutor-javascript.test.ts b/testes/tradutores/tradutor-javascript.test.ts
index 441f7325..6faeecbc 100644
--- a/testes/tradutores/tradutor-javascript.test.ts
+++ b/testes/tradutores/tradutor-javascript.test.ts
@@ -39,6 +39,39 @@ describe('Tradutor Delégua -> JavaScript', () => {
             avaliadorSintatico = new AvaliadorSintatico();
         });
 
+        it('funções nativas', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'var vetor = [1, 2];', 
+                    'vetor.adicionar(3);',
+                    'vetor.empilhar(4);',
+                    'vetor.removerUltimo();',
+                    'vetor.tamanho();',
+                    'vetor.inverter();',
+                    'vetor.removerPrimeiro();',
+    
+                    'var nome = \'delégua > égua\';',
+                    'nome = nome.maiusculo();',
+                    'nome = nome.minusculo();',
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/let vetor = \[1, 2\]/i);
+            expect(resultado).toMatch(/vetor.push\(3\)/i);
+            expect(resultado).toMatch(/vetor.push\(4\)/i);
+            expect(resultado).toMatch(/vetor.pop\(\)/i);
+            expect(resultado).toMatch(/vetor.length/i);
+            expect(resultado).toMatch(/vetor.reverse\(\)/i);
+            expect(resultado).toMatch(/vetor.shift\(\)/i);
+
+            expect(resultado).toMatch(/nome.toUpperCase\(\)/i);
+            expect(resultado).toMatch(/nome.toLowerCase\(\)/i);
+        });
+
         it('bit a bit', () => {
             const retornoLexador = lexador.mapear(
                 [
diff --git a/testes/tradutores/tradutor-reverso-javascript.test.ts b/testes/tradutores/tradutor-reverso-javascript.test.ts
index eae1766a..9991e2e7 100644
--- a/testes/tradutores/tradutor-reverso-javascript.test.ts
+++ b/testes/tradutores/tradutor-reverso-javascript.test.ts
@@ -22,6 +22,33 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
             expect(resultado).toMatch(/escreva\('Oi'\)/i);
         });
 
+        it('funções nativas', () => {
+            const codigo = `
+                var vetor = [1, 2]; 
+                vetor.push(3);
+                vetor.pop();
+                vetor.length;
+                vetor.reverse();
+                vetor.shift();
+
+                var nome = 'delégua > égua';
+                nome = nome.toUpperCase();
+                nome = nome.toLowerCase();
+            `;
+
+            const resultado = tradutor.traduzir(codigo);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/var vetor = \[1, 2\]/i);
+            expect(resultado).toMatch(/vetor.adicionar\(3\)/i);
+            expect(resultado).toMatch(/vetor.removerUltimo\(\)/i);
+            expect(resultado).toMatch(/vetor.tamanho\(\)/i);
+            expect(resultado).toMatch(/vetor.inverter\(\)/i);
+            expect(resultado).toMatch(/vetor.removerPrimeiro\(\)/i);
+
+            expect(resultado).toMatch(/nome.maiusculo\(\)/i);
+            expect(resultado).toMatch(/nome.minusculo\(\)/i);
+        });
+
         it('for -> para', () => {
             const codigo = 'for (let i = 0; i < 10; i++) { console.log(i) }'