Repository: DesignLiquido/delegua
Pull request #723 (2025-03-03 15:28:27)

#714 Concatenação utilizando operador mais (+) não funciona junto com operador de incremento
https://github.com/DesignLiquido/delegua/issues/714


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..8df2e298 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 ||


Test patch:
diff --git a/testes/interpretador/interpretador.test.ts b/testes/interpretador/interpretador.test.ts
index 92a9791b..f711bff8 100644
--- a/testes/interpretador/interpretador.test.ts
+++ b/testes/interpretador/interpretador.test.ts
@@ -181,6 +181,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 +545,8 @@ describe('Interpretador', () => {
                         'nulo',
                         'texto',
                         'número',
-                        'dicionário'
+                        'dicionário',
+                        'número',
                     ];
 
                     const retornoLexador = lexador.mapear(
@@ -556,6 +578,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
                     );