Repository: DesignLiquido/delegua
Pull request #422 (2023-05-29 02:14:26)

Tradução de herança e uso de `pass` - Python

github-actions[bot]: <!-- jest coverage report action for options with hash 781087021f8e6c43aac1e668f4520603 -->

## Coverage report 



| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | Category   | Percentage                                                     | Covered / Total |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------- | :------------------------------------------------------------- | :-------------: |
|                                                                           🔴                                                                           | Statements | <div title="Base coverage is: 55.03%">54.2% (-0.83% 🔻)</div>  |    7445/13736   |
|                                                                           🔴                                                                           | Branches   | <div title="Base coverage is: 45.5%">44.6% (-0.9% 🔻)</div>    |    2267/5083    |
|                                                                           🔴                                                                           | Functions  | <div title="Base coverage is: 48.13%">47.51% (-0.62% 🔻)</div> |    1079/2271    |
|                                                                           🔴                                                                           | Lines      | <div title="Base coverage is: 54.9%">54.06% (-0.83% 🔻)</div>  |    7272/13451   |


<details><summary>Show files with reduced coverage 🔻</summary>
<br/>

| <div title="Status of coverage:&#10; 🟢 - ok&#10; 🟡 - slightly more than threshold&#10; 🔴 - under the threshold">St.<sup>:grey_question:</sup></div> | File                                                                        | Statements                                                      | Branches                                                        | Functions                                                      | Lines                                                           |
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------- | :-------------------------------------------------------------- | :-------------------------------------------------------------- | :------------------------------------------------------------- | :-------------------------------------------------------------- |
|                                                                           🔴                                                                           | <div title="tradutores/tradutor-python.ts">`...` / tradutor-python.ts</div> | <div title="Base coverage is: 85.71%">33.93% (-51.79% 🔻)</div> | <div title="Base coverage is: 71.79%">13.75% (-58.04% 🔻)</div> | <div title="Base coverage is: 87.1%">41.94% (-45.16% 🔻)</div> | <div title="Base coverage is: 85.51%">33.64% (-51.88% 🔻)</div> |

</details>

## Test suite run success
507 tests passing in 45 suites.

<p align="right">Report generated by <a href="https://github.com/ArtiomTr/jest-coverage-report-action">🧪jest coverage report action</a> from 6c11f7518dc41a8b2d96a4df867feb71d68e1925</p>
<!-- Sticky Pull Request Comment -->

Patch:
diff --git a/fontes/tradutores/tradutor-python.ts b/fontes/tradutores/tradutor-python.ts
index c7015154..9d88868c 100644
--- a/fontes/tradutores/tradutor-python.ts
+++ b/fontes/tradutores/tradutor-python.ts
@@ -249,6 +249,13 @@ export class TradutorPython implements TradutorInterface {
         }
 
         resultado += '):\n';
+        if (metodoClasse.funcao.corpo.length === 0) {
+            resultado += ' '.repeat(this.indentacao + 4);
+            resultado += 'pass\n'
+            this.indentacao -= 4;
+            return resultado;
+        }
+
         resultado += this.logicaComumBlocoEscopo(metodoClasse.funcao.corpo);
         resultado += ' '.repeat(this.indentacao) + '\n';
 
@@ -260,9 +267,11 @@ export class TradutorPython implements TradutorInterface {
         let resultado = 'class ';
 
         if (declaracaoClasse.superClasse)
-            resultado += `${declaracaoClasse.simbolo.lexema} extends ${declaracaoClasse.superClasse.simbolo.lexema} {\n`;
+            resultado += `${declaracaoClasse.simbolo.lexema}(${declaracaoClasse.superClasse.simbolo.lexema}):\n`;
         else resultado += declaracaoClasse.simbolo.lexema + ':\n';
 
+        if(declaracaoClasse.metodos.length === 0) return resultado += '    pass\n'
+
         for (let metodo of declaracaoClasse.metodos) {
             resultado += this.logicaTraducaoMetodoClasse(metodo);
         }


Test patch:
diff --git a/testes/tradutores/tradutor-python.test.ts b/testes/tradutores/tradutor-python.test.ts
index 721019e1..132a5f02 100644
--- a/testes/tradutores/tradutor-python.test.ts
+++ b/testes/tradutores/tradutor-python.test.ts
@@ -379,6 +379,22 @@ describe('Tradutor Delégua -> Python', () => {
             expect(resultado).toMatch(/print\('Não é nenhum desses valores: 10, 20, 30'\)/i);
         });
 
+        it('leia -> input', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'var nome = leia(\'Digite seu nome: \')',
+                    'escreva(nome)'
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/nome = input\(\'Digite seu nome: \'\)/i);
+            expect(resultado).toMatch(/print\(nome\)/i);
+        });
+
         it('isto -> this', () => {
             const retornoLexador = lexador.mapear(
                 [
@@ -408,6 +424,56 @@ describe('Tradutor Delégua -> Python', () => {
             expect(resultado).toMatch(/teste.mostrarValor\(\)/i);
         });
 
+        it('herda', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'classe Animal {',
+                    'corre() {',
+                    'escreva("correndo");',
+                    '}',
+                    '}',
+                    'classe Cachorro herda Animal {}',
+                    'var thor = Cachorro();',
+                    'thor.corre();',
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/class Animal:/i);
+            expect(resultado).toMatch(/def corre\(self\):/i);
+            expect(resultado).toMatch(/print\('correndo'\)/i);
+            expect(resultado).toMatch(/class Cachorro\(Animal\):/i);
+            expect(resultado).toMatch(/pass/i);
+            expect(resultado).toMatch(/thor = Cachorro\(\)/i);
+            expect(resultado).toMatch(/thor.corre\(\)/i);
+        });
+
+        it('método de classe vazio - metodo de classe vazio com \'pass\'', () => {
+            const retornoLexador = lexador.mapear(
+                [
+                    'classe Cachorro {',
+                    'corre() {',
+                    '}',
+                    '}',
+                    'var thor = Cachorro();',
+                    'thor.corre();',
+                ],
+                -1
+            );
+            const retornoAvaliadorSintatico = avaliadorSintatico.analisar(retornoLexador, -1);
+
+            const resultado = tradutor.traduzir(retornoAvaliadorSintatico.declaracoes);
+            expect(resultado).toBeTruthy();
+            expect(resultado).toMatch(/class Cachorro:/i);
+            expect(resultado).toMatch(/def corre\(self\):/i);
+            expect(resultado).toMatch(/pass/i);
+            expect(resultado).toMatch(/thor = Cachorro\(\)/i);
+            expect(resultado).toMatch(/thor.corre\(\)/i);
+        });
+
         it('tente - pegue - finalmente -> try - except - finally', () => {
             const retornoLexador = lexador.mapear(
                 [