Repository: DesignLiquido/delegua
Pull request #720 (2025-03-03 14:00:55)

#703 Impressão em inglês ao utilizar valores lógicos como chaves de dicionários
https://github.com/DesignLiquido/delegua/issues/703


Patch:
diff --git a/fontes/avaliador-sintatico/avaliador-sintatico.ts b/fontes/avaliador-sintatico/avaliador-sintatico.ts
index a60e7625..939d3ba2 100644
--- a/fontes/avaliador-sintatico/avaliador-sintatico.ts
+++ b/fontes/avaliador-sintatico/avaliador-sintatico.ts
@@ -440,15 +440,22 @@ export class AvaliadorSintatico
             this.verificarSeSimboloAtualEIgualA(
                 tiposDeSimbolos.SUBTRACAO,
                 tiposDeSimbolos.ADICAO,
-                tiposDeSimbolos.MAIS_IGUAL,
                 tiposDeSimbolos.MENOS_IGUAL
             )
         ) {
             const operador = this.simbolos[this.atual - 1];
+
             const direito = this.multiplicar();
             expressao = new Binario<TipoDeSimboloDelegua>(this.hashArquivo, expressao, operador, direito);
         }
 
+        if (this.verificarSeSimboloAtualEIgualA(tiposDeSimbolos.MAIS_IGUAL)) {
+            const operador = this.simbolos[this.atual - 1];
+
+            const direito = this.atribuir();
+            expressao = new Binario<TipoDeSimboloDelegua>(this.hashArquivo, expressao, operador, direito);
+        }
+
         return expressao;
     }
 
diff --git a/fontes/interpretador/interpretador-base.ts b/fontes/interpretador/interpretador-base.ts
index ed2da61a..10df8e6d 100644
--- a/fontes/interpretador/interpretador-base.ts
+++ b/fontes/interpretador/interpretador-base.ts
@@ -249,6 +249,7 @@ export class InterpretadorBase implements InterpretadorInterface {
         let tipoDe = expressao.valor;
 
         if (
+            tipoDe instanceof AcessoIndiceVariavel ||
             tipoDe instanceof Agrupamento ||
             tipoDe instanceof Binario ||
             tipoDe instanceof Chamada ||
@@ -1615,6 +1616,12 @@ export class InterpretadorBase implements InterpretadorInterface {
         for (let i = 0; i < expressao.chaves.length; i++) {
             const promises = await Promise.all([this.avaliar(expressao.chaves[i]), this.avaliar(expressao.valores[i])]);
 
+            if (typeof promises[0] === 'boolean') {
+                const chaveLogico = promises[0] === true ? 'verdadeiro' : 'falso';
+                dicionario[chaveLogico] = promises[1];
+                continue;
+            }
+
             dicionario[promises[0]] = promises[1];
         }
         return dicionario;


Test patch:
diff --git a/testes/interpretador/interpretador.test.ts b/testes/interpretador/interpretador.test.ts
index 92a9791b..34c8058b 100644
--- a/testes/interpretador/interpretador.test.ts
+++ b/testes/interpretador/interpretador.test.ts
@@ -172,6 +172,28 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
+                it('Dicionário com chave lógica', async () => {
+                    const saidasMensagens = [,
+                        '{"verdadeiro":"valor","falso":"valor2"}'
+                    ];
+
+                    const retornoLexador = lexador.mapear([
+                        'escreva({',
+                        'verdadeiro: \'valor\',',
+                        'falso: \'valor2\'',
+                        '})',
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                    interpretador.funcaoDeRetorno = (saida: any) => {
+                        expect(saidasMensagens.includes(saida)).toBeTruthy();
+                    };
+
+                    const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros).toHaveLength(0);
+                });
+
                 it('Concatenação com um operador sendo tipo texto e outro operador qualquer', async () => {
                     const retornoLexador = lexador.mapear(["var a = 1 + '1'"], -1);
                     const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
@@ -181,6 +203,27 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
+                it('Concatenação com atribuição de texto', async () => {
+                    const saidasMensagens = [
+                        'oi tudo bem'
+                    ];
+
+                    const retornoLexador = lexador.mapear([
+                        "var frase = ''",
+                        "frase += 'oi' + ' tudo bem'",
+                        "escreva(frase)"
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+                    interpretador.funcaoDeRetorno = (saida: any) => {
+                        expect(saidasMensagens.includes(saida)).toBeTruthy();
+                    };
+
+                    const retornoInterpretador = await interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros).toHaveLength(0);
+                });
+
                 it('Interpolação de Texto/Função/Expressão', async () => {
                     const saidasMensagens = [
                         'Minha comida favorita é strogonoff',
@@ -524,7 +567,8 @@ describe('Interpretador', () => {
                         'nulo',
                         'texto',
                         'número',
-                        'dicionário'
+                        'dicionário',
+                        'número',
                     ];
 
                     const retornoLexador = lexador.mapear(
@@ -556,6 +600,10 @@ describe('Interpretador', () => {
                             'var letras = "abc"',
                             'escreva(tipo de letras.tamanho())',
                             'escreva(tipo de { "chave": verdadeiro })',
+                            'var produtos = {',
+                            '"preco": 25',
+                            '}',
+                            'escreva(tipo de produtos[\'preco\'])',
                         ],
                         -1
                     );