@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
package/umd/delegua.js CHANGED
@@ -2101,6 +2101,14 @@ const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-ve
2101
2101
  class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBase {
2102
2102
  constructor(performance = false) {
2103
2103
  super();
2104
+ this.pilhaDecoradores = [];
2105
+ this.simbolos = [];
2106
+ this.erros = [];
2107
+ this.tiposDefinidosEmCodigo = {};
2108
+ this.interfacesDeclaradas = {};
2109
+ this.tiposDefinidosPorBibliotecas = {};
2110
+ this.tiposDeFerramentasExternas = {};
2111
+ this.primitivasConhecidas = {};
2104
2112
  this.hashArquivo = 0;
2105
2113
  this.atual = 0;
2106
2114
  this.blocos = 0;
@@ -2351,7 +2359,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2351
2359
  return new construtos_1.ListaCompreensao(Number(this.simbolos[this.atual]), this.hashArquivo, retornoExpressao, vetor, new construtos_1.ParaCadaComoConstruto(retornoExpressao.hashArquivo, retornoExpressao.linha, variavelIteracao, vetor, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
2352
2360
  new declaracoes_1.Se(condicao, new declaracoes_1.Bloco(retornoExpressao.hashArquivo, retornoExpressao.linha, [
2353
2361
  new declaracoes_1.Retorna(simboloVariavelIteracao, retornoExpressao),
2354
- ]), [], null),
2362
+ ]), [], undefined),
2355
2363
  ])), retornoExpressao.tipo ? `${retornoExpressao.tipo}[]` : 'qualquer[]');
2356
2364
  }
2357
2365
  async primario() {
@@ -2574,7 +2582,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2574
2582
  construto = new construtos_1.AcessoMetodo(construtoTipado.hashArquivo, construtoTipado.objeto, construtoTipado.simbolo.lexema, primitivaVetorSelecionada.tipoRetorno);
2575
2583
  break;
2576
2584
  default:
2577
- if (construtoTipado.tipo in this.tiposDefinidosEmCodigo) {
2585
+ if (construtoTipado.tipo && construtoTipado.tipo in this.tiposDefinidosEmCodigo) {
2578
2586
  const tipoCorrespondente = this.tiposDefinidosEmCodigo[construtoTipado.tipo];
2579
2587
  const possivelMetodo = tipoCorrespondente.metodos.filter((m) => m.simbolo.lexema === construtoTipado.simbolo.lexema);
2580
2588
  if (possivelMetodo.length > 0) {
@@ -3214,7 +3222,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3214
3222
  if (Array.isArray(retornoDeclaracao)) {
3215
3223
  declaracoes = declaracoes.concat(retornoDeclaracao);
3216
3224
  }
3217
- else if (retornoDeclaracao !== null) {
3225
+ else if (retornoDeclaracao != null) {
3218
3226
  declaracoes.push(retornoDeclaracao);
3219
3227
  }
3220
3228
  }
@@ -3275,7 +3283,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3275
3283
  const caminhoCondicoes = [await this.expressao()];
3276
3284
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
3277
3285
  while (this.verificarTipoSimboloAtual(delegua_2.default.CASO)) {
3278
- this.consumir(delegua_2.default.CASO, null);
3286
+ this.avancarEDevolverAnterior();
3279
3287
  caminhoCondicoes.push(await this.expressao());
3280
3288
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após declaração do 'caso'.");
3281
3289
  }
@@ -3404,6 +3412,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3404
3412
  const identificadorModulo = this.avancarEDevolverAnterior();
3405
3413
  construtoCaminhoModulo = new construtos_1.Literal(identificadorModulo.hashArquivo, Number(identificadorModulo.linha), identificadorModulo.lexema);
3406
3414
  break;
3415
+ default:
3416
+ throw this.erro(this.simbolos[this.atual], "Esperado caminho do módulo como texto ou identificador em declaração de importação.");
3407
3417
  }
3408
3418
  const importar = new declaracoes_1.Importar(construtoCaminhoModulo);
3409
3419
  if (identificadorDeTudo !== null) {
@@ -3574,7 +3584,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3574
3584
  async declaracaoSe() {
3575
3585
  const condicao = await this.expressao();
3576
3586
  const caminhoEntao = (await this.resolverDeclaracao());
3577
- let caminhoSenao = null;
3587
+ let caminhoSenao = undefined;
3578
3588
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.SENAO, delegua_2.default.SENÃO)) {
3579
3589
  caminhoSenao = await this.resolverDeclaracao();
3580
3590
  }
@@ -3691,7 +3701,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3691
3701
  const inicializador = await this.expressao();
3692
3702
  const retornos = [];
3693
3703
  for (let identificador of identificadores) {
3694
- this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer')));
3704
+ this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, this.logicaComumInferenciaTiposVariaveisEConstantes(inicializador, 'qualquer') ?? 'qualquer'));
3695
3705
  const declaracaoVar = new declaracoes_1.Var(identificador, new construtos_1.AcessoMetodoOuPropriedade(this.hashArquivo, inicializador, identificador));
3696
3706
  declaracaoVar.decoradores = Array.from(this.pilhaDecoradores);
3697
3707
  retornos.push(declaracaoVar);
@@ -3742,8 +3752,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3742
3752
  if (entidadeChamadaAcessoIndiceVariavel.constructor === construtos_1.AcessoIndiceVariavel) {
3743
3753
  return this.logicaComumInferenciaTiposVariaveisEConstantes(entidadeChamadaAcessoIndiceVariavel, tipo);
3744
3754
  }
3745
- if (entidadeChamadaAcessoIndiceVariavel.tipo.endsWith('[]')) {
3746
- return entidadeChamadaAcessoIndiceVariavel.tipo.slice(0, -2);
3755
+ const tipoEntidadeChamadaAcessoIndiceVariavel = entidadeChamadaAcessoIndiceVariavel.tipo;
3756
+ if (tipoEntidadeChamadaAcessoIndiceVariavel.endsWith('[]')) {
3757
+ return tipoEntidadeChamadaAcessoIndiceVariavel.slice(0, -2);
3747
3758
  }
3748
3759
  // Normalmente, `entidadeChamadaAcessoIndiceVariavel.tipo` aqui será 'vetor'.
3749
3760
  return 'qualquer';
@@ -3846,7 +3857,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3846
3857
  // Inicialização de variáveis sem valor.
3847
3858
  for (let identificador of identificadores.values()) {
3848
3859
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
3849
- retorno.push(new declaracoes_1.Var(identificador, null, tipo, tipoExplicito, Array.from(this.pilhaDecoradores)));
3860
+ retorno.push(new declaracoes_1.Var(identificador, undefined, tipo, tipoExplicito, Array.from(this.pilhaDecoradores)));
3850
3861
  }
3851
3862
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
3852
3863
  this.pilhaDecoradores = [];
@@ -3861,7 +3872,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3861
3872
  }
3862
3873
  for (let [indice, identificador] of identificadores.entries()) {
3863
3874
  const tipoOriginal = tipo; // Preserva o tipo antes da inferência
3864
- tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
3875
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo) ?? tipo;
3865
3876
  if (tipo !== 'dicionário') {
3866
3877
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
3867
3878
  }
@@ -3929,7 +3940,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3929
3940
  let retorno = [];
3930
3941
  for (let [indice, identificador] of identificadores.entries()) {
3931
3942
  // Se tipo ainda não foi definido, infere.
3932
- tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo);
3943
+ tipo = this.logicaComumInferenciaTiposVariaveisEConstantes(inicializadores[indice], tipo) ?? tipo;
3933
3944
  if (tipo !== 'dicionário') {
3934
3945
  this.pilhaEscopos.definirInformacoesVariavel(identificador.lexema, new informacao_elemento_sintatico_1.InformacaoElementoSintatico(identificador.lexema, tipo));
3935
3946
  }
@@ -3969,8 +3980,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3969
3980
  const parametros = [];
3970
3981
  do {
3971
3982
  const parametro = {};
3972
- if (this.simbolos[this.atual].tipo === delegua_2.default.MULTIPLICACAO) {
3973
- this.consumir(delegua_2.default.MULTIPLICACAO, null);
3983
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.RETICENCIAS)) {
3974
3984
  parametro.abrangencia = 'multiplo';
3975
3985
  }
3976
3986
  else {
@@ -4167,7 +4177,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4167
4177
  continue;
4168
4178
  }
4169
4179
  // Documentário (/** ... */)
4170
- let docAtual = null;
4180
+ let docAtual = undefined;
4171
4181
  if (this.simbolos[this.atual].tipo === delegua_2.default.DOCUMENTARIO) {
4172
4182
  const simboloDoc = this.avancarEDevolverAnterior();
4173
4183
  docAtual = new construtos_1.ComentarioComoConstruto(simboloDoc);
@@ -4570,10 +4580,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4570
4580
  await this.resolverDecoradores();
4571
4581
  }
4572
4582
  // Documentário (/** ... */) antes de uma declaração de função.
4573
- let docTopLevel = null;
4583
+ let documentacaoTopo = undefined;
4574
4584
  if (this.verificarTipoSimboloAtual(delegua_2.default.DOCUMENTARIO)) {
4575
4585
  const simboloDoc = this.avancarEDevolverAnterior();
4576
- docTopLevel = new construtos_1.ComentarioComoConstruto(simboloDoc);
4586
+ documentacaoTopo = new construtos_1.ComentarioComoConstruto(simboloDoc);
4577
4587
  }
4578
4588
  // Decoradores podem aparecer após um documentário.
4579
4589
  while (this.verificarTipoSimboloAtual(delegua_2.default.ARROBA)) {
@@ -4590,13 +4600,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4590
4600
  }
4591
4601
  const declaracaoFuncao = (await this.funcao('funcao'));
4592
4602
  declaracaoFuncao.eFuncaoDeDecorador = true;
4593
- declaracaoFuncao.documentacao = docTopLevel;
4603
+ declaracaoFuncao.documentacao = documentacaoTopo;
4594
4604
  return declaracaoFuncao;
4595
4605
  }
4596
4606
  if (this.verificarTipoProximoSimbolo(delegua_2.default.IDENTIFICADOR)) {
4597
4607
  this.avancarEDevolverAnterior();
4598
4608
  const declaracaoFuncao = (await this.funcao('funcao'));
4599
- declaracaoFuncao.documentacao = docTopLevel;
4609
+ declaracaoFuncao.documentacao = documentacaoTopo;
4600
4610
  return declaracaoFuncao;
4601
4611
  }
4602
4612
  }
@@ -4614,7 +4624,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4614
4624
  catch (erro) {
4615
4625
  this.sincronizar();
4616
4626
  this.erros.push(erro);
4617
- return null;
4627
+ return undefined;
4618
4628
  }
4619
4629
  }
4620
4630
  /**
@@ -4929,7 +4939,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4929
4939
  if (Array.isArray(retornoDeclaracao)) {
4930
4940
  declaracoes = declaracoes.concat(retornoDeclaracao);
4931
4941
  }
4932
- else if (retornoDeclaracao !== null) {
4942
+ else if (retornoDeclaracao != null) {
4933
4943
  declaracoes.push(retornoDeclaracao);
4934
4944
  }
4935
4945
  }
@@ -18509,6 +18519,9 @@ exports.EspacoMemoria = EspacoMemoria;
18509
18519
  Object.defineProperty(exports, "__esModule", { value: true });
18510
18520
  exports.Chamavel = void 0;
18511
18521
  class Chamavel {
18522
+ constructor() {
18523
+ this.valorAridade = 0;
18524
+ }
18512
18525
  aridade() {
18513
18526
  return this.valorAridade;
18514
18527
  }
@@ -18646,7 +18659,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
18646
18659
  this.eInicializador = eInicializador;
18647
18660
  }
18648
18661
  aridade() {
18649
- return this.declaracao?.parametros?.length || 0;
18662
+ return this.declaracao?.parametros?.filter(p => p.abrangencia !== 'multiplo').length || 0;
18650
18663
  }
18651
18664
  /**
18652
18665
  * Método utilizado por Delégua para representar esta função quando impressa.
@@ -18713,7 +18726,7 @@ class DeleguaFuncao extends chamavel_1.Chamavel {
18713
18726
  else {
18714
18727
  let argumento = argumentos[i];
18715
18728
  if (argumento.valor === null) {
18716
- argumentos[i].valor = parametro['padrao'] ? parametro['padrao'].valor : null;
18729
+ argumentos[i].valor = parametro.valorPadrao ? parametro.valorPadrao : null;
18717
18730
  }
18718
18731
  ambiente.valores[nome] =
18719
18732
  argumento && argumento.hasOwnProperty('valor') ? argumento.valor : argumento;
@@ -19146,7 +19159,9 @@ class FuncaoPadrao extends chamavel_1.Chamavel {
19146
19159
  this.funcao = funcao;
19147
19160
  }
19148
19161
  async chamar(visitante, argumentos, simbolo) {
19149
- this.simbolo = simbolo;
19162
+ if (simbolo) {
19163
+ this.simbolo = simbolo;
19164
+ }
19150
19165
  return await this.funcao.apply(this, [visitante, ...argumentos]);
19151
19166
  }
19152
19167
  /**
@@ -19154,7 +19169,7 @@ class FuncaoPadrao extends chamavel_1.Chamavel {
19154
19169
  * @returns {string} A representação da função como texto.
19155
19170
  */
19156
19171
  paraTexto() {
19157
- return `<função-padrão nome=${this.simbolo.lexema} />`;
19172
+ return `<função-padrão nome=${this.simbolo?.lexema || '(função anônima)'} />`;
19158
19173
  }
19159
19174
  /**
19160
19175
  * Método utilizado pelo VSCode para representar esta função quando impressa.
@@ -19271,7 +19286,7 @@ class MetodoPolimorfico extends chamavel_1.Chamavel {
19271
19286
  resolverSobrecarga(argumentos) {
19272
19287
  const numArgs = argumentos.length;
19273
19288
  let melhorPontuacao = -1;
19274
- let melhorSobrecarga = null;
19289
+ let melhorSobrecarga = undefined;
19275
19290
  for (const sobrecarga of this.sobrecargas) {
19276
19291
  const parametros = sobrecarga.declaracao?.parametros || [];
19277
19292
  const aridade = sobrecarga.aridade();
@@ -19336,7 +19351,7 @@ class MetodoPolimorfico extends chamavel_1.Chamavel {
19336
19351
  const tipos = params.map((p) => p.tipoDado || 'qualquer');
19337
19352
  return `${this.nome}(${tipos.join(', ')})`;
19338
19353
  });
19339
- throw new excecoes_1.ErroEmTempoDeExecucao(null, `Nenhuma sobrecarga do método "${this.nome}" corresponde aos argumentos fornecidos (${tiposArgs.join(', ')}). ` +
19354
+ throw new excecoes_1.ErroEmTempoDeExecucao(this.instancia?.classe.simboloOriginal, `Nenhuma sobrecarga do método "${this.nome}" corresponde aos argumentos fornecidos (${tiposArgs.join(', ')}). ` +
19340
19355
  `Sobrecargas disponíveis: ${assinaturas.join('; ')}.`);
19341
19356
  }
19342
19357
  return melhorSobrecarga;
@@ -19819,7 +19834,6 @@ __exportStar(require("./interpretador"), exports);
19819
19834
  __exportStar(require("./interpretador-base"), exports);
19820
19835
 
19821
19836
  },{"./estruturas":180,"./interpretador":191,"./interpretador-base":190}],190:[function(require,module,exports){
19822
- (function (process,setImmediate){(function (){
19823
19837
  "use strict";
19824
19838
  var __importDefault = (this && this.__importDefault) || function (mod) {
19825
19839
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -19852,14 +19866,16 @@ const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-ve
19852
19866
  * recomendado para uso em execuções que ocorrem no navegador de internet.
19853
19867
  */
19854
19868
  class InterpretadorBase {
19855
- constructor(diretorioBase, performance = false, funcaoDeRetorno = null, funcaoDeRetornoMesmaLinha = null) {
19869
+ constructor(diretorioBase, performance = false, funcaoDeRetorno = undefined, funcaoDeRetornoMesmaLinha = undefined) {
19856
19870
  this.resultadoInterpretador = [];
19871
+ this.linhaDeclaracaoAtual = -1;
19872
+ this.hashArquivoDeclaracaoAtual = -1;
19857
19873
  this.classeAtualEmExecucao = null;
19858
- this.funcaoDeRetorno = null;
19859
- this.funcaoDeRetornoMesmaLinha = null;
19860
- this.interfaceDeEntrada = null; // Originalmente é `readline.Interface`
19861
- this.interfaceEntradaSaida = null;
19862
- this.funcaoVerificarIteracao = null;
19874
+ this.funcaoDeRetorno = undefined;
19875
+ this.funcaoDeRetornoMesmaLinha = undefined;
19876
+ this.interfaceDeEntrada = undefined; // Originalmente é `readline.Interface`
19877
+ this.interfaceEntradaSaida = undefined;
19878
+ this.funcaoVerificarIteracao = undefined;
19863
19879
  this.emDeclaracaoTente = false;
19864
19880
  // typeName → methodName → DeleguaFuncao
19865
19881
  this.extensoesGlobais = new Map();
@@ -19882,8 +19898,12 @@ class InterpretadorBase {
19882
19898
  this.diretorioBase = diretorioBase;
19883
19899
  this.performance = performance;
19884
19900
  this.funcaoDeRetorno = funcaoDeRetorno || console.log;
19901
+ const _process = globalThis.process;
19885
19902
  this.funcaoDeRetornoMesmaLinha =
19886
- funcaoDeRetornoMesmaLinha || process.stdout.write.bind(process.stdout);
19903
+ funcaoDeRetornoMesmaLinha ||
19904
+ (_process?.stdout?.write
19905
+ ? _process.stdout.write.bind(_process.stdout)
19906
+ : (texto) => console.log(texto));
19887
19907
  this.erros = [];
19888
19908
  this.declaracoes = [];
19889
19909
  this.resultadoInterpretador = [];
@@ -19914,8 +19934,9 @@ class InterpretadorBase {
19914
19934
  async cederControle(iteracoes) {
19915
19935
  if (iteracoes % this.iteracoesParaCederControle === 0) {
19916
19936
  await new Promise((resolve) => {
19917
- if (typeof setImmediate !== 'undefined') {
19918
- setImmediate(resolve);
19937
+ const _setImmediate = globalThis.setImmediate;
19938
+ if (_setImmediate) {
19939
+ _setImmediate(resolve);
19919
19940
  }
19920
19941
  else {
19921
19942
  setTimeout(resolve, 0);
@@ -20070,10 +20091,10 @@ class InterpretadorBase {
20070
20091
  const elementosComoConstrutos = elementos.map((valor) => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
20071
20092
  return new construtos_1.TuplaN(expressao.hashArquivo, expressao.linha, elementosComoConstrutos);
20072
20093
  }
20073
- async visitarExpressaoAtribuicaoPorIndicesMatriz(expressao) {
20094
+ async visitarExpressaoAtribuicaoPorIndicesMatriz(_) {
20074
20095
  throw new Error('Método não implementado.');
20075
20096
  }
20076
- async visitarExpressaoAcessoElementoMatriz(expressao) {
20097
+ async visitarExpressaoAcessoElementoMatriz(_) {
20077
20098
  throw new Error('Método não implementado.');
20078
20099
  }
20079
20100
  textoParaRegex(texto) {
@@ -20088,14 +20109,14 @@ class InterpretadorBase {
20088
20109
  visitarExpressaoExpressaoRegular(expressao) {
20089
20110
  return Promise.resolve(this.textoParaRegex(expressao.valor));
20090
20111
  }
20091
- visitarExpressaoTipoDe(expressao) {
20112
+ visitarExpressaoTipoDe(_) {
20092
20113
  throw new Error('Método não implementado.');
20093
20114
  }
20094
20115
  async visitarExpressaoFalhar(expressao) {
20095
20116
  const textoFalha = expressao.explicacao.valor ?? (await this.avaliar(expressao.explicacao)).valor;
20096
20117
  throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
20097
20118
  }
20098
- async visitarExpressaoFimPara(declaracao) {
20119
+ async visitarExpressaoFimPara(_) {
20099
20120
  throw new Error('Método não implementado.');
20100
20121
  }
20101
20122
  async visitarExpressaoReferenciaFuncao(expressao) {
@@ -20164,6 +20185,9 @@ class InterpretadorBase {
20164
20185
  */
20165
20186
  async resolverInterpolacoes(textoOriginal, linha) {
20166
20187
  const variaveis = textoOriginal.match(this.regexInterpolacao);
20188
+ if (!variaveis) {
20189
+ return [];
20190
+ }
20167
20191
  return await Promise.all(variaveis.map(async (s) => {
20168
20192
  const expressaoInterpolacao = s.replace(/[\$\{\}]*/gm, '');
20169
20193
  const microLexador = this.microLexador.mapear(expressaoInterpolacao);
@@ -20378,6 +20402,9 @@ class InterpretadorBase {
20378
20402
  }
20379
20403
  throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
20380
20404
  }
20405
+ converterParaBigInt(valor) {
20406
+ return typeof valor === 'bigint' ? valor : BigInt(Math.floor(Number(valor)));
20407
+ }
20381
20408
  async visitarExpressaoBinaria(expressao) {
20382
20409
  const esquerda = await this.avaliar(expressao.esquerda);
20383
20410
  const direita = await this.avaliar(expressao.direita);
@@ -20389,7 +20416,7 @@ class InterpretadorBase {
20389
20416
  const nomeOperador = 'operador' + expressao.operador.lexema;
20390
20417
  const metodoOperador = valorEsquerdo.classe.encontrarMetodo(nomeOperador);
20391
20418
  if (metodoOperador) {
20392
- const metodoBound = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
20419
+ const metodoASerChamado = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
20393
20420
  const argumentoOperador = direita && Object.prototype.hasOwnProperty.call(direita, 'tipo')
20394
20421
  ? direita
20395
20422
  : {
@@ -20397,7 +20424,7 @@ class InterpretadorBase {
20397
20424
  valor: valorDireito,
20398
20425
  imutavel: false,
20399
20426
  };
20400
- return await metodoBound.chamar(this, [{ nome: null, valor: argumentoOperador }]);
20427
+ return await metodoASerChamado.chamar(this, [{ nome: null, valor: argumentoOperador }]);
20401
20428
  }
20402
20429
  }
20403
20430
  const tipoEsquerdo = esquerda?.hasOwnProperty('tipo')
@@ -20411,13 +20438,7 @@ class InterpretadorBase {
20411
20438
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
20412
20439
  // Auto-promove para BigInt se qualquer operando for BigInt
20413
20440
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
20414
- const esq = typeof valorEsquerdo === 'bigint'
20415
- ? valorEsquerdo
20416
- : BigInt(Math.floor(Number(valorEsquerdo)));
20417
- const dir = typeof valorDireito === 'bigint'
20418
- ? valorDireito
20419
- : BigInt(Math.floor(Number(valorDireito)));
20420
- return esq ** dir;
20441
+ return this.converterParaBigInt(valorEsquerdo) ** this.converterParaBigInt(valorDireito);
20421
20442
  }
20422
20443
  const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
20423
20444
  return resultadoExponenciacao;
@@ -20444,13 +20465,7 @@ class InterpretadorBase {
20444
20465
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
20445
20466
  // Auto-promove para BigInt se qualquer operando for BigInt
20446
20467
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
20447
- const esq = typeof valorEsquerdo === 'bigint'
20448
- ? valorEsquerdo
20449
- : BigInt(Math.floor(Number(valorEsquerdo)));
20450
- const dir = typeof valorDireito === 'bigint'
20451
- ? valorDireito
20452
- : BigInt(Math.floor(Number(valorDireito)));
20453
- return esq - dir;
20468
+ return this.converterParaBigInt(valorEsquerdo) - this.converterParaBigInt(valorDireito);
20454
20469
  }
20455
20470
  return Number(valorEsquerdo) - Number(valorDireito);
20456
20471
  case delegua_1.default.ADICAO:
@@ -20461,13 +20476,13 @@ class InterpretadorBase {
20461
20476
  }
20462
20477
  // Auto-promove para BigInt se qualquer operando for BigInt
20463
20478
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
20464
- const esq = typeof valorEsquerdo === 'bigint'
20479
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
20465
20480
  ? valorEsquerdo
20466
20481
  : BigInt(Math.floor(Number(valorEsquerdo)));
20467
- const dir = typeof valorDireito === 'bigint'
20482
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
20468
20483
  ? valorDireito
20469
20484
  : BigInt(Math.floor(Number(valorDireito)));
20470
- return esq + dir;
20485
+ return valorResolvidoEsquerdo + valorResolvidoDireito;
20471
20486
  }
20472
20487
  if (this.tiposNumericos.includes(tipoEsquerdo) &&
20473
20488
  this.tiposNumericos.includes(tipoDireito)) {
@@ -20497,13 +20512,13 @@ class InterpretadorBase {
20497
20512
  }
20498
20513
  // Retorna BigInt se qualquer operando for BigInt
20499
20514
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
20500
- const esq = typeof valorEsquerdo === 'bigint'
20515
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
20501
20516
  ? valorEsquerdo
20502
20517
  : BigInt(Math.floor(Number(valorEsquerdo)));
20503
- const dir = typeof valorDireito === 'bigint'
20518
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
20504
20519
  ? valorDireito
20505
20520
  : BigInt(Math.floor(Number(valorDireito)));
20506
- return esq / dir; // Trunca automaticamente
20521
+ return valorResolvidoEsquerdo / valorResolvidoDireito; // Trunca automaticamente
20507
20522
  }
20508
20523
  return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
20509
20524
  case delegua_1.default.MULTIPLICACAO:
@@ -20512,13 +20527,13 @@ class InterpretadorBase {
20512
20527
  if ((typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') &&
20513
20528
  tipoEsquerdo !== delegua_2.default.TEXTO &&
20514
20529
  tipoDireito !== delegua_2.default.TEXTO) {
20515
- const esq = typeof valorEsquerdo === 'bigint'
20530
+ const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
20516
20531
  ? valorEsquerdo
20517
20532
  : BigInt(Math.floor(Number(valorEsquerdo)));
20518
- const dir = typeof valorDireito === 'bigint'
20533
+ const valorResolvidoDireito = typeof valorDireito === 'bigint'
20519
20534
  ? valorDireito
20520
20535
  : BigInt(Math.floor(Number(valorDireito)));
20521
- return esq * dir;
20536
+ return valorResolvidoEsquerdo * valorResolvidoDireito;
20522
20537
  }
20523
20538
  if (tipoEsquerdo === delegua_2.default.TEXTO ||
20524
20539
  tipoDireito === delegua_2.default.TEXTO) {
@@ -20565,13 +20580,7 @@ class InterpretadorBase {
20565
20580
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
20566
20581
  // Auto-promove para BigInt se qualquer operando for BigInt
20567
20582
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
20568
- const esq = typeof valorEsquerdo === 'bigint'
20569
- ? valorEsquerdo
20570
- : BigInt(Math.floor(Number(valorEsquerdo)));
20571
- const dir = typeof valorDireito === 'bigint'
20572
- ? valorDireito
20573
- : BigInt(Math.floor(Number(valorDireito)));
20574
- return esq & dir;
20583
+ return this.converterParaBigInt(valorEsquerdo) & this.converterParaBigInt(valorDireito);
20575
20584
  }
20576
20585
  return Number(valorEsquerdo) & Number(valorDireito);
20577
20586
  case delegua_1.default.CIRCUMFLEXO:
@@ -20581,13 +20590,7 @@ class InterpretadorBase {
20581
20590
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
20582
20591
  // Auto-promove para BigInt se qualquer operando for BigInt
20583
20592
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
20584
- const esq = typeof valorEsquerdo === 'bigint'
20585
- ? valorEsquerdo
20586
- : BigInt(Math.floor(Number(valorEsquerdo)));
20587
- const dir = typeof valorDireito === 'bigint'
20588
- ? valorDireito
20589
- : BigInt(Math.floor(Number(valorDireito)));
20590
- return esq ^ dir;
20593
+ return this.converterParaBigInt(valorEsquerdo) ^ this.converterParaBigInt(valorDireito);
20591
20594
  }
20592
20595
  return Number(valorEsquerdo) ^ Number(valorDireito);
20593
20596
  case delegua_1.default.BIT_OR:
@@ -20597,45 +20600,21 @@ class InterpretadorBase {
20597
20600
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
20598
20601
  // Auto-promove para BigInt se qualquer operando for BigInt
20599
20602
  if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
20600
- const esq = typeof valorEsquerdo === 'bigint'
20601
- ? valorEsquerdo
20602
- : BigInt(Math.floor(Number(valorEsquerdo)));
20603
- const dir = typeof valorDireito === 'bigint'
20604
- ? valorDireito
20605
- : BigInt(Math.floor(Number(valorDireito)));
20606
- return esq | dir;
20603
+ return this.converterParaBigInt(valorEsquerdo) | this.converterParaBigInt(valorDireito);
20607
20604
  }
20608
20605
  return Number(valorEsquerdo) | Number(valorDireito);
20609
20606
  case delegua_1.default.MENOR_MENOR:
20610
20607
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
20611
20608
  // Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
20612
- const tamanhoDeslocamentoEsquerda = Number(valorDireito);
20613
- if (typeof valorEsquerdo === 'bigint' ||
20614
- typeof valorDireito === 'bigint' ||
20615
- tamanhoDeslocamentoEsquerda >= 32) {
20616
- const esq = typeof valorEsquerdo === 'bigint'
20617
- ? valorEsquerdo
20618
- : BigInt(Math.floor(Number(valorEsquerdo)));
20619
- const dir = typeof valorDireito === 'bigint'
20620
- ? valorDireito
20621
- : BigInt(Math.floor(Number(valorDireito)));
20622
- return esq << dir;
20609
+ if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
20610
+ return this.converterParaBigInt(valorEsquerdo) << this.converterParaBigInt(valorDireito);
20623
20611
  }
20624
20612
  return Number(valorEsquerdo) << Number(valorDireito);
20625
20613
  case delegua_1.default.MAIOR_MAIOR:
20626
20614
  this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
20627
20615
  // Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
20628
- const tamanhoDeslocamentoDireita = Number(valorDireito);
20629
- if (typeof valorEsquerdo === 'bigint' ||
20630
- typeof valorDireito === 'bigint' ||
20631
- tamanhoDeslocamentoDireita >= 32) {
20632
- const esq = typeof valorEsquerdo === 'bigint'
20633
- ? valorEsquerdo
20634
- : BigInt(Math.floor(Number(valorEsquerdo)));
20635
- const dir = typeof valorDireito === 'bigint'
20636
- ? valorDireito
20637
- : BigInt(Math.floor(Number(valorDireito)));
20638
- return esq >> dir;
20616
+ if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
20617
+ return this.converterParaBigInt(valorEsquerdo) >> this.converterParaBigInt(valorDireito);
20639
20618
  }
20640
20619
  return Number(valorEsquerdo) >> Number(valorDireito);
20641
20620
  case delegua_1.default.DIFERENTE:
@@ -20668,7 +20647,7 @@ class InterpretadorBase {
20668
20647
  : undefined;
20669
20648
  let valor = await this.avaliar(variavelArgumento);
20670
20649
  argumentos.push({
20671
- nome: nomeArgumento,
20650
+ nome: nomeArgumento ?? null,
20672
20651
  valor,
20673
20652
  });
20674
20653
  }
@@ -20737,8 +20716,8 @@ class InterpretadorBase {
20737
20716
  // mesmo que esteja tudo certo com `DeleguaFuncao`,
20738
20717
  // então precisamos testar o nome do construtor também.
20739
20718
  if (entidadeChamada instanceof estruturas_1.Chamavel ||
20740
- entidadeChamada.constructor.name === 'DeleguaFuncao' ||
20741
- entidadeChamada.constructor.name === 'MetodoPolimorfico') {
20719
+ entidadeChamada.constructor === estruturas_1.DeleguaFuncao ||
20720
+ entidadeChamada.constructor === estruturas_1.MetodoPolimorfico) {
20742
20721
  const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
20743
20722
  return retornoEntidadeChamada;
20744
20723
  }
@@ -20784,10 +20763,6 @@ class InterpretadorBase {
20784
20763
  indice = this.resolverValor(await this.avaliar(expressao.indice));
20785
20764
  }
20786
20765
  switch (expressao.alvo.constructor) {
20787
- case construtos_1.Variavel:
20788
- const alvoVariavel = expressao.alvo;
20789
- this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
20790
- break;
20791
20766
  case construtos_1.AcessoMetodoOuPropriedade:
20792
20767
  // Nunca será método aqui: apenas propriedade.
20793
20768
  const alvoPropriedade = expressao.alvo;
@@ -20799,8 +20774,12 @@ class InterpretadorBase {
20799
20774
  await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
20800
20775
  }
20801
20776
  break;
20777
+ case construtos_1.Variavel:
20778
+ const alvoVariavel = expressao.alvo;
20779
+ this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
20780
+ break;
20802
20781
  default:
20803
- throw new excecoes_1.ErroEmTempoDeExecucao(null, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
20782
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
20804
20783
  }
20805
20784
  return valorResolvido;
20806
20785
  }
@@ -20892,10 +20871,10 @@ class InterpretadorBase {
20892
20871
  const declaracaoInicializador = Array.isArray(declaracao.inicializador)
20893
20872
  ? declaracao.inicializador[0]
20894
20873
  : declaracao.inicializador;
20895
- if (declaracaoInicializador !== null) {
20874
+ if (declaracaoInicializador !== null && declaracaoInicializador !== undefined) {
20896
20875
  await this.avaliar(declaracaoInicializador);
20897
20876
  }
20898
- let retornoExecucao;
20877
+ let retornoExecucao = undefined;
20899
20878
  let iteracoes = 0;
20900
20879
  while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
20901
20880
  if (declaracao.condicao !== null &&
@@ -20909,7 +20888,7 @@ class InterpretadorBase {
20909
20888
  return null;
20910
20889
  }
20911
20890
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
20912
- retornoExecucao = null;
20891
+ retornoExecucao = undefined;
20913
20892
  }
20914
20893
  }
20915
20894
  catch (erro) {
@@ -20920,15 +20899,19 @@ class InterpretadorBase {
20920
20899
  });
20921
20900
  return Promise.reject(erro);
20922
20901
  }
20923
- if (declaracao.incrementar !== null) {
20902
+ if (declaracao.incrementar) {
20924
20903
  await this.avaliar(declaracao.incrementar);
20925
20904
  }
20926
20905
  }
20927
20906
  return retornoExecucao;
20928
20907
  }
20929
- // TODO: Descobrir se mais algum dialeto, fora Delégua e Pituguês, usam isso.
20908
+ /**
20909
+ * Lógica de `para cada`, usada por Delégua, Pituguês, e Tenda.
20910
+ * @param {ParaCada} declaracao A declaração de `para cada` a ser executada.
20911
+ * @returns {Promise<any>} O resultado da execução da declaração.
20912
+ */
20930
20913
  async visitarDeclaracaoParaCada(declaracao) {
20931
- let retornoExecucao;
20914
+ let retornoExecucao = undefined;
20932
20915
  // Posição atual precisa ser reiniciada, pois pode estar dentro de outro
20933
20916
  // laço de repetição.
20934
20917
  declaracao.posicaoAtual = 0;
@@ -20966,7 +20949,7 @@ class InterpretadorBase {
20966
20949
  return null;
20967
20950
  }
20968
20951
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
20969
- retornoExecucao = null;
20952
+ retornoExecucao = undefined;
20970
20953
  }
20971
20954
  declaracao.posicaoAtual++;
20972
20955
  }
@@ -20992,19 +20975,20 @@ class InterpretadorBase {
20992
20975
  if (this.eVerdadeiro(avaliacaoCondicaoSe)) {
20993
20976
  return await this.executar(declaracao.caminhoEntao);
20994
20977
  }
20995
- for (let i = 0; i < declaracao.caminhosSeSenao.length; i++) {
20996
- const atual = declaracao.caminhosSeSenao[i];
20978
+ const declaracaoCaminhosSeSenao = declaracao.caminhosSeSenao || [];
20979
+ for (let i = 0; i < declaracaoCaminhosSeSenao.length; i++) {
20980
+ const atual = declaracaoCaminhosSeSenao[i];
20997
20981
  if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
20998
20982
  return await this.executar(atual.caminho);
20999
20983
  }
21000
20984
  }
21001
- if (declaracao.caminhoSenao !== null) {
20985
+ if (declaracao.caminhoSenao) {
21002
20986
  return await this.executar(declaracao.caminhoSenao);
21003
20987
  }
21004
20988
  return null;
21005
20989
  }
21006
20990
  async visitarDeclaracaoEnquanto(declaracao) {
21007
- let retornoExecucao;
20991
+ let retornoExecucao = undefined;
21008
20992
  let iteracoes = 0;
21009
20993
  while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
21010
20994
  this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
@@ -21015,7 +20999,7 @@ class InterpretadorBase {
21015
20999
  return null;
21016
21000
  }
21017
21001
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
21018
- retornoExecucao = null;
21002
+ retornoExecucao = undefined;
21019
21003
  }
21020
21004
  }
21021
21005
  catch (erro) {
@@ -21070,17 +21054,17 @@ class InterpretadorBase {
21070
21054
  }
21071
21055
  }
21072
21056
  async visitarDeclaracaoFazer(declaracao) {
21073
- let retornoExecucao;
21057
+ let retornoExecucao = undefined;
21074
21058
  let iteracoes = 0;
21075
21059
  do {
21076
21060
  try {
21077
21061
  await this.cederControle(++iteracoes);
21078
21062
  retornoExecucao = await this.executar(declaracao.caminhoFazer);
21079
21063
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
21080
- return null;
21064
+ return undefined;
21081
21065
  }
21082
21066
  if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
21083
- retornoExecucao = null;
21067
+ retornoExecucao = undefined;
21084
21068
  }
21085
21069
  }
21086
21070
  catch (erro) {
@@ -21122,7 +21106,7 @@ class InterpretadorBase {
21122
21106
  }
21123
21107
  }
21124
21108
  finally {
21125
- if (declaracao.caminhoFinalmente !== null)
21109
+ if (declaracao.caminhoFinalmente)
21126
21110
  valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente);
21127
21111
  this.emDeclaracaoTente = false;
21128
21112
  }
@@ -21154,7 +21138,7 @@ class InterpretadorBase {
21154
21138
  async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
21155
21139
  try {
21156
21140
  const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
21157
- this.funcaoDeRetornoMesmaLinha(formatoTexto);
21141
+ this.funcaoDeRetornoMesmaLinha?.(formatoTexto);
21158
21142
  return {
21159
21143
  tipo: 'vazio',
21160
21144
  tipoExplicito: false,
@@ -21177,7 +21161,7 @@ class InterpretadorBase {
21177
21161
  async visitarDeclaracaoEscreva(declaracao) {
21178
21162
  try {
21179
21163
  const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
21180
- this.funcaoDeRetorno(formatoTexto);
21164
+ this.funcaoDeRetorno?.(formatoTexto);
21181
21165
  return {
21182
21166
  tipo: 'vazio',
21183
21167
  tipoExplicito: false,
@@ -21221,7 +21205,7 @@ class InterpretadorBase {
21221
21205
  }
21222
21206
  async avaliacaoDeclaracaoVarOuConst(declaracao) {
21223
21207
  let valorOuOutraVariavel = null;
21224
- if (declaracao.inicializador !== null) {
21208
+ if (declaracao.inicializador != null) {
21225
21209
  valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
21226
21210
  }
21227
21211
  let valorFinal = null;
@@ -21250,16 +21234,16 @@ class InterpretadorBase {
21250
21234
  */
21251
21235
  async visitarDeclaracaoConstMultiplo(declaracao) {
21252
21236
  const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
21253
- const tipoIndividual = declaracao.tipo.replace('[]', '');
21237
+ const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
21254
21238
  for (let [indice, valor] of valoresFinais.entries()) {
21255
21239
  this.pilhaEscoposExecucao.definirConstante(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
21256
21240
  }
21257
21241
  return null;
21258
21242
  }
21259
- visitarExpressaoContinua(declaracao) {
21243
+ visitarExpressaoContinua(_) {
21260
21244
  return new quebras_1.ContinuarQuebra();
21261
21245
  }
21262
- visitarExpressaoSustar(declaracao) {
21246
+ visitarExpressaoSustar(_) {
21263
21247
  return new quebras_1.SustarQuebra();
21264
21248
  }
21265
21249
  async visitarExpressaoRetornar(declaracao) {
@@ -21439,133 +21423,29 @@ class InterpretadorBase {
21439
21423
  if (superClassesResolvidas.length > 0) {
21440
21424
  this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
21441
21425
  }
21426
+ const descritorTipoClasse = this.resolverMetodoDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas);
21427
+ // TODO: Até então, a única exceção a isso é Égua Clássico.
21428
+ // Por enquanto, tudo bem deixar isso aqui.
21429
+ descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
21430
+ this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
21431
+ return descritorTipoClasse;
21432
+ }
21433
+ resolverMetodoDeClasse(declaracao, superClassesResolvidas, _mesclaResolvidas) {
21442
21434
  const metodos = {};
21443
- const metodosEstaticos = {};
21444
- const obtenedores = {};
21445
- const definidores = {};
21446
- const obtenedoresEstaticos = {};
21447
- const definidoresEstaticos = {};
21448
- const metodosAbstratos = [];
21449
- const acessoMetodos = {};
21450
- const acessoPropriedades = {};
21451
- const definirMetodos = declaracao.metodos;
21452
- for (let i = 0; i < declaracao.metodos.length; i++) {
21453
- const metodoAtual = definirMetodos[i];
21435
+ for (const metodoAtual of declaracao.metodos) {
21454
21436
  const nomeMetodo = metodoAtual.simbolo.lexema;
21455
- // Registrar nível de acesso do método.
21456
- if (metodoAtual.acesso && metodoAtual.acesso !== 'publico') {
21457
- acessoMetodos[nomeMetodo] = metodoAtual.acesso;
21458
- }
21459
- // Métodos abstratos: registrar apenas o nome, não criar função executável.
21460
- if (metodoAtual.abstrato) {
21461
- metodosAbstratos.push(nomeMetodo);
21462
- continue;
21463
- }
21464
21437
  const eInicializador = nomeMetodo === 'construtor';
21465
21438
  const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
21466
21439
  funcao.documentacao = metodoAtual.documentacao;
21467
- // Numa classe estática, todos os métodos (exceto construtor) são estáticos.
21468
- const ehEstatico = declaracao.classeEstatica ? !eInicializador : metodoAtual.estatico;
21469
- if (metodoAtual.eObtenedor) {
21470
- if (ehEstatico) {
21471
- obtenedoresEstaticos[nomeMetodo] = funcao;
21472
- }
21473
- else {
21474
- obtenedores[nomeMetodo] = funcao;
21475
- }
21476
- continue;
21477
- }
21478
- if (metodoAtual.eDefinidor) {
21479
- if (ehEstatico) {
21480
- definidoresEstaticos[nomeMetodo] = funcao;
21481
- }
21482
- else {
21483
- definidores[nomeMetodo] = funcao;
21484
- }
21485
- continue;
21486
- }
21487
- const destino = ehEstatico && !eInicializador ? metodosEstaticos : metodos;
21488
- if (destino[nomeMetodo]) {
21489
- if (!Array.isArray(destino[nomeMetodo])) {
21490
- destino[nomeMetodo] = [destino[nomeMetodo]];
21491
- }
21492
- destino[nomeMetodo].push(funcao);
21493
- }
21494
- else {
21495
- destino[nomeMetodo] = funcao;
21496
- }
21497
- }
21498
- // Registrar propriedades estáticas no mapa de membros estáticos e níveis de acesso.
21499
- // Numa classe estática, todas as propriedades são tratadas como estáticas.
21500
- const membrosEstaticos = {};
21501
- for (const prop of declaracao.propriedades) {
21502
- if (prop.estatico || declaracao.classeEstatica) {
21503
- membrosEstaticos[prop.nome.lexema] = undefined;
21504
- }
21505
- if (prop.acesso && prop.acesso !== 'publico') {
21506
- acessoPropriedades[prop.nome.lexema] = prop.acesso;
21507
- }
21440
+ metodos[nomeMetodo] = funcao;
21508
21441
  }
21509
21442
  const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClassesResolvidas, metodos, declaracao.propriedades);
21510
- descritorTipoClasse.metodosEstaticos = metodosEstaticos;
21511
- descritorTipoClasse.membrosEstaticos = membrosEstaticos;
21512
- descritorTipoClasse.obtenedores = obtenedores;
21513
- descritorTipoClasse.definidores = definidores;
21514
- descritorTipoClasse.obtenedoresEstaticos = obtenedoresEstaticos;
21515
- descritorTipoClasse.definidoresEstaticos = definidoresEstaticos;
21516
- descritorTipoClasse.abstrata = declaracao.abstrata;
21517
- descritorTipoClasse.estrangeira = declaracao.estrangeira;
21518
- descritorTipoClasse.classeEstatica = declaracao.classeEstatica;
21519
- descritorTipoClasse.metodosAbstratos = metodosAbstratos;
21520
- descritorTipoClasse.acessoMetodos = acessoMetodos;
21521
- descritorTipoClasse.acessoPropriedades = acessoPropriedades;
21522
- // Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
21523
- // Isso só deve acontecer quando OBJETO_BASE já estiver inicializado e a classe
21524
- // atual não for o próprio OBJETO_BASE, para evitar cadeias de herança recursivas.
21525
21443
  if (descritorTipoClasse.superClasses.length === 0 &&
21526
21444
  estruturas_1.OBJETO_BASE &&
21527
21445
  descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
21528
21446
  descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
21529
21447
  }
21530
- // Calcular o OReM (linearização C3) após os pais estarem definidos.
21531
21448
  descritorTipoClasse.orem = estruturas_1.DescritorTipoClasse.computarOReM(descritorTipoClasse);
21532
- // Mesclar métodos e propriedades dos misturávels (primeiro misturável ganha se não definido na classe).
21533
- for (const misturável of mesclaResolvidas) {
21534
- for (const [nome, funcao] of Object.entries(misturável.metodos)) {
21535
- if (!descritorTipoClasse.metodos.hasOwnProperty(nome)) {
21536
- descritorTipoClasse.metodos[nome] = funcao;
21537
- }
21538
- }
21539
- for (const [nome, funcao] of Object.entries(misturável.obtenedores)) {
21540
- if (!descritorTipoClasse.obtenedores.hasOwnProperty(nome)) {
21541
- descritorTipoClasse.obtenedores[nome] = funcao;
21542
- }
21543
- }
21544
- for (const [nome, funcao] of Object.entries(misturável.definidores)) {
21545
- if (!descritorTipoClasse.definidores.hasOwnProperty(nome)) {
21546
- descritorTipoClasse.definidores[nome] = funcao;
21547
- }
21548
- }
21549
- for (const prop of misturável.propriedades) {
21550
- const jaDeclarada = descritorTipoClasse.propriedades.some((p) => p.nome.lexema === prop.nome.lexema);
21551
- if (!jaDeclarada) {
21552
- descritorTipoClasse.propriedades.push(prop);
21553
- }
21554
- }
21555
- }
21556
- // Verifica se a subclasse concreta implementa todos os métodos abstratos
21557
- // da(s) superclasse(s) abstrata(s).
21558
- if (!declaracao.abstrata && !declaracao.estrangeira) {
21559
- for (const superClasse of superClassesResolvidas) {
21560
- if (superClasse.abstrata || superClasse.estrangeira) {
21561
- superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
21562
- }
21563
- }
21564
- }
21565
- // TODO: Até então, a única exceção a isso é Égua Clássico.
21566
- // Por enquanto, tudo bem deixar isso aqui.
21567
- descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
21568
- this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
21569
21449
  return descritorTipoClasse;
21570
21450
  }
21571
21451
  /**
@@ -21612,7 +21492,8 @@ class InterpretadorBase {
21612
21492
  if (!this.extensoesGlobais.has(tipoNome)) {
21613
21493
  this.extensoesGlobais.set(tipoNome, new Map());
21614
21494
  }
21615
- this.extensoesGlobais.get(tipoNome).set(nomeMetodo, funcao);
21495
+ const extensaoGlobal = this.extensoesGlobais.get(tipoNome);
21496
+ extensaoGlobal?.set(nomeMetodo, funcao);
21616
21497
  }
21617
21498
  else {
21618
21499
  const hash = declaracao.hashArquivo;
@@ -21620,10 +21501,13 @@ class InterpretadorBase {
21620
21501
  this.extensoesModulo.set(hash, new Map());
21621
21502
  }
21622
21503
  const mapa = this.extensoesModulo.get(hash);
21504
+ if (!mapa) {
21505
+ throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.simboloTipo, 'Erro interno: mapa de extensões do módulo não encontrado.', declaracao.linha);
21506
+ }
21623
21507
  if (!mapa.has(tipoNome)) {
21624
- mapa.set(tipoNome, new Map());
21508
+ mapa?.set(tipoNome, new Map());
21625
21509
  }
21626
- mapa.get(tipoNome).set(nomeMetodo, funcao);
21510
+ mapa.get(tipoNome)?.set(nomeMetodo, funcao);
21627
21511
  }
21628
21512
  }
21629
21513
  }
@@ -21726,7 +21610,7 @@ class InterpretadorBase {
21726
21610
  dicionario[chaveLogico] = this.resolverValor(promises[1]);
21727
21611
  continue;
21728
21612
  }
21729
- dicionario[promises[0]] = this.resolverValor(promises[1]);
21613
+ dicionario[promises[0].toString()] = this.resolverValor(promises[1]);
21730
21614
  }
21731
21615
  }
21732
21616
  return dicionario;
@@ -21769,7 +21653,7 @@ class InterpretadorBase {
21769
21653
  */
21770
21654
  async visitarDeclaracaoVarMultiplo(declaracao) {
21771
21655
  const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
21772
- const tipoIndividual = declaracao.tipo.replace('[]', '');
21656
+ const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
21773
21657
  for (let [indice, valor] of valoresFinais.entries()) {
21774
21658
  this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
21775
21659
  }
@@ -22127,8 +22011,7 @@ class InterpretadorBase {
22127
22011
  }
22128
22012
  exports.InterpretadorBase = InterpretadorBase;
22129
22013
 
22130
- }).call(this)}).call(this,require('_process'),require("timers").setImmediate)
22131
- },{"../avaliador-sintatico":21,"../bibliotecas/primitivas-dicionario":29,"../bibliotecas/primitivas-vetor":32,"../construtos":62,"../excecoes":132,"../inferenciador":138,"../lexador":209,"../quebras":218,"../tipos-de-dados/delegua":219,"../tipos-de-dados/primitivos":221,"../tipos-de-simbolos/delegua":224,"./espaco-memoria":172,"./estruturas":180,"./estruturas/metodo-primitiva":182,"./pilha-escopos-execucao":193,"_process":471,"browser-process-hrtime":417,"timers":474}],191:[function(require,module,exports){
22014
+ },{"../avaliador-sintatico":21,"../bibliotecas/primitivas-dicionario":29,"../bibliotecas/primitivas-vetor":32,"../construtos":62,"../excecoes":132,"../inferenciador":138,"../lexador":209,"../quebras":218,"../tipos-de-dados/delegua":219,"../tipos-de-dados/primitivos":221,"../tipos-de-simbolos/delegua":224,"./espaco-memoria":172,"./estruturas":180,"./estruturas/metodo-primitiva":182,"./pilha-escopos-execucao":193,"browser-process-hrtime":417}],191:[function(require,module,exports){
22132
22015
  "use strict";
22133
22016
  var __importDefault = (this && this.__importDefault) || function (mod) {
22134
22017
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -22325,7 +22208,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
22325
22208
  }
22326
22209
  async avaliacaoDeclaracaoVarOuConst(declaracao) {
22327
22210
  let valorOuOutraVariavel = null;
22328
- if (declaracao.inicializador !== null) {
22211
+ if (declaracao.inicializador != null) {
22329
22212
  valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
22330
22213
  }
22331
22214
  let valorFinal = null;
@@ -22689,22 +22572,137 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
22689
22572
  linha: this.linhaDeclaracaoAtual,
22690
22573
  }, 'Somente listas, dicionários, classes e objetos podem ter seus valores indexados.', expressao.linha));
22691
22574
  }
22692
- /**
22693
- * Marca a `classeDefinidora` nos métodos próprios do descritor retornado pelo
22694
- * interpretador base. Isso é necessário para que `super()` localize corretamente
22695
- * a posição da classe em execução dentro do OReM (herança cooperativa).
22696
- */
22697
- async visitarDeclaracaoClasse(declaracao) {
22698
- const descritor = await super.visitarDeclaracaoClasse(declaracao);
22699
- for (const funcaoOuSobrecargas of Object.values(descritor.metodos)) {
22575
+ logicaPropriedadesEMetodosDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas) {
22576
+ const metodos = {};
22577
+ const metodosEstaticos = {};
22578
+ const obtenedores = {};
22579
+ const definidores = {};
22580
+ const obtenedoresEstaticos = {};
22581
+ const definidoresEstaticos = {};
22582
+ const metodosAbstratos = [];
22583
+ const acessoMetodos = {};
22584
+ const acessoPropriedades = {};
22585
+ for (const metodoAtual of declaracao.metodos) {
22586
+ const nomeMetodo = metodoAtual.simbolo.lexema;
22587
+ if (metodoAtual.acesso && metodoAtual.acesso !== 'publico') {
22588
+ acessoMetodos[nomeMetodo] = metodoAtual.acesso;
22589
+ }
22590
+ if (metodoAtual.abstrato) {
22591
+ metodosAbstratos.push(nomeMetodo);
22592
+ continue;
22593
+ }
22594
+ const eInicializador = nomeMetodo === 'construtor';
22595
+ const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
22596
+ funcao.documentacao = metodoAtual.documentacao;
22597
+ // Numa classe estática, todos os métodos (exceto construtor) são estáticos.
22598
+ const ehEstatico = declaracao.classeEstatica ? !eInicializador : metodoAtual.estatico;
22599
+ if (metodoAtual.eObtenedor) {
22600
+ if (ehEstatico) {
22601
+ obtenedoresEstaticos[nomeMetodo] = funcao;
22602
+ }
22603
+ else {
22604
+ obtenedores[nomeMetodo] = funcao;
22605
+ }
22606
+ continue;
22607
+ }
22608
+ if (metodoAtual.eDefinidor) {
22609
+ if (ehEstatico) {
22610
+ definidoresEstaticos[nomeMetodo] = funcao;
22611
+ }
22612
+ else {
22613
+ definidores[nomeMetodo] = funcao;
22614
+ }
22615
+ continue;
22616
+ }
22617
+ const destino = ehEstatico && !eInicializador ? metodosEstaticos : metodos;
22618
+ if (destino[nomeMetodo]) {
22619
+ if (!Array.isArray(destino[nomeMetodo])) {
22620
+ destino[nomeMetodo] = [destino[nomeMetodo]];
22621
+ }
22622
+ destino[nomeMetodo].push(funcao);
22623
+ }
22624
+ else {
22625
+ destino[nomeMetodo] = funcao;
22626
+ }
22627
+ }
22628
+ // Registrar propriedades estáticas no mapa de membros estáticos e níveis de acesso.
22629
+ // Numa classe estática, todas as propriedades são tratadas como estáticas.
22630
+ const membrosEstaticos = {};
22631
+ for (const prop of declaracao.propriedades) {
22632
+ if (prop.estatico || declaracao.classeEstatica) {
22633
+ membrosEstaticos[prop.nome.lexema] = undefined;
22634
+ }
22635
+ if (prop.acesso && prop.acesso !== 'publico') {
22636
+ acessoPropriedades[prop.nome.lexema] = prop.acesso;
22637
+ }
22638
+ }
22639
+ const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClassesResolvidas, metodos, declaracao.propriedades);
22640
+ descritorTipoClasse.metodosEstaticos = metodosEstaticos;
22641
+ descritorTipoClasse.membrosEstaticos = membrosEstaticos;
22642
+ descritorTipoClasse.obtenedores = obtenedores;
22643
+ descritorTipoClasse.definidores = definidores;
22644
+ descritorTipoClasse.obtenedoresEstaticos = obtenedoresEstaticos;
22645
+ descritorTipoClasse.definidoresEstaticos = definidoresEstaticos;
22646
+ descritorTipoClasse.abstrata = declaracao.abstrata;
22647
+ descritorTipoClasse.estrangeira = declaracao.estrangeira;
22648
+ descritorTipoClasse.classeEstatica = declaracao.classeEstatica;
22649
+ descritorTipoClasse.metodosAbstratos = metodosAbstratos;
22650
+ descritorTipoClasse.acessoMetodos = acessoMetodos;
22651
+ descritorTipoClasse.acessoPropriedades = acessoPropriedades;
22652
+ // Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
22653
+ if (descritorTipoClasse.superClasses.length === 0 &&
22654
+ estruturas_1.OBJETO_BASE &&
22655
+ descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
22656
+ descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
22657
+ }
22658
+ // Calcular o OReM (linearização C3) após os pais estarem definidos.
22659
+ descritorTipoClasse.orem = estruturas_1.DescritorTipoClasse.computarOReM(descritorTipoClasse);
22660
+ // Mesclar métodos e propriedades dos misturávels (primeiro misturável ganha se não definido na classe).
22661
+ for (const misturável of mesclaResolvidas) {
22662
+ for (const [nome, funcao] of Object.entries(misturável.metodos)) {
22663
+ if (!descritorTipoClasse.metodos.hasOwnProperty(nome)) {
22664
+ descritorTipoClasse.metodos[nome] = funcao;
22665
+ }
22666
+ }
22667
+ for (const [nome, funcao] of Object.entries(misturável.obtenedores)) {
22668
+ if (!descritorTipoClasse.obtenedores.hasOwnProperty(nome)) {
22669
+ descritorTipoClasse.obtenedores[nome] = funcao;
22670
+ }
22671
+ }
22672
+ for (const [nome, funcao] of Object.entries(misturável.definidores)) {
22673
+ if (!descritorTipoClasse.definidores.hasOwnProperty(nome)) {
22674
+ descritorTipoClasse.definidores[nome] = funcao;
22675
+ }
22676
+ }
22677
+ for (const prop of misturável.propriedades) {
22678
+ const jaDeclarada = descritorTipoClasse.propriedades.some((p) => p.nome.lexema === prop.nome.lexema);
22679
+ if (!jaDeclarada) {
22680
+ descritorTipoClasse.propriedades.push(prop);
22681
+ }
22682
+ }
22683
+ }
22684
+ // Verifica se a subclasse concreta implementa todos os métodos abstratos
22685
+ // da(s) superclasse(s) abstrata(s).
22686
+ if (!declaracao.abstrata && !declaracao.estrangeira) {
22687
+ for (const superClasse of superClassesResolvidas) {
22688
+ if (superClasse.abstrata || superClasse.estrangeira) {
22689
+ superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
22690
+ }
22691
+ }
22692
+ }
22693
+ // Marcar classeDefinidora em todos os métodos para que `super()` funcione.
22694
+ for (const funcaoOuSobrecargas of Object.values(descritorTipoClasse.metodos)) {
22700
22695
  const lista = Array.isArray(funcaoOuSobrecargas)
22701
22696
  ? funcaoOuSobrecargas
22702
22697
  : [funcaoOuSobrecargas];
22703
22698
  for (const funcao of lista) {
22704
- funcao.classeDefinidora = descritor;
22699
+ funcao.classeDefinidora = descritorTipoClasse;
22705
22700
  }
22706
22701
  }
22707
- return descritor;
22702
+ return descritorTipoClasse;
22703
+ }
22704
+ resolverMetodoDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas) {
22705
+ return this.logicaPropriedadesEMetodosDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas);
22708
22706
  }
22709
22707
  /**
22710
22708
  * Retorna um `SuperProxy` que aponta para a próxima classe no OReM após a classe
@@ -26785,6 +26783,7 @@ const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
26785
26783
  */
26786
26784
  class Lexador {
26787
26785
  constructor(performance = false) {
26786
+ this.codigo = [];
26788
26787
  this.performance = performance;
26789
26788
  this.simbolos = [];
26790
26789
  this.erros = [];
@@ -27166,8 +27165,26 @@ class Lexador {
27166
27165
  this.avancar();
27167
27166
  break;
27168
27167
  case '.':
27169
- this.adicionarSimbolo(delegua_1.default.PONTO, '.');
27168
+ this.inicioSimbolo = this.atual;
27170
27169
  this.avancar();
27170
+ if (this.simboloAtual() === '.') {
27171
+ this.avancar();
27172
+ if (this.simboloAtual() !== '.') {
27173
+ this.erros.push({
27174
+ linha: this.linha + 1,
27175
+ caractere: this.simboloAtual(),
27176
+ mensagem: 'Esperado ou apenas um ponto, ou três pontos em sequência.',
27177
+ });
27178
+ this.adicionarSimbolo(delegua_1.default.PONTO, '.');
27179
+ }
27180
+ else {
27181
+ this.avancar();
27182
+ this.adicionarSimbolo(delegua_1.default.RETICENCIAS, '...');
27183
+ }
27184
+ }
27185
+ else {
27186
+ this.adicionarSimbolo(delegua_1.default.PONTO, '.');
27187
+ }
27171
27188
  break;
27172
27189
  case '-':
27173
27190
  this.inicioSimbolo = this.atual;
@@ -28483,6 +28500,7 @@ exports.default = {
28483
28500
  PONTO_E_VIRGULA: 'PONTO_E_VIRGULA',
28484
28501
  QUEBRAR: 'QUEBRAR',
28485
28502
  RETORNA: 'RETORNA',
28503
+ RETICENCIAS: 'RETICENCIAS',
28486
28504
  SUBTRACAO: 'SUBTRACAO',
28487
28505
  SE: 'SE',
28488
28506
  SENAO: 'SENAO',
@@ -44352,7 +44370,7 @@ class TradutorAssemblyScript {
44352
44370
  resultado += condicao;
44353
44371
  resultado += ')';
44354
44372
  resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
44355
- if (declaracaoSe.caminhoSenao !== null) {
44373
+ if (declaracaoSe.caminhoSenao != null) {
44356
44374
  resultado += ' '.repeat(this.indentacao);
44357
44375
  resultado += 'else ';
44358
44376
  const se = declaracaoSe?.caminhoSenao;
@@ -46409,7 +46427,7 @@ class TradutorJavaScript {
46409
46427
  resultado += condicao;
46410
46428
  resultado += ')';
46411
46429
  resultado += this.dicionarioDeclaracoes[declaracaoSe.caminhoEntao.constructor.name](declaracaoSe.caminhoEntao);
46412
- if (declaracaoSe.caminhoSenao !== null) {
46430
+ if (declaracaoSe.caminhoSenao != null) {
46413
46431
  resultado += ' '.repeat(this.indentacao);
46414
46432
  resultado += 'else ';
46415
46433
  const se = declaracaoSe?.caminhoSenao;
@@ -71330,7 +71348,7 @@ class BitSetIterator {
71330
71348
  [Symbol.iterator]() { return this; }
71331
71349
  }
71332
71350
 
71333
- },{"./MurmurHash":384,"util":477}],377:[function(require,module,exports){
71351
+ },{"./MurmurHash":384,"util":476}],377:[function(require,module,exports){
71334
71352
  "use strict";
71335
71353
  /*!
71336
71354
  * Copyright 2016 The ANTLR Project. All rights reserved.
@@ -78248,7 +78266,7 @@ module.exports = function isTypedArray(value) {
78248
78266
  return !!whichTypedArray(value);
78249
78267
  };
78250
78268
 
78251
- },{"which-typed-array":478}],457:[function(require,module,exports){
78269
+ },{"which-typed-array":477}],457:[function(require,module,exports){
78252
78270
  'use strict';
78253
78271
 
78254
78272
  /** @type {import('./abs')} */
@@ -78856,87 +78874,8 @@ module.exports = function setFunctionLength(fn, length) {
78856
78874
  };
78857
78875
 
78858
78876
  },{"define-data-property":426,"es-errors/type":434,"get-intrinsic":440,"gopd":445,"has-property-descriptors":446}],474:[function(require,module,exports){
78859
- (function (setImmediate,clearImmediate){(function (){
78860
- var nextTick = require('process/browser.js').nextTick;
78861
- var apply = Function.prototype.apply;
78862
- var slice = Array.prototype.slice;
78863
- var immediateIds = {};
78864
- var nextImmediateId = 0;
78865
-
78866
- // DOM APIs, for completeness
78867
-
78868
- exports.setTimeout = function() {
78869
- return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
78870
- };
78871
- exports.setInterval = function() {
78872
- return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
78873
- };
78874
- exports.clearTimeout =
78875
- exports.clearInterval = function(timeout) { timeout.close(); };
78876
-
78877
- function Timeout(id, clearFn) {
78878
- this._id = id;
78879
- this._clearFn = clearFn;
78880
- }
78881
- Timeout.prototype.unref = Timeout.prototype.ref = function() {};
78882
- Timeout.prototype.close = function() {
78883
- this._clearFn.call(window, this._id);
78884
- };
78885
-
78886
- // Does not start the time, just sets up the members needed.
78887
- exports.enroll = function(item, msecs) {
78888
- clearTimeout(item._idleTimeoutId);
78889
- item._idleTimeout = msecs;
78890
- };
78891
-
78892
- exports.unenroll = function(item) {
78893
- clearTimeout(item._idleTimeoutId);
78894
- item._idleTimeout = -1;
78895
- };
78896
-
78897
- exports._unrefActive = exports.active = function(item) {
78898
- clearTimeout(item._idleTimeoutId);
78899
-
78900
- var msecs = item._idleTimeout;
78901
- if (msecs >= 0) {
78902
- item._idleTimeoutId = setTimeout(function onTimeout() {
78903
- if (item._onTimeout)
78904
- item._onTimeout();
78905
- }, msecs);
78906
- }
78907
- };
78908
-
78909
- // That's not how node.js implements it but the exposed api is the same.
78910
- exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) {
78911
- var id = nextImmediateId++;
78912
- var args = arguments.length < 2 ? false : slice.call(arguments, 1);
78913
-
78914
- immediateIds[id] = true;
78915
-
78916
- nextTick(function onNextTick() {
78917
- if (immediateIds[id]) {
78918
- // fn.call() is faster so we optimize for the common use-case
78919
- // @see http://jsperf.com/call-apply-segu
78920
- if (args) {
78921
- fn.apply(null, args);
78922
- } else {
78923
- fn.call(null);
78924
- }
78925
- // Prevent ids from leaking
78926
- exports.clearImmediate(id);
78927
- }
78928
- });
78929
-
78930
- return id;
78931
- };
78932
-
78933
- exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) {
78934
- delete immediateIds[id];
78935
- };
78936
- }).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate)
78937
- },{"process/browser.js":471,"timers":474}],475:[function(require,module,exports){
78938
78877
  arguments[4][414][0].apply(exports,arguments)
78939
- },{"dup":414}],476:[function(require,module,exports){
78878
+ },{"dup":414}],475:[function(require,module,exports){
78940
78879
  // Currently in sync with Node.js lib/internal/util/types.js
78941
78880
  // https://github.com/nodejs/node/commit/112cc7c27551254aa2b17098fb774867f05ed0d9
78942
78881
 
@@ -79272,7 +79211,7 @@ exports.isAnyArrayBuffer = isAnyArrayBuffer;
79272
79211
  });
79273
79212
  });
79274
79213
 
79275
- },{"is-arguments":452,"is-generator-function":454,"is-typed-array":456,"which-typed-array":478}],477:[function(require,module,exports){
79214
+ },{"is-arguments":452,"is-generator-function":454,"is-typed-array":456,"which-typed-array":477}],476:[function(require,module,exports){
79276
79215
  (function (process){(function (){
79277
79216
  // Copyright Joyent, Inc. and other Node contributors.
79278
79217
  //
@@ -79991,7 +79930,7 @@ function callbackify(original) {
79991
79930
  exports.callbackify = callbackify;
79992
79931
 
79993
79932
  }).call(this)}).call(this,require('_process'))
79994
- },{"./support/isBuffer":475,"./support/types":476,"_process":471,"inherits":451}],478:[function(require,module,exports){
79933
+ },{"./support/isBuffer":474,"./support/types":475,"_process":471,"inherits":451}],477:[function(require,module,exports){
79995
79934
  (function (global){(function (){
79996
79935
  'use strict';
79997
79936