Repository: DesignLiquido/delegua
Pull request #148 (2022-10-30 15:32:42)

#146 Erro ao comparar nulos
https://github.com/DesignLiquido/delegua/issues/146


Patch:
diff --git a/fontes/interpretador/inferenciador.ts b/fontes/interpretador/inferenciador.ts
index 7355367e..e705db51 100644
--- a/fontes/interpretador/inferenciador.ts
+++ b/fontes/interpretador/inferenciador.ts
@@ -14,9 +14,10 @@ export function inferirTipoVariavel(
         case 'undefined':
             return 'nulo';
         case 'object':
-            // Variável pode ser vetor ou dicionário.
             if (Array.isArray(variavel))
                 return 'vetor';
+            if (variavel === null)
+                return 'nulo'
             return 'dicionário';
         case 'function':
             return 'função';
diff --git a/fontes/interpretador/interpretador.ts b/fontes/interpretador/interpretador.ts
index a054b864..ebacc229 100644
--- a/fontes/interpretador/interpretador.ts
+++ b/fontes/interpretador/interpretador.ts
@@ -207,6 +207,8 @@ export class Interpretador implements InterpretadorInterface {
         esquerda: VariavelInterface | any,
         direita: VariavelInterface | any
     ): boolean {
+        if (esquerda === null && direita === null) return true;
+        if (esquerda === null) return false;
         if (esquerda.tipo) {
             if (
                 esquerda.tipo === 'nulo' &&
@@ -218,8 +220,6 @@ export class Interpretador implements InterpretadorInterface {
 
             return esquerda.valor === direita.valor;
         }
-        if (esquerda === null && direita === null) return true;
-        if (esquerda === null) return false;
 
         return esquerda === direita;
     }
@@ -262,16 +262,16 @@ export class Interpretador implements InterpretadorInterface {
         const direita: VariavelInterface | any = this.avaliar(
             expressao.direita
         );
-        const valorEsquerdo: any = esquerda.hasOwnProperty('valor')
+        const valorEsquerdo: any = esquerda?.hasOwnProperty('valor')
             ? esquerda.valor
             : esquerda;
-        const valorDireito: any = direita.hasOwnProperty('valor')
+        const valorDireito: any = direita?.hasOwnProperty('valor')
             ? direita.valor
             : direita;
-        const tipoEsquerdo: string = esquerda.hasOwnProperty('tipo')
+        const tipoEsquerdo: string = esquerda?.hasOwnProperty('tipo')
             ? esquerda.tipo
             : inferirTipoVariavel(esquerda);
-        const tipoDireito: string = direita.hasOwnProperty('tipo')
+        const tipoDireito: string = direita?.hasOwnProperty('tipo')
             ? direita.tipo
             : inferirTipoVariavel(direita);
 


Test patch:
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index 991be412..3be5039a 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -104,6 +104,15 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros).toHaveLength(0);
                 });
 
+                it('nulo igual a nulo', () => {
+                    const retornoLexador = delegua.lexador.mapear(["escreva(nulo == nulo)"], -1);
+                    const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
+                    
+                    const retornoInterpretador = delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+        
+                    expect(retornoInterpretador.erros).toHaveLength(0);
+                });
+
                 it('verdadeiro', () => {
                     const retornoLexador = delegua.lexador.mapear(["escreva(verdadeiro)"], -1);
                     const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);