Repository: DesignLiquido/delegua
Pull request #725 (2025-03-03 18:43:26)

#715 Valores lógico e nulo não são traduzidos para outras linguagens se estiverem em uma interpolação e tradução de dicionário
Resolve issues:

https://github.com/DesignLiquido/delegua/issues/715

https://github.com/DesignLiquido/delegua/issues/704


Patch:
diff --git a/fontes/tradutores/tradutor-javascript.ts b/fontes/tradutores/tradutor-javascript.ts
index 1f7aa332..2a6ff388 100644
--- a/fontes/tradutores/tradutor-javascript.ts
+++ b/fontes/tradutores/tradutor-javascript.ts
@@ -8,6 +8,7 @@ import {
     Chamada,
     Comentario,
     DefinirValor,
+    Dicionario,
     FuncaoConstruto,
     Isto,
     Literal,
@@ -216,8 +217,35 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
         return resultado;
     }
 
+    traduzirConstrutoDicionario(dicionario: Dicionario): string {
+        let resultado = '{';
+
+        for (let i = 0; i < dicionario.chaves.length; i++) {
+            resultado += this.dicionarioConstrutos[dicionario.chaves[i].constructor.name](dicionario.chaves[i]);
+            resultado += ":"
+            resultado += this.dicionarioConstrutos[dicionario.valores[i].constructor.name](dicionario.valores[i]) + ',';
+        }
+        resultado += '}';
+
+        return resultado;
+    }
+
     traduzirConstrutoLiteral(literal: Literal): string {
-        if (typeof literal.valor === 'string') return `'${literal.valor}'`;
+        if (typeof literal.valor === 'string') {
+            const possuiInterpolacao = /\$\{(verdadeiro|falso|nulo)\}/.test(literal.valor);
+    
+            const valor = literal.valor.replace(/\$\{(verdadeiro|falso|nulo)\}/g, (_, match) => {
+                switch (match) {
+                    case 'verdadeiro': return '${true}';
+                    case 'falso': return '${false}';
+                    case 'nulo': return '${null}';
+                    default: return match;
+                }
+            });
+
+            return possuiInterpolacao ? `\`${valor}\`` : `'${literal.valor}'`;
+        }
+        
         return literal.valor;
     }
 
@@ -676,6 +704,7 @@ export class TradutorJavaScript implements TradutorInterface<Declaracao> {
         Chamada: this.traduzirConstrutoChamada.bind(this),
         Comentario: this.traduzirConstrutoComentario.bind(this),
         DefinirValor: this.traduzirConstrutoDefinirValor.bind(this),
+        Dicionario: this.traduzirConstrutoDicionario.bind(this),
         FuncaoConstruto: this.traduzirFuncaoConstruto.bind(this),
         Isto: () => 'this',
         Literal: this.traduzirConstrutoLiteral.bind(this),


Test patch:
diff --git a/testes/tradutores/tradutor-javascript.test.ts b/testes/tradutores/tradutor-javascript.test.ts
index 8c136332..0362452d 100644
--- a/testes/tradutores/tradutor-javascript.test.ts
+++ b/testes/tradutores/tradutor-javascript.test.ts
@@ -39,6 +39,50 @@ describe('Tradutor Delégua -> JavaScript', () => {
             avaliadorSintatico = new AvaliadorSintatico();
         });
 
+        it('escreva com interpolação de valores lógicos e não lógicos', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'escreva("${verdadeiro}")',
+                    'escreva("${falso}")',
+                    'escreva("${nulo}")',
+                    'escreva("test: ${verdadeiro} - ${falso} - ${nulo}")',
+                    'escreva("um texto qualquer")',
+                    'escreva("123")',
+                    'escreva(321)'
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/console\.log\(\`\$\{true\}\`\)/);
+            expect(resultado).toMatch(/console\.log\(\`\$\{false\}\`\)/);
+            expect(resultado).toMatch(/console\.log\(\`\$\{null\}\`\)/);
+            expect(resultado).toMatch(/console\.log\(\`test: \$\{true\} - \$\{false\} - \$\{null\}\`\)/);
+            expect(resultado).toMatch(/console\.log\(\'um texto qualquer\'\)/i);
+            expect(resultado).toMatch(/console\.log\(\'123'\)/i);
+            expect(resultado).toMatch(/console\.log\(321\)/i);
+        });
+
+        it('escreva chave e valor de dicionário', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'escreva({',
+                    '\'chave 1\': \'valor\',',
+                    '\'chave 2\': 2,',
+                    '})',
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/console\.log\(\{\'chave 1\':\'valor\',\'chave 2\':2,\}\)/i);
+        });
+
+
         it('funções nativas', () => {
             const retornoLexador = lexador.mapear(
                 [