@designliquido/delegua 1.16.2 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts +14 -0
  2. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico.js +15 -11
  4. package/analisador-semantico/analisador-semantico.js.map +1 -1
  5. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +2 -1
  6. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
  7. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +87 -12
  8. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  9. package/avaliador-sintatico/avaliador-sintatico-base.d.ts +1 -1
  10. package/avaliador-sintatico/avaliador-sintatico-base.d.ts.map +1 -1
  11. package/avaliador-sintatico/avaliador-sintatico.d.ts +4 -4
  12. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  13. package/avaliador-sintatico/avaliador-sintatico.js +30 -20
  14. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  15. package/bin/package.json +1 -1
  16. package/construtos/ajuda-como-construto.d.ts +2 -2
  17. package/construtos/ajuda-como-construto.d.ts.map +1 -1
  18. package/construtos/ajuda-como-construto.js.map +1 -1
  19. package/declaracoes/se.d.ts +4 -7
  20. package/declaracoes/se.d.ts.map +1 -1
  21. package/declaracoes/se.js.map +1 -1
  22. package/declaracoes/var.d.ts +2 -2
  23. package/declaracoes/var.d.ts.map +1 -1
  24. package/declaracoes/var.js.map +1 -1
  25. package/interfaces/declaracoes/caminho-se-senao-interface.d.ts +7 -0
  26. package/interfaces/declaracoes/caminho-se-senao-interface.d.ts.map +1 -0
  27. package/interfaces/declaracoes/caminho-se-senao-interface.js +3 -0
  28. package/interfaces/declaracoes/caminho-se-senao-interface.js.map +1 -0
  29. package/interfaces/declaracoes/index.d.ts +2 -0
  30. package/interfaces/declaracoes/index.d.ts.map +1 -0
  31. package/interfaces/declaracoes/index.js +18 -0
  32. package/interfaces/declaracoes/index.js.map +1 -0
  33. package/interfaces/interpretador-interface.d.ts +1 -1
  34. package/interfaces/interpretador-interface.d.ts.map +1 -1
  35. package/interpretador/argumento-interface.d.ts +1 -1
  36. package/interpretador/argumento-interface.d.ts.map +1 -1
  37. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +3 -3
  38. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  39. package/interpretador/estruturas/chamavel.d.ts +1 -1
  40. package/interpretador/estruturas/chamavel.d.ts.map +1 -1
  41. package/interpretador/estruturas/chamavel.js +3 -0
  42. package/interpretador/estruturas/chamavel.js.map +1 -1
  43. package/interpretador/estruturas/delegua-funcao.d.ts +2 -2
  44. package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
  45. package/interpretador/estruturas/delegua-funcao.js +2 -2
  46. package/interpretador/estruturas/delegua-funcao.js.map +1 -1
  47. package/interpretador/estruturas/funcao-padrao.d.ts +2 -2
  48. package/interpretador/estruturas/funcao-padrao.d.ts.map +1 -1
  49. package/interpretador/estruturas/funcao-padrao.js +4 -2
  50. package/interpretador/estruturas/funcao-padrao.js.map +1 -1
  51. package/interpretador/estruturas/metodo-polimorfico.d.ts +1 -1
  52. package/interpretador/estruturas/metodo-polimorfico.d.ts.map +1 -1
  53. package/interpretador/estruturas/metodo-polimorfico.js +2 -2
  54. package/interpretador/estruturas/metodo-polimorfico.js.map +1 -1
  55. package/interpretador/interpretador-base.d.ts +18 -11
  56. package/interpretador/interpretador-base.d.ts.map +1 -1
  57. package/interpretador/interpretador-base.js +101 -230
  58. package/interpretador/interpretador-base.js.map +1 -1
  59. package/interpretador/interpretador.d.ts +2 -6
  60. package/interpretador/interpretador.d.ts.map +1 -1
  61. package/interpretador/interpretador.js +126 -11
  62. package/interpretador/interpretador.js.map +1 -1
  63. package/lexador/lexador.d.ts.map +1 -1
  64. package/lexador/lexador.js +20 -1
  65. package/lexador/lexador.js.map +1 -1
  66. package/lexador/palavras-reservadas.d.ts +2 -86
  67. package/lexador/palavras-reservadas.d.ts.map +1 -1
  68. package/lexador/palavras-reservadas.js.map +1 -1
  69. package/package.json +1 -1
  70. package/tipos-de-simbolos/delegua.d.ts +1 -0
  71. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  72. package/tipos-de-simbolos/delegua.js +1 -0
  73. package/tipos-de-simbolos/delegua.js.map +1 -1
  74. package/tradutores/index.d.ts +1 -1
  75. package/tradutores/index.d.ts.map +1 -1
  76. package/tradutores/index.js +1 -1
  77. package/tradutores/index.js.map +1 -1
  78. package/tradutores/tradutor-assemblyscript.js +1 -1
  79. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  80. package/tradutores/tradutor-javascript.js +1 -1
  81. package/tradutores/tradutor-javascript.js.map +1 -1
  82. package/tradutores/tradutor-reverso-calango.d.ts +45 -0
  83. package/tradutores/tradutor-reverso-calango.d.ts.map +1 -0
  84. package/tradutores/tradutor-reverso-calango.js +351 -0
  85. package/tradutores/tradutor-reverso-calango.js.map +1 -0
  86. package/tradutores/tradutor-reverso-python.d.ts +58 -26
  87. package/tradutores/tradutor-reverso-python.d.ts.map +1 -1
  88. package/tradutores/tradutor-reverso-python.js +609 -52
  89. package/tradutores/tradutor-reverso-python.js.map +1 -1
  90. package/umd/delegua.js +1426 -588
  91. package/tradutores/tradutor-calango.d.ts +0 -23
  92. package/tradutores/tradutor-calango.d.ts.map +0 -1
  93. package/tradutores/tradutor-calango.js +0 -54
  94. package/tradutores/tradutor-calango.js.map +0 -1
@@ -30,14 +30,16 @@ const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-ve
30
30
  * recomendado para uso em execuções que ocorrem no navegador de internet.
31
31
  */
32
32
  class InterpretadorBase {
33
- constructor(diretorioBase, performance = false, funcaoDeRetorno = null, funcaoDeRetornoMesmaLinha = null) {
33
+ constructor(diretorioBase, performance = false, funcaoDeRetorno = undefined, funcaoDeRetornoMesmaLinha = undefined) {
34
34
  this.resultadoInterpretador = [];
35
+ this.linhaDeclaracaoAtual = -1;
36
+ this.hashArquivoDeclaracaoAtual = -1;
35
37
  this.classeAtualEmExecucao = null;
36
- this.funcaoDeRetorno = null;
37
- this.funcaoDeRetornoMesmaLinha = null;
38
- this.interfaceDeEntrada = null; // Originalmente é `readline.Interface`
39
- this.interfaceEntradaSaida = null;
40
- this.funcaoVerificarIteracao = null;
38
+ this.funcaoDeRetorno = undefined;
39
+ this.funcaoDeRetornoMesmaLinha = undefined;
40
+ this.interfaceDeEntrada = undefined; // Originalmente é `readline.Interface`
41
+ this.interfaceEntradaSaida = undefined;
42
+ this.funcaoVerificarIteracao = undefined;
41
43
  this.emDeclaracaoTente = false;
42
44
  // typeName → methodName → DeleguaFuncao
43
45
  this.extensoesGlobais = new Map();
@@ -60,8 +62,12 @@ class InterpretadorBase {
60
62
  this.diretorioBase = diretorioBase;
61
63
  this.performance = performance;
62
64
  this.funcaoDeRetorno = funcaoDeRetorno || console.log;
65
+ const _process = globalThis.process;
63
66
  this.funcaoDeRetornoMesmaLinha =
64
- funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
67
+ funcaoDeRetornoMesmaLinha ||
68
+ (_process?.stdout?.write
69
+ ? _process.stdout.write.bind(_process.stdout)
70
+ : (texto) => console.log(texto));
65
71
  this.erros = [];
66
72
  this.declaracoes = [];
67
73
  this.resultadoInterpretador = [];
@@ -92,8 +98,9 @@ class InterpretadorBase {
92
98
  async cederControle(iteracoes) {
93
99
  if (iteracoes % this.iteracoesParaCederControle === 0) {
94
100
  await new Promise((resolve) => {
95
- if (typeof setImmediate !== 'undefined') {
96
- setImmediate(resolve);
101
+ const _setImmediate = globalThis.setImmediate;
102
+ if (_setImmediate) {
103
+ _setImmediate(resolve);
97
104
  }
98
105
  else {
99
106
  setTimeout(resolve, 0);
@@ -132,6 +139,7 @@ class InterpretadorBase {
132
139
  case construtos_1.AcessoMetodoOuPropriedade:
133
140
  case construtos_1.AcessoIndiceVariavel:
134
141
  case construtos_1.Dicionario:
142
+ case construtos_1.Leia:
135
143
  case construtos_1.Literal:
136
144
  case construtos_1.Vetor:
137
145
  return '';
@@ -247,10 +255,10 @@ class InterpretadorBase {
247
255
  const elementosComoConstrutos = elementos.map((valor) => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
248
256
  return new construtos_1.TuplaN(expressao.hashArquivo, expressao.linha, elementosComoConstrutos);
249
257
  }
250
- async visitarExpressaoAtribuicaoPorIndicesMatriz(expressao) {
258
+ async visitarExpressaoAtribuicaoPorIndicesMatriz(_) {
251
259
  throw new Error('Método não implementado.');
252
260
  }
253
- async visitarExpressaoAcessoElementoMatriz(expressao) {
261
+ async visitarExpressaoAcessoElementoMatriz(_) {
254
262
  throw new Error('Método não implementado.');
255
263
  }
256
264
  textoParaRegex(texto) {
@@ -265,14 +273,14 @@ class InterpretadorBase {
265
273
  visitarExpressaoExpressaoRegular(expressao) {
266
274
  return Promise.resolve(this.textoParaRegex(expressao.valor));
267
275
  }
268
- visitarExpressaoTipoDe(expressao) {
276
+ visitarExpressaoTipoDe(_) {
269
277
  throw new Error('Método não implementado.');
270
278
  }
271
279
  async visitarExpressaoFalhar(expressao) {
272
280
  const textoFalha = expressao.explicacao.valor ?? (await this.avaliar(expressao.explicacao)).valor;
273
281
  throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
274
282
  }
275
- async visitarExpressaoFimPara(declaracao) {
283
+ async visitarExpressaoFimPara(_) {
276
284
  throw new Error('Método não implementado.');
277
285
  }
278
286
  async visitarExpressaoReferenciaFuncao(expressao) {
@@ -341,6 +349,9 @@ class InterpretadorBase {
341
349
  */
342
350
  async resolverInterpolacoes(textoOriginal, linha) {
343
351
  const variaveis = textoOriginal.match(this.regexInterpolacao);
352
+ if (!variaveis) {
353
+ return [];
354
+ }
344
355
  return await Promise.all(variaveis.map(async (s) => {
345
356
  const expressaoInterpolacao = s.replace(/[\$\{\}]*/gm, '');
346
357
  const microLexador = this.microLexador.mapear(expressaoInterpolacao);
@@ -555,6 +566,9 @@ class InterpretadorBase {
555
566
  }
556
567
  throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
557
568
  }
569
+ converterParaBigInt(valor) {
570
+ return typeof valor === 'bigint' ? valor : BigInt(Math.floor(Number(valor)));
571
+ }
558
572
  async visitarExpressaoBinaria(expressao) {
559
573
  const esquerda = await this.avaliar(expressao.esquerda);
560
574
  const direita = await this.avaliar(expressao.direita);
@@ -566,7 +580,7 @@ class InterpretadorBase {
566
580
  const nomeOperador = 'operador' + expressao.operador.lexema;
567
581
  const metodoOperador = valorEsquerdo.classe.encontrarMetodo(nomeOperador);
568
582
  if (metodoOperador) {
569
- const metodoBound = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
583
+ const metodoASerChamado = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
570
584
  const argumentoOperador = direita && Object.prototype.hasOwnProperty.call(direita, 'tipo')
571
585
  ? direita
572
586
  : {
@@ -574,7 +588,7 @@ class InterpretadorBase {
574
588
  valor: valorDireito,
575
589
  imutavel: false,
576
590
  };
577
- return await metodoBound.chamar(this, [{ nome: null, valor: argumentoOperador }]);
591
+ return await metodoASerChamado.chamar(this, [{ nome: null, valor: argumentoOperador }]);
578
592
  }
579
593
  }
580
594
  const tipoEsquerdo = esquerda?.hasOwnProperty('tipo')
@@ -588,13 +602,7 @@ class InterpretadorBase {
588
602
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
589
603
  // Auto-promove para BigInt se qualquer operando for BigInt
590
604
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
591
- const esq = typeof valorEsquerdo === 'bigint'
592
- ? valorEsquerdo
593
- : BigInt(Math.floor(Number(valorEsquerdo)));
594
- const dir = typeof valorDireito === 'bigint'
595
- ? valorDireito
596
- : BigInt(Math.floor(Number(valorDireito)));
597
- return esq ** dir;
605
+ return this.converterParaBigInt(valorEsquerdo) ** this.converterParaBigInt(valorDireito);
598
606
  }
599
607
  const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
600
608
  return resultadoExponenciacao;
@@ -621,13 +629,7 @@ class InterpretadorBase {
621
629
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
622
630
  // Auto-promove para BigInt se qualquer operando for BigInt
623
631
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
624
- const esq = typeof valorEsquerdo === 'bigint'
625
- ? valorEsquerdo
626
- : BigInt(Math.floor(Number(valorEsquerdo)));
627
- const dir = typeof valorDireito === 'bigint'
628
- ? valorDireito
629
- : BigInt(Math.floor(Number(valorDireito)));
630
- return esq - dir;
632
+ return this.converterParaBigInt(valorEsquerdo) - this.converterParaBigInt(valorDireito);
631
633
  }
632
634
  return Number(valorEsquerdo) - Number(valorDireito);
633
635
  case delegua_1.default.ADICAO:
@@ -638,13 +640,13 @@ class InterpretadorBase {
638
640
  }
639
641
  // Auto-promove para BigInt se qualquer operando for BigInt
640
642
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
641
- const esq = typeof valorEsquerdo === 'bigint'
643
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
642
644
  ? valorEsquerdo
643
645
  : BigInt(Math.floor(Number(valorEsquerdo)));
644
- const dir = typeof valorDireito === 'bigint'
646
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
645
647
  ? valorDireito
646
648
  : BigInt(Math.floor(Number(valorDireito)));
647
- return esq + dir;
649
+ return valorResolvidoEsquerdo + valorResolvidoDireito;
648
650
  }
649
651
  if (this.tiposNumericos.includes(tipoEsquerdo) &&
650
652
  this.tiposNumericos.includes(tipoDireito)) {
@@ -674,13 +676,13 @@ class InterpretadorBase {
674
676
  }
675
677
  // Retorna BigInt se qualquer operando for BigInt
676
678
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
677
- const esq = typeof valorEsquerdo === 'bigint'
679
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
678
680
  ? valorEsquerdo
679
681
  : BigInt(Math.floor(Number(valorEsquerdo)));
680
- const dir = typeof valorDireito === 'bigint'
682
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
681
683
  ? valorDireito
682
684
  : BigInt(Math.floor(Number(valorDireito)));
683
- return esq / dir; // Trunca automaticamente
685
+ return valorResolvidoEsquerdo / valorResolvidoDireito; // Trunca automaticamente
684
686
  }
685
687
  return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
686
688
  case delegua_1.default.MULTIPLICACAO:
@@ -689,13 +691,13 @@ class InterpretadorBase {
689
691
  if ((typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') &&
690
692
  tipoEsquerdo !== delegua_2.default.TEXTO &&
691
693
  tipoDireito !== delegua_2.default.TEXTO) {
692
- const esq = typeof valorEsquerdo === 'bigint'
694
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
693
695
  ? valorEsquerdo
694
696
  : BigInt(Math.floor(Number(valorEsquerdo)));
695
- const dir = typeof valorDireito === 'bigint'
697
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
696
698
  ? valorDireito
697
699
  : BigInt(Math.floor(Number(valorDireito)));
698
- return esq * dir;
700
+ return valorResolvidoEsquerdo * valorResolvidoDireito;
699
701
  }
700
702
  if (tipoEsquerdo === delegua_2.default.TEXTO ||
701
703
  tipoDireito === delegua_2.default.TEXTO) {
@@ -742,13 +744,7 @@ class InterpretadorBase {
742
744
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
743
745
  // Auto-promove para BigInt se qualquer operando for BigInt
744
746
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
745
- const esq = typeof valorEsquerdo === 'bigint'
746
- ? valorEsquerdo
747
- : BigInt(Math.floor(Number(valorEsquerdo)));
748
- const dir = typeof valorDireito === 'bigint'
749
- ? valorDireito
750
- : BigInt(Math.floor(Number(valorDireito)));
751
- return esq & dir;
747
+ return this.converterParaBigInt(valorEsquerdo) & this.converterParaBigInt(valorDireito);
752
748
  }
753
749
  return Number(valorEsquerdo) & Number(valorDireito);
754
750
  case delegua_1.default.CIRCUMFLEXO:
@@ -758,13 +754,7 @@ class InterpretadorBase {
758
754
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
759
755
  // Auto-promove para BigInt se qualquer operando for BigInt
760
756
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
761
- const esq = typeof valorEsquerdo === 'bigint'
762
- ? valorEsquerdo
763
- : BigInt(Math.floor(Number(valorEsquerdo)));
764
- const dir = typeof valorDireito === 'bigint'
765
- ? valorDireito
766
- : BigInt(Math.floor(Number(valorDireito)));
767
- return esq ^ dir;
757
+ return this.converterParaBigInt(valorEsquerdo) ^ this.converterParaBigInt(valorDireito);
768
758
  }
769
759
  return Number(valorEsquerdo) ^ Number(valorDireito);
770
760
  case delegua_1.default.BIT_OR:
@@ -774,45 +764,21 @@ class InterpretadorBase {
774
764
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
775
765
  // Auto-promove para BigInt se qualquer operando for BigInt
776
766
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
777
- const esq = typeof valorEsquerdo === 'bigint'
778
- ? valorEsquerdo
779
- : BigInt(Math.floor(Number(valorEsquerdo)));
780
- const dir = typeof valorDireito === 'bigint'
781
- ? valorDireito
782
- : BigInt(Math.floor(Number(valorDireito)));
783
- return esq | dir;
767
+ return this.converterParaBigInt(valorEsquerdo) | this.converterParaBigInt(valorDireito);
784
768
  }
785
769
  return Number(valorEsquerdo) | Number(valorDireito);
786
770
  case delegua_1.default.MENOR_MENOR:
787
771
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
788
772
  // Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
789
- const tamanhoDeslocamentoEsquerda = Number(valorDireito);
790
- if (typeof valorEsquerdo === 'bigint' ||
791
- typeof valorDireito === 'bigint' ||
792
- tamanhoDeslocamentoEsquerda >= 32) {
793
- const esq = typeof valorEsquerdo === 'bigint'
794
- ? valorEsquerdo
795
- : BigInt(Math.floor(Number(valorEsquerdo)));
796
- const dir = typeof valorDireito === 'bigint'
797
- ? valorDireito
798
- : BigInt(Math.floor(Number(valorDireito)));
799
- return esq << dir;
773
+ if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
774
+ return this.converterParaBigInt(valorEsquerdo) << this.converterParaBigInt(valorDireito);
800
775
  }
801
776
  return Number(valorEsquerdo) << Number(valorDireito);
802
777
  case delegua_1.default.MAIOR_MAIOR:
803
778
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
804
779
  // Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
805
- const tamanhoDeslocamentoDireita = Number(valorDireito);
806
- if (typeof valorEsquerdo === 'bigint' ||
807
- typeof valorDireito === 'bigint' ||
808
- tamanhoDeslocamentoDireita >= 32) {
809
- const esq = typeof valorEsquerdo === 'bigint'
810
- ? valorEsquerdo
811
- : BigInt(Math.floor(Number(valorEsquerdo)));
812
- const dir = typeof valorDireito === 'bigint'
813
- ? valorDireito
814
- : BigInt(Math.floor(Number(valorDireito)));
815
- return esq >> dir;
780
+ if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
781
+ return this.converterParaBigInt(valorEsquerdo) >> this.converterParaBigInt(valorDireito);
816
782
  }
817
783
  return Number(valorEsquerdo) >> Number(valorDireito);
818
784
  case delegua_1.default.DIFERENTE:
@@ -845,7 +811,7 @@ class InterpretadorBase {
845
811
  : undefined;
846
812
  let valor = await this.avaliar(variavelArgumento);
847
813
  argumentos.push({
848
- nome: nomeArgumento,
814
+ nome: nomeArgumento ?? null,
849
815
  valor,
850
816
  });
851
817
  }
@@ -914,8 +880,8 @@ class InterpretadorBase {
914
880
  // mesmo que esteja tudo certo com `DeleguaFuncao`,
915
881
  // então precisamos testar o nome do construtor também.
916
882
  if (entidadeChamada instanceof estruturas_1.Chamavel ||
917
- entidadeChamada.constructor.name === 'DeleguaFuncao' ||
918
- entidadeChamada.constructor.name === 'MetodoPolimorfico') {
883
+ entidadeChamada.constructor === estruturas_1.DeleguaFuncao ||
884
+ entidadeChamada.constructor === estruturas_1.MetodoPolimorfico) {
919
885
  const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
920
886
  return retornoEntidadeChamada;
921
887
  }
@@ -961,10 +927,6 @@ class InterpretadorBase {
961
927
  indice = this.resolverValor(await this.avaliar(expressao.indice));
962
928
  }
963
929
  switch (expressao.alvo.constructor) {
964
- case construtos_1.Variavel:
965
- const alvoVariavel = expressao.alvo;
966
- this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
967
- break;
968
930
  case construtos_1.AcessoMetodoOuPropriedade:
969
931
  // Nunca será método aqui: apenas propriedade.
970
932
  const alvoPropriedade = expressao.alvo;
@@ -976,8 +938,12 @@ class InterpretadorBase {
976
938
  await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
977
939
  }
978
940
  break;
941
+ case construtos_1.Variavel:
942
+ const alvoVariavel = expressao.alvo;
943
+ this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
944
+ break;
979
945
  default:
980
- throw new excecoes_1.ErroEmTempoDeExecucao(null, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
946
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
981
947
  }
982
948
  return valorResolvido;
983
949
  }
@@ -1069,10 +1035,10 @@ class InterpretadorBase {
1069
1035
  const declaracaoInicializador = Array.isArray(declaracao.inicializador)
1070
1036
  ? declaracao.inicializador[0]
1071
1037
  : declaracao.inicializador;
1072
- if (declaracaoInicializador !== null) {
1038
+ if (declaracaoInicializador !== null && declaracaoInicializador !== undefined) {
1073
1039
  await this.avaliar(declaracaoInicializador);
1074
1040
  }
1075
- let retornoExecucao;
1041
+ let retornoExecucao = undefined;
1076
1042
  let iteracoes = 0;
1077
1043
  while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
1078
1044
  if (declaracao.condicao !== null &&
@@ -1086,7 +1052,7 @@ class InterpretadorBase {
1086
1052
  return null;
1087
1053
  }
1088
1054
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
1089
- retornoExecucao = null;
1055
+ retornoExecucao = undefined;
1090
1056
  }
1091
1057
  }
1092
1058
  catch (erro) {
@@ -1097,15 +1063,19 @@ class InterpretadorBase {
1097
1063
  });
1098
1064
  return Promise.reject(erro);
1099
1065
  }
1100
- if (declaracao.incrementar !== null) {
1066
+ if (declaracao.incrementar) {
1101
1067
  await this.avaliar(declaracao.incrementar);
1102
1068
  }
1103
1069
  }
1104
1070
  return retornoExecucao;
1105
1071
  }
1106
- // TODO: Descobrir se mais algum dialeto, fora Delégua e Pituguês, usam isso.
1072
+ /**
1073
+ * Lógica de `para cada`, usada por Delégua, Pituguês, e Tenda.
1074
+ * @param {ParaCada} declaracao A declaração de `para cada` a ser executada.
1075
+ * @returns {Promise<any>} O resultado da execução da declaração.
1076
+ */
1107
1077
  async visitarDeclaracaoParaCada(declaracao) {
1108
- let retornoExecucao;
1078
+ let retornoExecucao = undefined;
1109
1079
  // Posição atual precisa ser reiniciada, pois pode estar dentro de outro
1110
1080
  // laço de repetição.
1111
1081
  declaracao.posicaoAtual = 0;
@@ -1143,7 +1113,7 @@ class InterpretadorBase {
1143
1113
  return null;
1144
1114
  }
1145
1115
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
1146
- retornoExecucao = null;
1116
+ retornoExecucao = undefined;
1147
1117
  }
1148
1118
  declaracao.posicaoAtual++;
1149
1119
  }
@@ -1169,19 +1139,20 @@ class InterpretadorBase {
1169
1139
  if (this.eVerdadeiro(avaliacaoCondicaoSe)) {
1170
1140
  return await this.executar(declaracao.caminhoEntao);
1171
1141
  }
1172
- for (let i = 0; i < declaracao.caminhosSeSenao.length; i++) {
1173
- const atual = declaracao.caminhosSeSenao[i];
1142
+ const declaracaoCaminhosSeSenao = declaracao.caminhosSeSenao || [];
1143
+ for (let i = 0; i < declaracaoCaminhosSeSenao.length; i++) {
1144
+ const atual = declaracaoCaminhosSeSenao[i];
1174
1145
  if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
1175
1146
  return await this.executar(atual.caminho);
1176
1147
  }
1177
1148
  }
1178
- if (declaracao.caminhoSenao !== null) {
1149
+ if (declaracao.caminhoSenao) {
1179
1150
  return await this.executar(declaracao.caminhoSenao);
1180
1151
  }
1181
1152
  return null;
1182
1153
  }
1183
1154
  async visitarDeclaracaoEnquanto(declaracao) {
1184
- let retornoExecucao;
1155
+ let retornoExecucao = undefined;
1185
1156
  let iteracoes = 0;
1186
1157
  while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
1187
1158
  this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
@@ -1192,7 +1163,7 @@ class InterpretadorBase {
1192
1163
  return null;
1193
1164
  }
1194
1165
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
1195
- retornoExecucao = null;
1166
+ retornoExecucao = undefined;
1196
1167
  }
1197
1168
  }
1198
1169
  catch (erro) {
@@ -1247,17 +1218,17 @@ class InterpretadorBase {
1247
1218
  }
1248
1219
  }
1249
1220
  async visitarDeclaracaoFazer(declaracao) {
1250
- let retornoExecucao;
1221
+ let retornoExecucao = undefined;
1251
1222
  let iteracoes = 0;
1252
1223
  do {
1253
1224
  try {
1254
1225
  await this.cederControle(++iteracoes);
1255
1226
  retornoExecucao = await this.executar(declaracao.caminhoFazer);
1256
1227
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
1257
- return null;
1228
+ return undefined;
1258
1229
  }
1259
1230
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
1260
- retornoExecucao = null;
1231
+ retornoExecucao = undefined;
1261
1232
  }
1262
1233
  }
1263
1234
  catch (erro) {
@@ -1299,7 +1270,7 @@ class InterpretadorBase {
1299
1270
  }
1300
1271
  }
1301
1272
  finally {
1302
- if (declaracao.caminhoFinalmente !== null)
1273
+ if (declaracao.caminhoFinalmente)
1303
1274
  valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente);
1304
1275
  this.emDeclaracaoTente = false;
1305
1276
  }
@@ -1331,7 +1302,7 @@ class InterpretadorBase {
1331
1302
  async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
1332
1303
  try {
1333
1304
  const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
1334
- this.funcaoDeRetornoMesmaLinha(formatoTexto);
1305
+ this.funcaoDeRetornoMesmaLinha?.(formatoTexto);
1335
1306
  return {
1336
1307
  tipo: 'vazio',
1337
1308
  tipoExplicito: false,
@@ -1354,7 +1325,7 @@ class InterpretadorBase {
1354
1325
  async visitarDeclaracaoEscreva(declaracao) {
1355
1326
  try {
1356
1327
  const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
1357
- this.funcaoDeRetorno(formatoTexto);
1328
+ this.funcaoDeRetorno?.(formatoTexto);
1358
1329
  return {
1359
1330
  tipo: 'vazio',
1360
1331
  tipoExplicito: false,
@@ -1398,7 +1369,7 @@ class InterpretadorBase {
1398
1369
  }
1399
1370
  async avaliacaoDeclaracaoVarOuConst(declaracao) {
1400
1371
  let valorOuOutraVariavel = null;
1401
- if (declaracao.inicializador !== null) {
1372
+ if (declaracao.inicializador != null) {
1402
1373
  valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
1403
1374
  }
1404
1375
  let valorFinal = null;
@@ -1427,16 +1398,16 @@ class InterpretadorBase {
1427
1398
  */
1428
1399
  async visitarDeclaracaoConstMultiplo(declaracao) {
1429
1400
  const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
1430
- const tipoIndividual = declaracao.tipo.replace('[]', '');
1401
+ const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
1431
1402
  for (let [indice, valor] of valoresFinais.entries()) {
1432
1403
  this.pilhaEscoposExecucao.definirConstante(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
1433
1404
  }
1434
1405
  return null;
1435
1406
  }
1436
- visitarExpressaoContinua(declaracao) {
1407
+ visitarExpressaoContinua(_) {
1437
1408
  return new quebras_1.ContinuarQuebra();
1438
1409
  }
1439
- visitarExpressaoSustar(declaracao) {
1410
+ visitarExpressaoSustar(_) {
1440
1411
  return new quebras_1.SustarQuebra();
1441
1412
  }
1442
1413
  async visitarExpressaoRetornar(declaracao) {
@@ -1616,133 +1587,29 @@ class InterpretadorBase {
1616
1587
  if (superClassesResolvidas.length > 0) {
1617
1588
  this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
1618
1589
  }
1590
+ const descritorTipoClasse = this.resolverMetodoDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas);
1591
+ // TODO: Até então, a única exceção a isso é Égua Clássico.
1592
+ // Por enquanto, tudo bem deixar isso aqui.
1593
+ descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
1594
+ this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
1595
+ return descritorTipoClasse;
1596
+ }
1597
+ resolverMetodoDeClasse(declaracao, superClassesResolvidas, _mesclaResolvidas) {
1619
1598
  const metodos = {};
1620
- const metodosEstaticos = {};
1621
- const obtenedores = {};
1622
- const definidores = {};
1623
- const obtenedoresEstaticos = {};
1624
- const definidoresEstaticos = {};
1625
- const metodosAbstratos = [];
1626
- const acessoMetodos = {};
1627
- const acessoPropriedades = {};
1628
- const definirMetodos = declaracao.metodos;
1629
- for (let i = 0; i < declaracao.metodos.length; i++) {
1630
- const metodoAtual = definirMetodos[i];
1599
+ for (const metodoAtual of declaracao.metodos) {
1631
1600
  const nomeMetodo = metodoAtual.simbolo.lexema;
1632
- // Registrar nível de acesso do método.
1633
- if (metodoAtual.acesso && metodoAtual.acesso !== 'publico') {
1634
- acessoMetodos[nomeMetodo] = metodoAtual.acesso;
1635
- }
1636
- // Métodos abstratos: registrar apenas o nome, não criar função executável.
1637
- if (metodoAtual.abstrato) {
1638
- metodosAbstratos.push(nomeMetodo);
1639
- continue;
1640
- }
1641
1601
  const eInicializador = nomeMetodo === 'construtor';
1642
1602
  const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
1643
1603
  funcao.documentacao = metodoAtual.documentacao;
1644
- // Numa classe estática, todos os métodos (exceto construtor) são estáticos.
1645
- const ehEstatico = declaracao.classeEstatica ? !eInicializador : metodoAtual.estatico;
1646
- if (metodoAtual.eObtenedor) {
1647
- if (ehEstatico) {
1648
- obtenedoresEstaticos[nomeMetodo] = funcao;
1649
- }
1650
- else {
1651
- obtenedores[nomeMetodo] = funcao;
1652
- }
1653
- continue;
1654
- }
1655
- if (metodoAtual.eDefinidor) {
1656
- if (ehEstatico) {
1657
- definidoresEstaticos[nomeMetodo] = funcao;
1658
- }
1659
- else {
1660
- definidores[nomeMetodo] = funcao;
1661
- }
1662
- continue;
1663
- }
1664
- const destino = ehEstatico && !eInicializador ? metodosEstaticos : metodos;
1665
- if (destino[nomeMetodo]) {
1666
- if (!Array.isArray(destino[nomeMetodo])) {
1667
- destino[nomeMetodo] = [destino[nomeMetodo]];
1668
- }
1669
- destino[nomeMetodo].push(funcao);
1670
- }
1671
- else {
1672
- destino[nomeMetodo] = funcao;
1673
- }
1674
- }
1675
- // Registrar propriedades estáticas no mapa de membros estáticos e níveis de acesso.
1676
- // Numa classe estática, todas as propriedades são tratadas como estáticas.
1677
- const membrosEstaticos = {};
1678
- for (const prop of declaracao.propriedades) {
1679
- if (prop.estatico || declaracao.classeEstatica) {
1680
- membrosEstaticos[prop.nome.lexema] = undefined;
1681
- }
1682
- if (prop.acesso && prop.acesso !== 'publico') {
1683
- acessoPropriedades[prop.nome.lexema] = prop.acesso;
1684
- }
1604
+ metodos[nomeMetodo] = funcao;
1685
1605
  }
1686
1606
  const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClassesResolvidas, metodos, declaracao.propriedades);
1687
- descritorTipoClasse.metodosEstaticos = metodosEstaticos;
1688
- descritorTipoClasse.membrosEstaticos = membrosEstaticos;
1689
- descritorTipoClasse.obtenedores = obtenedores;
1690
- descritorTipoClasse.definidores = definidores;
1691
- descritorTipoClasse.obtenedoresEstaticos = obtenedoresEstaticos;
1692
- descritorTipoClasse.definidoresEstaticos = definidoresEstaticos;
1693
- descritorTipoClasse.abstrata = declaracao.abstrata;
1694
- descritorTipoClasse.estrangeira = declaracao.estrangeira;
1695
- descritorTipoClasse.classeEstatica = declaracao.classeEstatica;
1696
- descritorTipoClasse.metodosAbstratos = metodosAbstratos;
1697
- descritorTipoClasse.acessoMetodos = acessoMetodos;
1698
- descritorTipoClasse.acessoPropriedades = acessoPropriedades;
1699
- // Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
1700
- // Isso só deve acontecer quando OBJETO_BASE já estiver inicializado e a classe
1701
- // atual não for o próprio OBJETO_BASE, para evitar cadeias de herança recursivas.
1702
1607
  if (descritorTipoClasse.superClasses.length === 0 &&
1703
1608
  estruturas_1.OBJETO_BASE &&
1704
1609
  descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
1705
1610
  descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
1706
1611
  }
1707
- // Calcular o OReM (linearização C3) após os pais estarem definidos.
1708
1612
  descritorTipoClasse.orem = estruturas_1.DescritorTipoClasse.computarOReM(descritorTipoClasse);
1709
- // Mesclar métodos e propriedades dos misturávels (primeiro misturável ganha se não definido na classe).
1710
- for (const misturável of mesclaResolvidas) {
1711
- for (const [nome, funcao] of Object.entries(misturável.metodos)) {
1712
- if (!descritorTipoClasse.metodos.hasOwnProperty(nome)) {
1713
- descritorTipoClasse.metodos[nome] = funcao;
1714
- }
1715
- }
1716
- for (const [nome, funcao] of Object.entries(misturável.obtenedores)) {
1717
- if (!descritorTipoClasse.obtenedores.hasOwnProperty(nome)) {
1718
- descritorTipoClasse.obtenedores[nome] = funcao;
1719
- }
1720
- }
1721
- for (const [nome, funcao] of Object.entries(misturável.definidores)) {
1722
- if (!descritorTipoClasse.definidores.hasOwnProperty(nome)) {
1723
- descritorTipoClasse.definidores[nome] = funcao;
1724
- }
1725
- }
1726
- for (const prop of misturável.propriedades) {
1727
- const jaDeclarada = descritorTipoClasse.propriedades.some((p) => p.nome.lexema === prop.nome.lexema);
1728
- if (!jaDeclarada) {
1729
- descritorTipoClasse.propriedades.push(prop);
1730
- }
1731
- }
1732
- }
1733
- // Verifica se a subclasse concreta implementa todos os métodos abstratos
1734
- // da(s) superclasse(s) abstrata(s).
1735
- if (!declaracao.abstrata && !declaracao.estrangeira) {
1736
- for (const superClasse of superClassesResolvidas) {
1737
- if (superClasse.abstrata || superClasse.estrangeira) {
1738
- superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
1739
- }
1740
- }
1741
- }
1742
- // TODO: Até então, a única exceção a isso é Égua Clássico.
1743
- // Por enquanto, tudo bem deixar isso aqui.
1744
- descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
1745
- this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
1746
1613
  return descritorTipoClasse;
1747
1614
  }
1748
1615
  /**
@@ -1789,7 +1656,8 @@ class InterpretadorBase {
1789
1656
  if (!this.extensoesGlobais.has(tipoNome)) {
1790
1657
  this.extensoesGlobais.set(tipoNome, new Map());
1791
1658
  }
1792
- this.extensoesGlobais.get(tipoNome).set(nomeMetodo, funcao);
1659
+ const extensaoGlobal = this.extensoesGlobais.get(tipoNome);
1660
+ extensaoGlobal?.set(nomeMetodo, funcao);
1793
1661
  }
1794
1662
  else {
1795
1663
  const hash = declaracao.hashArquivo;
@@ -1797,10 +1665,13 @@ class InterpretadorBase {
1797
1665
  this.extensoesModulo.set(hash, new Map());
1798
1666
  }
1799
1667
  const mapa = this.extensoesModulo.get(hash);
1668
+ if (!mapa) {
1669
+ throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.simboloTipo, 'Erro interno: mapa de extensões do módulo não encontrado.', declaracao.linha);
1670
+ }
1800
1671
  if (!mapa.has(tipoNome)) {
1801
- mapa.set(tipoNome, new Map());
1672
+ mapa?.set(tipoNome, new Map());
1802
1673
  }
1803
- mapa.get(tipoNome).set(nomeMetodo, funcao);
1674
+ mapa.get(tipoNome)?.set(nomeMetodo, funcao);
1804
1675
  }
1805
1676
  }
1806
1677
  }
@@ -1903,7 +1774,7 @@ class InterpretadorBase {
1903
1774
  dicionario[chaveLogico] = this.resolverValor(promises[1]);
1904
1775
  continue;
1905
1776
  }
1906
- dicionario[promises[0]] = this.resolverValor(promises[1]);
1777
+ dicionario[promises[0].toString()] = this.resolverValor(promises[1]);
1907
1778
  }
1908
1779
  }
1909
1780
  return dicionario;
@@ -1946,7 +1817,7 @@ class InterpretadorBase {
1946
1817
  */
1947
1818
  async visitarDeclaracaoVarMultiplo(declaracao) {
1948
1819
  const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
1949
- const tipoIndividual = declaracao.tipo.replace('[]', '');
1820
+ const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
1950
1821
  for (let [indice, valor] of valoresFinais.entries()) {
1951
1822
  this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
1952
1823
  }