Repository: DesignLiquido/delegua
Pull request #417 (2023-05-27 03:08:13)

Tradução para JavaScript de `tipo de` e `falhar`


Patch:
diff --git a/fontes/tradutores/tradutor-javascript.ts b/fontes/tradutores/tradutor-javascript.ts
index 44203876..9429436c 100644
--- a/fontes/tradutores/tradutor-javascript.ts
+++ b/fontes/tradutores/tradutor-javascript.ts
@@ -11,6 +11,7 @@ import {
     Isto,
     Literal,
     Logico,
+    TipoDe,
     Unario,
     Variavel,
     Vetor,
@@ -24,6 +25,7 @@ import {
     Escolha,
     Escreva,
     Expressao,
+    Falhar,
     Fazer,
     FuncaoDeclaracao,
     Importar,
@@ -601,6 +603,20 @@ export class TradutorJavaScript implements TradutorInterface {
         return resultado;
     }
 
+    traduzirConstrutoTipoDe(tipoDe: TipoDe): string {
+        let resultado = 'typeof ';
+
+        if (typeof tipoDe.valor === 'string') resultado += `'${tipoDe.valor}'`;
+        else if (tipoDe.valor instanceof Vetor) resultado += this.traduzirConstrutoVetor(tipoDe.valor);
+        else resultado += tipoDe.valor;        
+
+        return resultado;
+    }
+
+    traduzirDeclaracaoFalhar(falhar: Falhar) {
+        return `throw '${falhar.explicacao}'`;
+    }
+
     traduzirConstrutoUnario(unario: Unario): string {
         let resultado = '';
         if ([tiposDeSimbolos.INCREMENTAR, tiposDeSimbolos.DECREMENTAR].includes(unario.operador.tipo)) {
@@ -626,6 +642,7 @@ export class TradutorJavaScript implements TradutorInterface {
         Isto: () => 'this',
         Literal: this.traduzirConstrutoLiteral.bind(this),
         Logico: this.traduzirConstrutoLogico.bind(this),
+        TipoDe: this.traduzirConstrutoTipoDe.bind(this),
         Unario: this.traduzirConstrutoUnario.bind(this),
         Variavel: this.traduzirConstrutoVariavel.bind(this),
         Vetor: this.traduzirConstrutoVetor.bind(this),
@@ -641,6 +658,7 @@ export class TradutorJavaScript implements TradutorInterface {
         Escreva: this.traduzirDeclaracaoEscreva.bind(this),
         Expressao: this.traduzirDeclaracaoExpressao.bind(this),
         Fazer: this.traduzirDeclaracaoFazer.bind(this),
+        Falhar: this.traduzirDeclaracaoFalhar.bind(this),
         FuncaoDeclaracao: this.traduzirDeclaracaoFuncao.bind(this),
         Importar: this.traduzirDeclaracaoImportar.bind(this),
         Leia: this.traduzirDeclaracaoLeia.bind(this),


Test patch:
diff --git a/testes/tradutores/tradutor-javascript.test.ts b/testes/tradutores/tradutor-javascript.test.ts
index 372eb7a3..ec29eaa4 100644
--- a/testes/tradutores/tradutor-javascript.test.ts
+++ b/testes/tradutores/tradutor-javascript.test.ts
@@ -72,6 +72,42 @@ describe('Tradutor Delégua -> JavaScript', () => {
             expect(resultado).toMatch(/nome.toLowerCase\(\)/i);
         });
 
+        it('falhar - throw', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'falhar \"erro inesperado!\"',
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/throw 'erro inesperado!'/i);
+        });
+
+        it('tipo de - typeof', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'escreva(tipo de 1)',
+                    'escreva(tipo de \'2\')',
+                    'escreva(tipo de nulo)',
+                    'escreva(tipo de [1, 2, 3])',
+                    // 'classe Cachorro {}',
+                    // 'escreva(tipo de Cachorro)'
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/typeof 1/i);
+            expect(resultado).toMatch(/typeof \'2\'/i);
+            expect(resultado).toMatch(/typeof null/i);
+            expect(resultado).toMatch(/typeof \[1, 2, 3\]/i);
+        });
+
         it('bit a bit', () => {
             const retornoLexador = lexador.mapear(
                 [