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