@designliquido/delegua 1.16.3 → 1.17.1

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 (121) 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 +55 -20
  10. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts +68 -11
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.d.ts.map +1 -1
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js +433 -62
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-portugol-ipt.js.map +1 -1
  15. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +9 -0
  16. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  17. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +30 -0
  18. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  19. package/bibliotecas/primitivas-dicionario.d.ts.map +1 -1
  20. package/bibliotecas/primitivas-dicionario.js +31 -0
  21. package/bibliotecas/primitivas-dicionario.js.map +1 -1
  22. package/bin/package.json +1 -1
  23. package/construtos/ajuda-como-construto.d.ts +2 -2
  24. package/construtos/ajuda-como-construto.d.ts.map +1 -1
  25. package/construtos/ajuda-como-construto.js.map +1 -1
  26. package/declaracoes/se.d.ts +4 -7
  27. package/declaracoes/se.d.ts.map +1 -1
  28. package/declaracoes/se.js.map +1 -1
  29. package/declaracoes/var.d.ts +2 -2
  30. package/declaracoes/var.d.ts.map +1 -1
  31. package/declaracoes/var.js.map +1 -1
  32. package/estilizador/quebrador-linha.d.ts.map +1 -1
  33. package/estilizador/quebrador-linha.js +13 -0
  34. package/estilizador/quebrador-linha.js.map +1 -1
  35. package/estilizador/regras/index.d.ts +1 -0
  36. package/estilizador/regras/index.d.ts.map +1 -1
  37. package/estilizador/regras/index.js +1 -0
  38. package/estilizador/regras/index.js.map +1 -1
  39. package/estilizador/regras/regra-convencao-nomenclatura.d.ts +3 -0
  40. package/estilizador/regras/regra-convencao-nomenclatura.d.ts.map +1 -1
  41. package/estilizador/regras/regra-convencao-nomenclatura.js +34 -14
  42. package/estilizador/regras/regra-convencao-nomenclatura.js.map +1 -1
  43. package/estilizador/regras/regra-explicitar-tipos-parametros.d.ts +16 -0
  44. package/estilizador/regras/regra-explicitar-tipos-parametros.d.ts.map +1 -0
  45. package/estilizador/regras/regra-explicitar-tipos-parametros.js +50 -0
  46. package/estilizador/regras/regra-explicitar-tipos-parametros.js.map +1 -0
  47. package/formatadores/formatador-delegua.d.ts +1 -0
  48. package/formatadores/formatador-delegua.d.ts.map +1 -1
  49. package/formatadores/formatador-delegua.js +9 -3
  50. package/formatadores/formatador-delegua.js.map +1 -1
  51. package/interfaces/declaracoes/caminho-se-senao-interface.d.ts +7 -0
  52. package/interfaces/declaracoes/caminho-se-senao-interface.d.ts.map +1 -0
  53. package/interfaces/declaracoes/caminho-se-senao-interface.js +3 -0
  54. package/interfaces/declaracoes/caminho-se-senao-interface.js.map +1 -0
  55. package/interfaces/declaracoes/index.d.ts +2 -0
  56. package/interfaces/declaracoes/index.d.ts.map +1 -0
  57. package/interfaces/declaracoes/index.js +18 -0
  58. package/interfaces/declaracoes/index.js.map +1 -0
  59. package/interfaces/interpretador-interface.d.ts +1 -1
  60. package/interfaces/interpretador-interface.d.ts.map +1 -1
  61. package/interpretador/argumento-interface.d.ts +1 -1
  62. package/interpretador/argumento-interface.d.ts.map +1 -1
  63. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +60 -107
  64. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  65. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +435 -336
  66. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  67. package/interpretador/estruturas/chamavel.d.ts +1 -1
  68. package/interpretador/estruturas/chamavel.d.ts.map +1 -1
  69. package/interpretador/estruturas/chamavel.js +3 -0
  70. package/interpretador/estruturas/chamavel.js.map +1 -1
  71. package/interpretador/estruturas/delegua-funcao.d.ts +2 -2
  72. package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
  73. package/interpretador/estruturas/delegua-funcao.js +2 -2
  74. package/interpretador/estruturas/delegua-funcao.js.map +1 -1
  75. package/interpretador/estruturas/funcao-padrao.d.ts +2 -2
  76. package/interpretador/estruturas/funcao-padrao.d.ts.map +1 -1
  77. package/interpretador/estruturas/funcao-padrao.js +4 -2
  78. package/interpretador/estruturas/funcao-padrao.js.map +1 -1
  79. package/interpretador/estruturas/metodo-polimorfico.d.ts +1 -1
  80. package/interpretador/estruturas/metodo-polimorfico.d.ts.map +1 -1
  81. package/interpretador/estruturas/metodo-polimorfico.js +2 -2
  82. package/interpretador/estruturas/metodo-polimorfico.js.map +1 -1
  83. package/interpretador/interpretador-base.d.ts +18 -11
  84. package/interpretador/interpretador-base.d.ts.map +1 -1
  85. package/interpretador/interpretador-base.js +116 -232
  86. package/interpretador/interpretador-base.js.map +1 -1
  87. package/interpretador/interpretador.d.ts +2 -6
  88. package/interpretador/interpretador.d.ts.map +1 -1
  89. package/interpretador/interpretador.js +126 -11
  90. package/interpretador/interpretador.js.map +1 -1
  91. package/lexador/dialetos/lexador-portugol-ipt.d.ts.map +1 -1
  92. package/lexador/dialetos/lexador-portugol-ipt.js +71 -19
  93. package/lexador/dialetos/lexador-portugol-ipt.js.map +1 -1
  94. package/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts +34 -6
  95. package/lexador/dialetos/palavras-reservadas/portugol-ipt.d.ts.map +1 -1
  96. package/lexador/dialetos/palavras-reservadas/portugol-ipt.js +44 -6
  97. package/lexador/dialetos/palavras-reservadas/portugol-ipt.js.map +1 -1
  98. package/lexador/lexador.d.ts.map +1 -1
  99. package/lexador/lexador.js +20 -1
  100. package/lexador/lexador.js.map +1 -1
  101. package/lexador/palavras-reservadas.d.ts +2 -86
  102. package/lexador/palavras-reservadas.d.ts.map +1 -1
  103. package/lexador/palavras-reservadas.js.map +1 -1
  104. package/package.json +1 -1
  105. package/tipos-de-simbolos/delegua.d.ts +1 -0
  106. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  107. package/tipos-de-simbolos/delegua.js +1 -0
  108. package/tipos-de-simbolos/delegua.js.map +1 -1
  109. package/tipos-de-simbolos/portugol-ipt.d.ts +43 -19
  110. package/tipos-de-simbolos/portugol-ipt.d.ts.map +1 -1
  111. package/tipos-de-simbolos/portugol-ipt.js +59 -19
  112. package/tipos-de-simbolos/portugol-ipt.js.map +1 -1
  113. package/tradutores/tradutor-assemblyscript.js +1 -1
  114. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  115. package/tradutores/tradutor-javascript.js +1 -1
  116. package/tradutores/tradutor-javascript.js.map +1 -1
  117. package/tradutores/tradutor-portugol-ipt.d.ts +34 -12
  118. package/tradutores/tradutor-portugol-ipt.d.ts.map +1 -1
  119. package/tradutores/tradutor-portugol-ipt.js +309 -19
  120. package/tradutores/tradutor-portugol-ipt.js.map +1 -1
  121. package/umd/delegua.js +1748 -857
@@ -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);
@@ -127,10 +134,14 @@ class InterpretadorBase {
127
134
  return this.resolverNomeObjectoAcessado((objetoAcessado as AcessoIndiceVariavel).entidadeChamada); */
128
135
  case construtos_1.Chamada:
129
136
  return this.resolverNomeObjectoAcessado(objetoAcessado.entidadeChamada);
137
+ case construtos_1.Agrupamento:
138
+ return this.resolverNomeObjectoAcessado(objetoAcessado.expressao);
130
139
  case construtos_1.Constante:
131
140
  return objetoAcessado.simbolo.lexema;
141
+ case construtos_1.AcessoMetodo:
132
142
  case construtos_1.AcessoMetodoOuPropriedade:
133
143
  case construtos_1.AcessoIndiceVariavel:
144
+ case construtos_1.Binario:
134
145
  case construtos_1.Dicionario:
135
146
  case construtos_1.Leia:
136
147
  case construtos_1.Literal:
@@ -248,10 +259,10 @@ class InterpretadorBase {
248
259
  const elementosComoConstrutos = elementos.map((valor) => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
249
260
  return new construtos_1.TuplaN(expressao.hashArquivo, expressao.linha, elementosComoConstrutos);
250
261
  }
251
- async visitarExpressaoAtribuicaoPorIndicesMatriz(expressao) {
262
+ async visitarExpressaoAtribuicaoPorIndicesMatriz(_) {
252
263
  throw new Error('Método não implementado.');
253
264
  }
254
- async visitarExpressaoAcessoElementoMatriz(expressao) {
265
+ async visitarExpressaoAcessoElementoMatriz(_) {
255
266
  throw new Error('Método não implementado.');
256
267
  }
257
268
  textoParaRegex(texto) {
@@ -266,14 +277,14 @@ class InterpretadorBase {
266
277
  visitarExpressaoExpressaoRegular(expressao) {
267
278
  return Promise.resolve(this.textoParaRegex(expressao.valor));
268
279
  }
269
- visitarExpressaoTipoDe(expressao) {
280
+ visitarExpressaoTipoDe(_) {
270
281
  throw new Error('Método não implementado.');
271
282
  }
272
283
  async visitarExpressaoFalhar(expressao) {
273
284
  const textoFalha = expressao.explicacao.valor ?? (await this.avaliar(expressao.explicacao)).valor;
274
285
  throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
275
286
  }
276
- async visitarExpressaoFimPara(declaracao) {
287
+ async visitarExpressaoFimPara(_) {
277
288
  throw new Error('Método não implementado.');
278
289
  }
279
290
  async visitarExpressaoReferenciaFuncao(expressao) {
@@ -342,6 +353,9 @@ class InterpretadorBase {
342
353
  */
343
354
  async resolverInterpolacoes(textoOriginal, linha) {
344
355
  const variaveis = textoOriginal.match(this.regexInterpolacao);
356
+ if (!variaveis) {
357
+ return [];
358
+ }
345
359
  return await Promise.all(variaveis.map(async (s) => {
346
360
  const expressaoInterpolacao = s.replace(/[\$\{\}]*/gm, '');
347
361
  const microLexador = this.microLexador.mapear(expressaoInterpolacao);
@@ -556,6 +570,9 @@ class InterpretadorBase {
556
570
  }
557
571
  throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
558
572
  }
573
+ converterParaBigInt(valor) {
574
+ return typeof valor === 'bigint' ? valor : BigInt(Math.floor(Number(valor)));
575
+ }
559
576
  async visitarExpressaoBinaria(expressao) {
560
577
  const esquerda = await this.avaliar(expressao.esquerda);
561
578
  const direita = await this.avaliar(expressao.direita);
@@ -567,7 +584,7 @@ class InterpretadorBase {
567
584
  const nomeOperador = 'operador' + expressao.operador.lexema;
568
585
  const metodoOperador = valorEsquerdo.classe.encontrarMetodo(nomeOperador);
569
586
  if (metodoOperador) {
570
- const metodoBound = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
587
+ const metodoASerChamado = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
571
588
  const argumentoOperador = direita && Object.prototype.hasOwnProperty.call(direita, 'tipo')
572
589
  ? direita
573
590
  : {
@@ -575,7 +592,7 @@ class InterpretadorBase {
575
592
  valor: valorDireito,
576
593
  imutavel: false,
577
594
  };
578
- return await metodoBound.chamar(this, [{ nome: null, valor: argumentoOperador }]);
595
+ return await metodoASerChamado.chamar(this, [{ nome: null, valor: argumentoOperador }]);
579
596
  }
580
597
  }
581
598
  const tipoEsquerdo = esquerda?.hasOwnProperty('tipo')
@@ -589,13 +606,7 @@ class InterpretadorBase {
589
606
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
590
607
  // Auto-promove para BigInt se qualquer operando for BigInt
591
608
  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;
609
+ return this.converterParaBigInt(valorEsquerdo) ** this.converterParaBigInt(valorDireito);
599
610
  }
600
611
  const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
601
612
  return resultadoExponenciacao;
@@ -622,13 +633,7 @@ class InterpretadorBase {
622
633
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
623
634
  // Auto-promove para BigInt se qualquer operando for BigInt
624
635
  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;
636
+ return this.converterParaBigInt(valorEsquerdo) - this.converterParaBigInt(valorDireito);
632
637
  }
633
638
  return Number(valorEsquerdo) - Number(valorDireito);
634
639
  case delegua_1.default.ADICAO:
@@ -637,15 +642,25 @@ class InterpretadorBase {
637
642
  if (Array.isArray(valorEsquerdo) && Array.isArray(valorDireito)) {
638
643
  return valorEsquerdo.concat(valorDireito);
639
644
  }
645
+ // Se ambos os operandos são dicionários, mescla-os.
646
+ // Em caso de chaves duplicadas, valores à direita sobrescrevem os da esquerda.
647
+ if (valorEsquerdo &&
648
+ valorDireito &&
649
+ !Array.isArray(valorEsquerdo) &&
650
+ !Array.isArray(valorDireito) &&
651
+ valorEsquerdo.constructor === Object &&
652
+ valorDireito.constructor === Object) {
653
+ return Object.assign({}, valorEsquerdo, valorDireito);
654
+ }
640
655
  // Auto-promove para BigInt se qualquer operando for BigInt
641
656
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
642
- const esq = typeof valorEsquerdo === 'bigint'
657
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
643
658
  ? valorEsquerdo
644
659
  : BigInt(Math.floor(Number(valorEsquerdo)));
645
- const dir = typeof valorDireito === 'bigint'
660
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
646
661
  ? valorDireito
647
662
  : BigInt(Math.floor(Number(valorDireito)));
648
- return esq + dir;
663
+ return valorResolvidoEsquerdo + valorResolvidoDireito;
649
664
  }
650
665
  if (this.tiposNumericos.includes(tipoEsquerdo) &&
651
666
  this.tiposNumericos.includes(tipoDireito)) {
@@ -675,13 +690,13 @@ class InterpretadorBase {
675
690
  }
676
691
  // Retorna BigInt se qualquer operando for BigInt
677
692
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
678
- const esq = typeof valorEsquerdo === 'bigint'
693
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
679
694
  ? valorEsquerdo
680
695
  : BigInt(Math.floor(Number(valorEsquerdo)));
681
- const dir = typeof valorDireito === 'bigint'
696
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
682
697
  ? valorDireito
683
698
  : BigInt(Math.floor(Number(valorDireito)));
684
- return esq / dir; // Trunca automaticamente
699
+ return valorResolvidoEsquerdo / valorResolvidoDireito; // Trunca automaticamente
685
700
  }
686
701
  return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
687
702
  case delegua_1.default.MULTIPLICACAO:
@@ -690,13 +705,13 @@ class InterpretadorBase {
690
705
  if ((typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') &&
691
706
  tipoEsquerdo !== delegua_2.default.TEXTO &&
692
707
  tipoDireito !== delegua_2.default.TEXTO) {
693
- const esq = typeof valorEsquerdo === 'bigint'
708
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
694
709
  ? valorEsquerdo
695
710
  : BigInt(Math.floor(Number(valorEsquerdo)));
696
- const dir = typeof valorDireito === 'bigint'
711
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
697
712
  ? valorDireito
698
713
  : BigInt(Math.floor(Number(valorDireito)));
699
- return esq * dir;
714
+ return valorResolvidoEsquerdo * valorResolvidoDireito;
700
715
  }
701
716
  if (tipoEsquerdo === delegua_2.default.TEXTO ||
702
717
  tipoDireito === delegua_2.default.TEXTO) {
@@ -743,13 +758,7 @@ class InterpretadorBase {
743
758
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
744
759
  // Auto-promove para BigInt se qualquer operando for BigInt
745
760
  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;
761
+ return this.converterParaBigInt(valorEsquerdo) & this.converterParaBigInt(valorDireito);
753
762
  }
754
763
  return Number(valorEsquerdo) & Number(valorDireito);
755
764
  case delegua_1.default.CIRCUMFLEXO:
@@ -759,13 +768,7 @@ class InterpretadorBase {
759
768
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
760
769
  // Auto-promove para BigInt se qualquer operando for BigInt
761
770
  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;
771
+ return this.converterParaBigInt(valorEsquerdo) ^ this.converterParaBigInt(valorDireito);
769
772
  }
770
773
  return Number(valorEsquerdo) ^ Number(valorDireito);
771
774
  case delegua_1.default.BIT_OR:
@@ -775,45 +778,21 @@ class InterpretadorBase {
775
778
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
776
779
  // Auto-promove para BigInt se qualquer operando for BigInt
777
780
  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;
781
+ return this.converterParaBigInt(valorEsquerdo) | this.converterParaBigInt(valorDireito);
785
782
  }
786
783
  return Number(valorEsquerdo) | Number(valorDireito);
787
784
  case delegua_1.default.MENOR_MENOR:
788
785
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
789
786
  // 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;
787
+ if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
788
+ return this.converterParaBigInt(valorEsquerdo) << this.converterParaBigInt(valorDireito);
801
789
  }
802
790
  return Number(valorEsquerdo) << Number(valorDireito);
803
791
  case delegua_1.default.MAIOR_MAIOR:
804
792
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
805
793
  // 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;
794
+ if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
795
+ return this.converterParaBigInt(valorEsquerdo) >> this.converterParaBigInt(valorDireito);
817
796
  }
818
797
  return Number(valorEsquerdo) >> Number(valorDireito);
819
798
  case delegua_1.default.DIFERENTE:
@@ -846,7 +825,7 @@ class InterpretadorBase {
846
825
  : undefined;
847
826
  let valor = await this.avaliar(variavelArgumento);
848
827
  argumentos.push({
849
- nome: nomeArgumento,
828
+ nome: nomeArgumento ?? null,
850
829
  valor,
851
830
  });
852
831
  }
@@ -860,11 +839,11 @@ class InterpretadorBase {
860
839
  async visitarExpressaoDeChamada(expressao) {
861
840
  try {
862
841
  let variavelEntidadeChamada = await this.avaliar(expressao.entidadeChamada);
863
- if (variavelEntidadeChamada === null) {
842
+ if (variavelEntidadeChamada === null || variavelEntidadeChamada === undefined) {
864
843
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.parentese, 'Chamada de função ou método inexistente: ' +
865
844
  String(expressao.entidadeChamada), expressao.linha));
866
845
  }
867
- if (variavelEntidadeChamada.hasOwnProperty('valorRetornado')) {
846
+ if (Object.prototype.hasOwnProperty.call(variavelEntidadeChamada, 'valorRetornado')) {
868
847
  variavelEntidadeChamada = variavelEntidadeChamada.valorRetornado;
869
848
  }
870
849
  let entidadeChamada = this.resolverValor(variavelEntidadeChamada);
@@ -915,8 +894,8 @@ class InterpretadorBase {
915
894
  // mesmo que esteja tudo certo com `DeleguaFuncao`,
916
895
  // então precisamos testar o nome do construtor também.
917
896
  if (entidadeChamada instanceof estruturas_1.Chamavel ||
918
- entidadeChamada.constructor.name === 'DeleguaFuncao' ||
919
- entidadeChamada.constructor.name === 'MetodoPolimorfico') {
897
+ entidadeChamada.constructor === estruturas_1.DeleguaFuncao ||
898
+ entidadeChamada.constructor === estruturas_1.MetodoPolimorfico) {
920
899
  const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
921
900
  return retornoEntidadeChamada;
922
901
  }
@@ -962,10 +941,6 @@ class InterpretadorBase {
962
941
  indice = this.resolverValor(await this.avaliar(expressao.indice));
963
942
  }
964
943
  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
944
  case construtos_1.AcessoMetodoOuPropriedade:
970
945
  // Nunca será método aqui: apenas propriedade.
971
946
  const alvoPropriedade = expressao.alvo;
@@ -977,8 +952,12 @@ class InterpretadorBase {
977
952
  await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
978
953
  }
979
954
  break;
955
+ case construtos_1.Variavel:
956
+ const alvoVariavel = expressao.alvo;
957
+ this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
958
+ break;
980
959
  default:
981
- throw new excecoes_1.ErroEmTempoDeExecucao(null, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
960
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
982
961
  }
983
962
  return valorResolvido;
984
963
  }
@@ -1070,10 +1049,10 @@ class InterpretadorBase {
1070
1049
  const declaracaoInicializador = Array.isArray(declaracao.inicializador)
1071
1050
  ? declaracao.inicializador[0]
1072
1051
  : declaracao.inicializador;
1073
- if (declaracaoInicializador !== null) {
1052
+ if (declaracaoInicializador !== null && declaracaoInicializador !== undefined) {
1074
1053
  await this.avaliar(declaracaoInicializador);
1075
1054
  }
1076
- let retornoExecucao;
1055
+ let retornoExecucao = undefined;
1077
1056
  let iteracoes = 0;
1078
1057
  while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
1079
1058
  if (declaracao.condicao !== null &&
@@ -1087,7 +1066,7 @@ class InterpretadorBase {
1087
1066
  return null;
1088
1067
  }
1089
1068
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
1090
- retornoExecucao = null;
1069
+ retornoExecucao = undefined;
1091
1070
  }
1092
1071
  }
1093
1072
  catch (erro) {
@@ -1098,15 +1077,19 @@ class InterpretadorBase {
1098
1077
  });
1099
1078
  return Promise.reject(erro);
1100
1079
  }
1101
- if (declaracao.incrementar !== null) {
1080
+ if (declaracao.incrementar) {
1102
1081
  await this.avaliar(declaracao.incrementar);
1103
1082
  }
1104
1083
  }
1105
1084
  return retornoExecucao;
1106
1085
  }
1107
- // TODO: Descobrir se mais algum dialeto, fora Delégua e Pituguês, usam isso.
1086
+ /**
1087
+ * Lógica de `para cada`, usada por Delégua, Pituguês, e Tenda.
1088
+ * @param {ParaCada} declaracao A declaração de `para cada` a ser executada.
1089
+ * @returns {Promise<any>} O resultado da execução da declaração.
1090
+ */
1108
1091
  async visitarDeclaracaoParaCada(declaracao) {
1109
- let retornoExecucao;
1092
+ let retornoExecucao = undefined;
1110
1093
  // Posição atual precisa ser reiniciada, pois pode estar dentro de outro
1111
1094
  // laço de repetição.
1112
1095
  declaracao.posicaoAtual = 0;
@@ -1144,7 +1127,7 @@ class InterpretadorBase {
1144
1127
  return null;
1145
1128
  }
1146
1129
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
1147
- retornoExecucao = null;
1130
+ retornoExecucao = undefined;
1148
1131
  }
1149
1132
  declaracao.posicaoAtual++;
1150
1133
  }
@@ -1170,19 +1153,20 @@ class InterpretadorBase {
1170
1153
  if (this.eVerdadeiro(avaliacaoCondicaoSe)) {
1171
1154
  return await this.executar(declaracao.caminhoEntao);
1172
1155
  }
1173
- for (let i = 0; i < declaracao.caminhosSeSenao.length; i++) {
1174
- const atual = declaracao.caminhosSeSenao[i];
1156
+ const declaracaoCaminhosSeSenao = declaracao.caminhosSeSenao || [];
1157
+ for (let i = 0; i < declaracaoCaminhosSeSenao.length; i++) {
1158
+ const atual = declaracaoCaminhosSeSenao[i];
1175
1159
  if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
1176
1160
  return await this.executar(atual.caminho);
1177
1161
  }
1178
1162
  }
1179
- if (declaracao.caminhoSenao !== null) {
1163
+ if (declaracao.caminhoSenao) {
1180
1164
  return await this.executar(declaracao.caminhoSenao);
1181
1165
  }
1182
1166
  return null;
1183
1167
  }
1184
1168
  async visitarDeclaracaoEnquanto(declaracao) {
1185
- let retornoExecucao;
1169
+ let retornoExecucao = undefined;
1186
1170
  let iteracoes = 0;
1187
1171
  while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
1188
1172
  this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
@@ -1193,7 +1177,7 @@ class InterpretadorBase {
1193
1177
  return null;
1194
1178
  }
1195
1179
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
1196
- retornoExecucao = null;
1180
+ retornoExecucao = undefined;
1197
1181
  }
1198
1182
  }
1199
1183
  catch (erro) {
@@ -1248,17 +1232,17 @@ class InterpretadorBase {
1248
1232
  }
1249
1233
  }
1250
1234
  async visitarDeclaracaoFazer(declaracao) {
1251
- let retornoExecucao;
1235
+ let retornoExecucao = undefined;
1252
1236
  let iteracoes = 0;
1253
1237
  do {
1254
1238
  try {
1255
1239
  await this.cederControle(++iteracoes);
1256
1240
  retornoExecucao = await this.executar(declaracao.caminhoFazer);
1257
1241
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
1258
- return null;
1242
+ return undefined;
1259
1243
  }
1260
1244
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
1261
- retornoExecucao = null;
1245
+ retornoExecucao = undefined;
1262
1246
  }
1263
1247
  }
1264
1248
  catch (erro) {
@@ -1300,7 +1284,7 @@ class InterpretadorBase {
1300
1284
  }
1301
1285
  }
1302
1286
  finally {
1303
- if (declaracao.caminhoFinalmente !== null)
1287
+ if (declaracao.caminhoFinalmente)
1304
1288
  valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente);
1305
1289
  this.emDeclaracaoTente = false;
1306
1290
  }
@@ -1332,7 +1316,7 @@ class InterpretadorBase {
1332
1316
  async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
1333
1317
  try {
1334
1318
  const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
1335
- this.funcaoDeRetornoMesmaLinha(formatoTexto);
1319
+ this.funcaoDeRetornoMesmaLinha?.(formatoTexto);
1336
1320
  return {
1337
1321
  tipo: 'vazio',
1338
1322
  tipoExplicito: false,
@@ -1355,7 +1339,7 @@ class InterpretadorBase {
1355
1339
  async visitarDeclaracaoEscreva(declaracao) {
1356
1340
  try {
1357
1341
  const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
1358
- this.funcaoDeRetorno(formatoTexto);
1342
+ this.funcaoDeRetorno?.(formatoTexto);
1359
1343
  return {
1360
1344
  tipo: 'vazio',
1361
1345
  tipoExplicito: false,
@@ -1399,7 +1383,7 @@ class InterpretadorBase {
1399
1383
  }
1400
1384
  async avaliacaoDeclaracaoVarOuConst(declaracao) {
1401
1385
  let valorOuOutraVariavel = null;
1402
- if (declaracao.inicializador !== null) {
1386
+ if (declaracao.inicializador != null) {
1403
1387
  valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
1404
1388
  }
1405
1389
  let valorFinal = null;
@@ -1428,16 +1412,16 @@ class InterpretadorBase {
1428
1412
  */
1429
1413
  async visitarDeclaracaoConstMultiplo(declaracao) {
1430
1414
  const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
1431
- const tipoIndividual = declaracao.tipo.replace('[]', '');
1415
+ const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
1432
1416
  for (let [indice, valor] of valoresFinais.entries()) {
1433
1417
  this.pilhaEscoposExecucao.definirConstante(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
1434
1418
  }
1435
1419
  return null;
1436
1420
  }
1437
- visitarExpressaoContinua(declaracao) {
1421
+ visitarExpressaoContinua(_) {
1438
1422
  return new quebras_1.ContinuarQuebra();
1439
1423
  }
1440
- visitarExpressaoSustar(declaracao) {
1424
+ visitarExpressaoSustar(_) {
1441
1425
  return new quebras_1.SustarQuebra();
1442
1426
  }
1443
1427
  async visitarExpressaoRetornar(declaracao) {
@@ -1617,133 +1601,29 @@ class InterpretadorBase {
1617
1601
  if (superClassesResolvidas.length > 0) {
1618
1602
  this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
1619
1603
  }
1604
+ const descritorTipoClasse = this.resolverMetodoDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas);
1605
+ // TODO: Até então, a única exceção a isso é Égua Clássico.
1606
+ // Por enquanto, tudo bem deixar isso aqui.
1607
+ descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
1608
+ this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
1609
+ return descritorTipoClasse;
1610
+ }
1611
+ resolverMetodoDeClasse(declaracao, superClassesResolvidas, _mesclaResolvidas) {
1620
1612
  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];
1613
+ for (const metodoAtual of declaracao.metodos) {
1632
1614
  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
1615
  const eInicializador = nomeMetodo === 'construtor';
1643
1616
  const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
1644
1617
  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
- }
1618
+ metodos[nomeMetodo] = funcao;
1686
1619
  }
1687
1620
  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
1621
  if (descritorTipoClasse.superClasses.length === 0 &&
1704
1622
  estruturas_1.OBJETO_BASE &&
1705
1623
  descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
1706
1624
  descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
1707
1625
  }
1708
- // Calcular o OReM (linearização C3) após os pais estarem definidos.
1709
1626
  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
1627
  return descritorTipoClasse;
1748
1628
  }
1749
1629
  /**
@@ -1790,7 +1670,8 @@ class InterpretadorBase {
1790
1670
  if (!this.extensoesGlobais.has(tipoNome)) {
1791
1671
  this.extensoesGlobais.set(tipoNome, new Map());
1792
1672
  }
1793
- this.extensoesGlobais.get(tipoNome).set(nomeMetodo, funcao);
1673
+ const extensaoGlobal = this.extensoesGlobais.get(tipoNome);
1674
+ extensaoGlobal?.set(nomeMetodo, funcao);
1794
1675
  }
1795
1676
  else {
1796
1677
  const hash = declaracao.hashArquivo;
@@ -1798,10 +1679,13 @@ class InterpretadorBase {
1798
1679
  this.extensoesModulo.set(hash, new Map());
1799
1680
  }
1800
1681
  const mapa = this.extensoesModulo.get(hash);
1682
+ if (!mapa) {
1683
+ throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.simboloTipo, 'Erro interno: mapa de extensões do módulo não encontrado.', declaracao.linha);
1684
+ }
1801
1685
  if (!mapa.has(tipoNome)) {
1802
- mapa.set(tipoNome, new Map());
1686
+ mapa?.set(tipoNome, new Map());
1803
1687
  }
1804
- mapa.get(tipoNome).set(nomeMetodo, funcao);
1688
+ mapa.get(tipoNome)?.set(nomeMetodo, funcao);
1805
1689
  }
1806
1690
  }
1807
1691
  }
@@ -1904,7 +1788,7 @@ class InterpretadorBase {
1904
1788
  dicionario[chaveLogico] = this.resolverValor(promises[1]);
1905
1789
  continue;
1906
1790
  }
1907
- dicionario[promises[0]] = this.resolverValor(promises[1]);
1791
+ dicionario[promises[0].toString()] = this.resolverValor(promises[1]);
1908
1792
  }
1909
1793
  }
1910
1794
  return dicionario;
@@ -1947,7 +1831,7 @@ class InterpretadorBase {
1947
1831
  */
1948
1832
  async visitarDeclaracaoVarMultiplo(declaracao) {
1949
1833
  const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
1950
- const tipoIndividual = declaracao.tipo.replace('[]', '');
1834
+ const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
1951
1835
  for (let [indice, valor] of valoresFinais.entries()) {
1952
1836
  this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
1953
1837
  }