Repository: DesignLiquido/delegua
Pull request #327 (2023-04-22 21:24:15)

Tradução e testes para tipo const

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.3%">73.31% (+0.01% 🔼)</div>  |    5335/7277    |
|                                                                           🟡                                                                           | Branches   | <div title="Base coverage is: 61.76%">61.79% (+0.03% 🔼)</div> |    1667/2698    |
|                                                                           🟡                                                                           | Functions  | <div title="Base coverage is: 74.5%">74.53% (+0.02% 🔼)</div>  |     790/1060    |
|                                                                           🟡                                                                           | Lines      | <div title="Base coverage is: 73.73%">73.75% (+0.02% 🔼)</div> |    5190/7037    |


<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: 97.41%">96.79% (-0.62% 🔻)</div> | <div title="Base coverage is: 83.45%">82.31% (-1.14% 🔻)</div> | <div title="Base coverage is: 97.56%">97.62% (+0.06% 🔼)</div> | <div title="Base coverage is: 97.35%">97.07% (-0.28% 🔻)</div> |

</details>

## Test suite run success
385 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 62f12704bff4df5c96155fa2ab52f67e684fdd54</p>
<!-- Sticky Pull Request Comment -->

Patch:
diff --git a/fontes/tradutores/tradutor-javascript.ts b/fontes/tradutores/tradutor-javascript.ts
index b58eae0c..c793c0ce 100644
--- a/fontes/tradutores/tradutor-javascript.ts
+++ b/fontes/tradutores/tradutor-javascript.ts
@@ -18,6 +18,7 @@ import {
 import {
     Bloco,
     Classe,
+    Const,
     Declaracao,
     Enquanto,
     Escolha,
@@ -430,6 +431,26 @@ export class TradutorJavaScript implements TradutorInterface {
         return resultado;
     }
 
+    traduzirDeclaracaoConst(declaracaoConst: Const): string {
+        let resultado = 'const ';
+        resultado += declaracaoConst.simbolo.lexema;
+        if (!declaracaoConst?.inicializador) resultado += ';';
+        else {
+            resultado += ' = ';
+            if (this.dicionarioConstrutos[declaracaoConst.inicializador.constructor.name]) {
+                resultado += this.dicionarioConstrutos[declaracaoConst.inicializador.constructor.name](
+                    declaracaoConst.inicializador
+                );
+            } else {
+                resultado += this.dicionarioDeclaracoes[declaracaoConst.inicializador.constructor.name](
+                    declaracaoConst.inicializador
+                );
+            }
+            resultado += ';';
+        }
+        return resultado;
+    }
+
     traduzirDeclaracaoVar(declaracaoVar: Var): string {
         let resultado = 'let ';
         resultado += declaracaoVar.simbolo.lexema;
@@ -562,6 +583,7 @@ export class TradutorJavaScript implements TradutorInterface {
     dicionarioDeclaracoes = {
         Bloco: this.traduzirDeclaracaoBloco.bind(this),
         Classe: this.traduzirDeclaracaoClasse.bind(this),
+        Const : this.traduzirDeclaracaoConst.bind(this),
         Continua: () => 'continue',
         Enquanto: this.traduzirDeclaracaoEnquanto.bind(this),
         Escolha: this.traduzirDeclaracaoEscolha.bind(this),
diff --git a/fontes/tradutores/tradutor-reverso-javascript.ts b/fontes/tradutores/tradutor-reverso-javascript.ts
index 3848e0df..3e6b4340 100644
--- a/fontes/tradutores/tradutor-reverso-javascript.ts
+++ b/fontes/tradutores/tradutor-reverso-javascript.ts
@@ -163,7 +163,7 @@ export class TradutorReversoJavaScript {
         let informacoesDaVariavel = declaracao.declarations[0];
         const identificador = informacoesDaVariavel.id as Identifier;
         if (identificador) {
-            resultado += `var ${identificador.name} = ${this.dicionarioConstrutos[informacoesDaVariavel.init.type](
+            resultado += `${declaracao.kind === 'const' ? 'const' : 'var'} ${identificador.name} = ${this.dicionarioConstrutos[informacoesDaVariavel.init.type](
                 informacoesDaVariavel.init
             )}`;
         }


Test patch:
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index 04ee05f7..fed492d6 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -16,8 +16,11 @@ describe('Interpretador', () => {
 
         describe('Cenários de sucesso', () => {
             describe('Atribuições', () => {
-                it('Trivial var', async () => {
-                    const retornoLexador = lexador.mapear(["var a = 1"], -1);
+                it('Trivial var/variavel', async () => {
+                    const retornoLexador = lexador.mapear([
+                        "var a = 1",
+                        "variavel b = 2"
+                    ], -1);
                     const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
 
                     const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
diff --git a/testes/tradutores/tradutor-javascript.test.ts b/testes/tradutores/tradutor-javascript.test.ts
index ca0c7d36..2ca483cc 100644
--- a/testes/tradutores/tradutor-javascript.test.ts
+++ b/testes/tradutores/tradutor-javascript.test.ts
@@ -105,10 +105,29 @@ describe('Tradutor Delégua -> JavaScript', () => {
             expect(resultado).toMatch(/let vetor = \[\]/i);
         });
 
+        it('declarando variável const/constante/fixo', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'const a = 1;',
+                    'constante b = 2;',
+                    'fixo c = 3;',
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/const a = 1;/i);
+            expect(resultado).toMatch(/const b = 2;/i);
+            expect(resultado).toMatch(/const c = 3;/i);
+        });
+
         it('declarando variável não inicializada', () => {
             const retornoLexador = lexador.mapear(
                 [
                     'var a;',
+                    'variavel b;'
                 ],
                 -1
             );
@@ -117,6 +136,7 @@ describe('Tradutor Delégua -> JavaScript', () => {
             const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
             expect(resultado).toBeTruthy();
             expect(resultado).toMatch(/let a;/i);
+            expect(resultado).toMatch(/let b;/i);
         });
 
         it('definindo funcao com variavel', () => {
diff --git a/testes/tradutores/tradutor-reverso-javascript.test.ts b/testes/tradutores/tradutor-reverso-javascript.test.ts
index f1d66716..3e711db5 100644
--- a/testes/tradutores/tradutor-reverso-javascript.test.ts
+++ b/testes/tradutores/tradutor-reverso-javascript.test.ts
@@ -50,11 +50,19 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
 
             const resultado = tradutor.traduzir(codigo);
             expect(resultado).toBeTruthy();
-            expect(resultado).toMatch(/var a = 1/i);
+            expect(resultado).toMatch(/const a = 1/i);
             expect(resultado).toMatch(/var b = 2/i);
             expect(resultado).toMatch(/var c = 3/i);
         });
 
+        it('const -> const/constante', () => {
+            const codigo = `const a = 1`;
+
+            const resultado = tradutor.traduzir(codigo);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/const a = 1/i);
+        });
+
         it('function -> funcao sem parametro', () => {
             const codigo = `function teste() {console.log(\'Oi\')\nconsole.log(123)}`;
 
@@ -125,7 +133,7 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
 
             const resultado = tradutor.traduzir(codigo);
             expect(resultado).toBeTruthy();
-            expect(resultado).toMatch(/var func = \(a, b, c\) => {/i);
+            expect(resultado).toMatch(/const func = \(a, b, c\) => {/i);
             expect(resultado).toMatch(/escreva\('Oi'\)/i);
         });
 
@@ -235,8 +243,8 @@ describe('Tradutor Reverso JavaScript -> Delégua', () => {
 
             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);
+            expect(resultado).toMatch(/const v = verdadeiro e verdadeiro/i);
+            expect(resultado).toMatch(/const f = verdadeiro ou falso/i);
         });
 
         it('if -> se', () => {