Repository: DesignLiquido/delegua
Pull request #547 (2023-11-07 14:34:33)

[delegua] analisador semântico para o método falhar


Patch:
diff --git a/fontes/analisador-semantico/analisador-semantico.ts b/fontes/analisador-semantico/analisador-semantico.ts
index c5ec3ecb..71baae47 100644
--- a/fontes/analisador-semantico/analisador-semantico.ts
+++ b/fontes/analisador-semantico/analisador-semantico.ts
@@ -11,6 +11,7 @@ import {
     Escreva,
     EscrevaMesmaLinha,
     Expressao,
+    Falhar,
     Fazer,
     FuncaoDeclaracao,
     Importar,
@@ -124,7 +125,7 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
     }
 
     private verificarTipoDe(valor: Construto): Promise<any> {
-        if (valor instanceof Binario ) {
+        if (valor instanceof Binario) {
             this.verificarTipoDe(valor.direita);
             this.verificarTipoDe(valor.esquerda);
         }
@@ -137,7 +138,21 @@ export class AnalisadorSemantico implements AnalisadorSemanticoInterface {
         return Promise.resolve();
     }
 
-    visitarExpressaoFalhar(expressao: any): Promise<any> {
+    visitarExpressaoFalhar(expressao: Falhar): Promise<any> {
+        return this.verificarFalhar(expressao.explicacao);
+    }
+
+    private verificarFalhar(valor: Construto): Promise<any> {
+        if (valor instanceof Binario) {
+            this.verificarFalhar(valor.direita);
+            this.verificarFalhar(valor.esquerda);
+        }
+        if (valor instanceof Agrupamento) {
+            return this.verificarFalhar(valor.expressao);
+        }
+        if (valor instanceof Variavel) {
+            return this.verificarVariavel(valor);
+        }
         return Promise.resolve();
     }
 


Test patch:
diff --git a/testes/analisador-semantico.test.ts b/testes/analisador-semantico.test.ts
index dc0062f6..11127cfc 100644
--- a/testes/analisador-semantico.test.ts
+++ b/testes/analisador-semantico.test.ts
@@ -716,5 +716,55 @@ describe('Analisador semântico', () => {
             });
 
         });
+
+        describe('Cenários falhar', () => {
+            describe('Cenários de sucesso', () => {
+                it('Sucesso - falhar com variável definida com valor válido', () => {
+                    const retornoLexador = lexador.mapear([
+                        "const valor = 'teste'      ",
+                        "falhar 'falhar ' + valor   ",
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                    const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
+                    expect(retornoAnalisadorSemantico).toBeTruthy();
+                    expect(retornoAnalisadorSemantico.erros).toHaveLength(0);
+                });
+
+                it('Sucesso - falhar tipo de binario com variável não definida e agrupamento', () => {
+                    const retornoLexador = lexador.mapear([
+                        "const a = 1      ",
+                        "const b = 1      ",
+                        "falhar (a + b)  ",
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                    const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
+                    expect(retornoAnalisadorSemantico).toBeTruthy();
+                    expect(retornoAnalisadorSemantico.erros).toHaveLength(0);
+                });
+            });
+            describe('Cenários de falha', () => {
+                it('Falhar com variável não definida', () => {
+                    const retornoLexador = lexador.mapear([
+                        "falhar 'falhar ' + valor   ",
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                    const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
+                    expect(retornoAnalisadorSemantico).toBeTruthy();
+                    expect(retornoAnalisadorSemantico.erros).toHaveLength(1);
+                });
+
+                it('Falhar tipo de binario com variável não definida e agrupamento', () => {
+                    const retornoLexador = lexador.mapear([
+                        "const a = 1      ",
+                        "falhar (a + b)  ",
+                    ], -1);
+                    const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+                    const retornoAnalisadorSemantico = analisadorSemantico.analisar(retornoAvaliadorSintatico.declaracoes);
+                    expect(retornoAnalisadorSemantico).toBeTruthy();
+                    expect(retornoAnalisadorSemantico.erros).toHaveLength(1);
+                });
+             });
+
+        });
     });
 });