Repository: DesignLiquido/delegua
Pull request #106 (2022-06-23 17:01:48)

Testando importacao de módulos


Patch:
diff --git a/fontes/bibliotecas/importar-biblioteca.ts b/fontes/bibliotecas/importar-biblioteca.ts
index bd054aa2..3181200f 100644
--- a/fontes/bibliotecas/importar-biblioteca.ts
+++ b/fontes/bibliotecas/importar-biblioteca.ts
@@ -7,7 +7,7 @@ const carregarBiblioteca = function (nomeDaBiblioteca: any, caminhoDaBiblioteca:
 
     try {
         dadosDoModulo = require(caminhoDaBiblioteca);
-    } catch (erro) {
+    } catch (erro: any) {
         throw new ErroEmTempoDeExecucao(nomeDaBiblioteca, `Biblioteca ${nomeDaBiblioteca} não encontrada para importação.`);
     }
 
diff --git a/fontes/interfaces/interpretador-interface.ts b/fontes/interfaces/interpretador-interface.ts
index bda4cf2e..ab2f77e5 100644
--- a/fontes/interfaces/interpretador-interface.ts
+++ b/fontes/interfaces/interpretador-interface.ts
@@ -1,6 +1,6 @@
 import { Ambiente } from "../ambiente";
 import { Construto } from "../construtos";
-import { Declaracao } from "../declaracoes";
+import { Declaracao, Importar } from "../declaracoes";
 import { PilhaEscoposExecucaoInterface } from "./pilha-escopos-execucao-interface";
 
 import { RetornoInterpretador } from "./retornos/retorno-interpretador";
@@ -31,7 +31,7 @@ export interface InterpretadorInterface {
     visitarExpressaoEscolha(declaracao: any): any;
     visitarExpressaoTente(declaracao: any): any;
     visitarExpressaoEnquanto(declaracao: any): any;
-    visitarExpressaoImportar(declaracao: any): any;
+    visitarExpressaoImportar(declaracao: Importar): any;
     visitarExpressaoEscreva(declaracao: any): any;
     executarBloco(declaracoes: Declaracao[], ambiente?: Ambiente): void;
     visitarExpressaoBloco(declaracao: any): null;
diff --git a/fontes/interpretador/interpretador.ts b/fontes/interpretador/interpretador.ts
index e8aafc6a..d0f078a8 100644
--- a/fontes/interpretador/interpretador.ts
+++ b/fontes/interpretador/interpretador.ts
@@ -566,7 +566,12 @@ export class Interpretador
             !caminhoTotal.endsWith('.egua') &&
             !caminhoTotal.endsWith('.delegua')
         ) {
-            return carregarBibliotecaNode(caminhoRelativo);
+            try {
+                return carregarBibliotecaNode(caminhoRelativo);
+            } catch (erro: any) {
+                this.erros.push(erro);
+                return null;
+            }
         }
 
         const conteudoImportacao = this.importador.importar(caminhoRelativo);


Test patch:
diff --git a/testes/interpretador.test.ts b/testes/interpretador.test.ts
index 9f327de5..89eab189 100644
--- a/testes/interpretador.test.ts
+++ b/testes/interpretador.test.ts
@@ -84,6 +84,16 @@ describe('Interpretador', () => {
                 });
             });
 
+            describe('Importar', () => {
+                it('Importar biblioteca externa', () => {
+                    const retornoLexador = delegua.lexador.mapear(["var commander = importar('commander')"], -1);
+                    const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
+                    const retornoInterpretador = delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros).toHaveLength(0);
+                });  
+            });
+
             describe('Operações matemáticas', () => {
                 it('Operações matemáticas - Trivial', () => {
                     const retornoLexador = delegua.lexador.mapear(["escreva(5 + 4 * 3 - 2 ** 1 / 6 % 10)"], -1);
@@ -269,6 +279,16 @@ describe('Interpretador', () => {
                     expect(retornoInterpretador.erros.length).toBeGreaterThanOrEqual(0);
                 });
             });
+
+            describe('Importar', () => {
+                it('Importar blblioteca externa que não existe', () => {
+                    const retornoLexador = delegua.lexador.mapear(["var naoexiste = importar('naoexiste')"], -1);
+                    const retornoAvaliadorSintatico = delegua.avaliadorSintatico.analisar(retornoLexador);
+                    const retornoInterpretador = delegua.interpretador.interpretar(retornoAvaliadorSintatico.declaracoes);
+
+                    expect(retornoInterpretador.erros.length).toBeGreaterThan(0);
+                })
+            });
         });
     });
 });
\ No newline at end of file