Repository: DesignLiquido/delegua
Pull request #247 (2023-01-15 23:54:57)

Traduzir Unário

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.87%">68.9% (+0.03% 🔼)</div>  |    3760/5457    |
|                                                                           🔴                                                                           | Branches   | <div title="Base coverage is: 57.3%">57.39% (+0.09% 🔼)</div>  |    1126/1962    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 68.98%">69.02% (+0.04% 🔼)</div> |     548/794     |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 69.17%">69.2% (+0.03% 🔼)</div>  |    3637/5256    |


## Test suite run success
256 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 8cf4e4095463dd55ea22d79f00869d2f36f1e6e5</p>
<!-- Sticky Pull Request Comment -->

Patch:
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts
index 89c15e04..efa3e117 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts
@@ -536,22 +536,6 @@ export class AvaliadorSintatico implements AvaliadorSintaticoInterface {
 
         const caminhoEntao = this.resolverDeclaracao();
 
-        // TODO: `senãose` não existe na língua portuguesa, e a forma separada, `senão se`,
-        // funciona do jeito que deveria.
-        // Marcando este código para ser removido em versões futuras.
-        /* while (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.SENAOSE, tiposDeSimbolos.SENÃOSE)) {
-            this.consumir(tiposDeSimbolos.PARENTESE_ESQUERDO, "Esperado '(' após 'senaose' ou 'senãose'.");
-            const condicaoSeSenao = this.expressao();
-            this.consumir(tiposDeSimbolos.PARENTESE_DIREITO, "Esperado ')' após codição do 'senaose' ou 'senãose'.");
-
-            const caminho = this.resolverDeclaracao();
-
-            caminhosSeSenao.push({
-                condicao: condicaoSeSenao,
-                caminho: caminho,
-            });
-        } */
-
         let caminhoSenao = null;
         if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.SENAO, tiposDeSimbolos.SENÃO)) {
             caminhoSenao = this.resolverDeclaracao();
diff --git a/fontes/tradutores/tradutor-javascript.ts b/fontes/tradutores/tradutor-javascript.ts
index c8de2bce..279722e8 100644
--- a/fontes/tradutores/tradutor-javascript.ts
+++ b/fontes/tradutores/tradutor-javascript.ts
@@ -11,6 +11,7 @@ import {
     Isto,
     Literal,
     Logico,
+    Unario,
     Variavel,
     Vetor,
 } from '../construtos';
@@ -49,6 +50,14 @@ export class TradutorJavaScript implements TradutorInterface {
         switch (operador.tipo) {
             case tiposDeSimbolos.ADICAO:
                 return '+';
+            case tiposDeSimbolos.BIT_AND:
+                return '&';
+            case tiposDeSimbolos.BIT_OR:
+                return '|';
+            case tiposDeSimbolos.BIT_XOR:
+                return '^';
+            case tiposDeSimbolos.BIT_NOT:
+                return '~';
             case tiposDeSimbolos.DIFERENTE:
                 return '!==';
             case tiposDeSimbolos.DIVISAO:
@@ -510,6 +519,10 @@ export class TradutorJavaScript implements TradutorInterface {
         return resultado;
     }
 
+    traduzirConstrutoUnario(unario: Unario): string {
+        return this.traduzirSimboloOperador(unario.operador) + unario.direita.valor;
+    }
+
     dicionarioConstrutos = {
         AcessoIndiceVariavel: this.traduzirAcessoIndiceVariavel.bind(this),
         AcessoMetodo: this.trazudirConstrutoAcessoMetodo.bind(this),
@@ -523,8 +536,9 @@ export class TradutorJavaScript implements TradutorInterface {
         Isto: () => 'this',
         Literal: this.traduzirConstrutoLiteral.bind(this),
         Logico: this.traduzirConstrutoLogico.bind(this),
+        Unario: this.traduzirConstrutoUnario.bind(this),
         Variavel: this.traduzirConstrutoVariavel.bind(this),
-        Vetor: this.traduzirConstrutoVetor.bind(this)
+        Vetor: this.traduzirConstrutoVetor.bind(this),
     };
 
     dicionarioDeclaracoes = {


Test patch:
diff --git a/testes/tradutores/tradutor-javascript.test.ts b/testes/tradutores/tradutor-javascript.test.ts
index 3e184b8b..50b02d9b 100644
--- a/testes/tradutores/tradutor-javascript.test.ts
+++ b/testes/tradutores/tradutor-javascript.test.ts
@@ -37,6 +37,26 @@ describe('Tradutor Delégua -> JavaScript', () => {
             delegua = new Delegua('delegua');
         });
 
+        it('bit a bit', () => {
+            const retornoLexador = delegua.lexador.mapear(
+                [
+                    'escreva(8 | 1)',
+                    'escreva(8 & 1)',
+                    'escreva(8 ^ 1)',
+                    'escreva(~2)',
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/console\.log\(8 | 1\)/i);
+            expect(resultado).toMatch(/console\.log\(8 & 1\)/i);
+            expect(resultado).toMatch(/console\.log\(8 \^ 1\)/i);
+            expect(resultado).toMatch(/console\.log\(~2\)/i);
+        });
+
         it('vetor acesso indice -> array/index', () => {
             const retornoLexador = delegua.lexador.mapear(
                 [