@designliquido/delegua 1.10.0 → 1.11.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 (55) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico.js +18 -9
  3. package/analisador-semantico/analisador-semantico.js.map +1 -1
  4. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  5. package/avaliador-sintatico/avaliador-sintatico.js +69 -6
  6. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  7. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-egua-classico.js.map +1 -1
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +1 -1
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-prisma.js.map +1 -1
  13. package/bibliotecas/primitivas-texto.d.ts.map +1 -1
  14. package/bibliotecas/primitivas-texto.js +69 -0
  15. package/bibliotecas/primitivas-texto.js.map +1 -1
  16. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  17. package/bibliotecas/primitivas-vetor.js +18 -0
  18. package/bibliotecas/primitivas-vetor.js.map +1 -1
  19. package/bin/package.json +1 -1
  20. package/declaracoes/classe.d.ts +5 -2
  21. package/declaracoes/classe.d.ts.map +1 -1
  22. package/declaracoes/classe.js +13 -4
  23. package/declaracoes/classe.js.map +1 -1
  24. package/interpretador/comum.d.ts.map +1 -1
  25. package/interpretador/comum.js +10 -0
  26. package/interpretador/comum.js.map +1 -1
  27. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  28. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +1 -0
  29. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  30. package/interpretador/estruturas/descritor-tipo-classe.d.ts +14 -4
  31. package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
  32. package/interpretador/estruturas/descritor-tipo-classe.js +89 -29
  33. package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
  34. package/interpretador/estruturas/objeto-base.d.ts.map +1 -1
  35. package/interpretador/estruturas/objeto-base.js +8 -4
  36. package/interpretador/estruturas/objeto-base.js.map +1 -1
  37. package/interpretador/estruturas/objeto-delegua-classe.d.ts +1 -0
  38. package/interpretador/estruturas/objeto-delegua-classe.d.ts.map +1 -1
  39. package/interpretador/estruturas/objeto-delegua-classe.js +35 -21
  40. package/interpretador/estruturas/objeto-delegua-classe.js.map +1 -1
  41. package/interpretador/interpretador-base.d.ts.map +1 -1
  42. package/interpretador/interpretador-base.js +56 -14
  43. package/interpretador/interpretador-base.js.map +1 -1
  44. package/interpretador/interpretador.js +1 -1
  45. package/interpretador/interpretador.js.map +1 -1
  46. package/lexador/palavras-reservadas.d.ts +1 -0
  47. package/lexador/palavras-reservadas.d.ts.map +1 -1
  48. package/lexador/palavras-reservadas.js +1 -0
  49. package/lexador/palavras-reservadas.js.map +1 -1
  50. package/package.json +1 -1
  51. package/tipos-de-simbolos/delegua.d.ts +1 -0
  52. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  53. package/tipos-de-simbolos/delegua.js +1 -0
  54. package/tipos-de-simbolos/delegua.js.map +1 -1
  55. package/umd/delegua.js +391 -91
package/umd/delegua.js CHANGED
@@ -1282,13 +1282,22 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1282
1282
  }
1283
1283
  estaEmClasseOuSubclasse(nomeClasse) {
1284
1284
  var _a;
1285
- let atual = this.classeAtualEmAnalise;
1286
- while (atual !== null) {
1285
+ const visitados = new Set();
1286
+ const pilha = [this.classeAtualEmAnalise];
1287
+ while (pilha.length > 0) {
1288
+ const atual = pilha.pop();
1289
+ if (!atual)
1290
+ continue;
1291
+ if (visitados.has(atual.simbolo.lexema))
1292
+ continue;
1293
+ visitados.add(atual.simbolo.lexema);
1287
1294
  if (atual.simbolo.lexema === nomeClasse)
1288
1295
  return true;
1289
- if (!atual.superClasse)
1290
- break;
1291
- atual = (_a = this.classesRegistradas.get(atual.superClasse.simbolo.lexema)) !== null && _a !== void 0 ? _a : null;
1296
+ for (const sc of atual.superClasses) {
1297
+ const pai = (_a = this.classesRegistradas.get(sc.simbolo.lexema)) !== null && _a !== void 0 ? _a : null;
1298
+ if (pai)
1299
+ pilha.push(pai);
1300
+ }
1292
1301
  }
1293
1302
  return false;
1294
1303
  }
@@ -1316,13 +1325,13 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1316
1325
  }
1317
1326
  }
1318
1327
  async visitarDeclaracaoClasse(declaracao) {
1319
- if (declaracao.superClasse) {
1320
- const nomeSuperclasse = declaracao.superClasse.simbolo.lexema;
1328
+ for (const superClasseVariavel of declaracao.superClasses) {
1329
+ const nomeSuperclasse = superClasseVariavel.simbolo.lexema;
1321
1330
  if (nomeSuperclasse === declaracao.simbolo.lexema) {
1322
- this.erro(declaracao.superClasse.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
1331
+ this.erro(superClasseVariavel.simbolo, `A classe '${declaracao.simbolo.lexema}' não pode herdar de si mesma.`);
1323
1332
  }
1324
1333
  else if (!this.classesDeclararadas.has(nomeSuperclasse)) {
1325
- this.erro(declaracao.superClasse.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
1334
+ this.erro(superClasseVariavel.simbolo, `Superclasse '${nomeSuperclasse}' não foi declarada.`);
1326
1335
  }
1327
1336
  }
1328
1337
  this.classesDeclararadas.add(declaracao.simbolo.lexema);
@@ -1914,6 +1923,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1914
1923
  if (this.simbolos[this.atual].lexema in this.tiposDefinidosEmCodigo) {
1915
1924
  return this.simbolos[this.atual].lexema;
1916
1925
  }
1926
+ if (this.simbolos[this.atual].lexema in this.interfacesDeclaradas) {
1927
+ return this.simbolos[this.atual].lexema;
1928
+ }
1917
1929
  const lexemaElementar = this.simbolos[this.atual].lexema.toLowerCase();
1918
1930
  const tipoElementarResolvido = tipos.find((tipo) => tipo === lexemaElementar);
1919
1931
  if (!tipoElementarResolvido) {
@@ -3860,11 +3872,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3860
3872
  // como em `MinhaClasse.propriedadeEstatica` dentro de métodos.
3861
3873
  this.tiposDefinidosEmCodigo[simbolo.lexema] = (_a = this.tiposDefinidosEmCodigo[simbolo.lexema]) !== null && _a !== void 0 ? _a : {};
3862
3874
  const pilhaDecoradoresClasse = Array.from(this.pilhaDecoradores);
3863
- let superClasse = null;
3875
+ // Verificar `herda SuperclasseA, SuperclasseB`
3876
+ const superClasses = [];
3864
3877
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.HERDA)) {
3865
- const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
3866
- this.superclasseAtual = simboloSuperclasse.lexema;
3867
- superClasse = new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema);
3878
+ do {
3879
+ const simboloSuperclasse = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome da Superclasse.');
3880
+ if (superClasses.length === 0) {
3881
+ this.superclasseAtual = simboloSuperclasse.lexema;
3882
+ }
3883
+ superClasses.push(new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloSuperclasse.lexema));
3884
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
3868
3885
  }
3869
3886
  // Verificar `implementa InterfaceA, InterfaceB`
3870
3887
  const implementaInterfaces = [];
@@ -3873,6 +3890,14 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3873
3890
  implementaInterfaces.push(this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome de interface após "implementa".'));
3874
3891
  } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
3875
3892
  }
3893
+ // Verificar `mescla MisturávelA, MisturávelB`
3894
+ const mesclas = [];
3895
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.MESCLA)) {
3896
+ do {
3897
+ const simboloMisturavel = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado nome de classe após "mescla".');
3898
+ mesclas.push(new construtos_1.Variavel(this.hashArquivo, this.simbolos[this.atual - 1], simboloMisturavel.lexema));
3899
+ } while (this.verificarSeSimboloAtualEIgualA(delegua_2.default.VIRGULA));
3900
+ }
3876
3901
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do escopo da classe.");
3877
3902
  this.pilhaDecoradores = [];
3878
3903
  const metodos = [];
@@ -4035,7 +4060,13 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4035
4060
  const nomePropriedade = this.consumir(delegua_2.default.IDENTIFICADOR, 'Esperado identificador para nome de propriedade.');
4036
4061
  this.consumir(delegua_2.default.DOIS_PONTOS, 'Esperado dois-pontos após nome de propriedade.');
4037
4062
  const tipoPropriedade = this.avancarEDevolverAnterior();
4038
- const prop = new declaracoes_1.PropriedadeClasse(nomePropriedade, tipoPropriedade.lexema, Array.from(this.pilhaDecoradores), modificadorAcesso, ehEstatico);
4063
+ let nomeTipoPropriedade = tipoPropriedade.lexema;
4064
+ if (this.verificarTipoSimboloAtual(delegua_2.default.COLCHETE_ESQUERDO)) {
4065
+ this.avancarEDevolverAnterior(); // consume '['
4066
+ this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após '[' na definição do tipo de propriedade.");
4067
+ nomeTipoPropriedade = `${nomeTipoPropriedade}[]`;
4068
+ }
4069
+ const prop = new declaracoes_1.PropriedadeClasse(nomePropriedade, nomeTipoPropriedade, Array.from(this.pilhaDecoradores), modificadorAcesso, ehEstatico);
4039
4070
  prop.documentacao = docAtual;
4040
4071
  // Auto-propriedade: `nome: tipo { obter; definir; }`
4041
4072
  // Ou corpo personalizado: `nome: tipo { obter() { ... } definir(valor) { ... } }`
@@ -4142,7 +4173,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4142
4173
  }
4143
4174
  }
4144
4175
  }
4145
- const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstatica, implementaInterfaces);
4176
+ const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasses, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstatica, implementaInterfaces, mesclas);
4146
4177
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
4147
4178
  this.superclasseAtual = undefined;
4148
4179
  return definicaoClasse;
@@ -4412,10 +4443,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4412
4443
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
4413
4444
  // Funções nativas de Delégua
4414
4445
  this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio', 'número'));
4446
+ this.pilhaEscopos.definirInformacoesVariavel('aleatório', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatório', 'número'));
4415
4447
  this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorioEntre', 'número', true, [
4416
4448
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
4417
4449
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
4418
4450
  ]));
4451
+ this.pilhaEscopos.definirInformacoesVariavel('aleatórioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatórioEntre', 'número', true, [
4452
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
4453
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
4454
+ ]));
4419
4455
  this.pilhaEscopos.definirInformacoesVariavel('algum', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('algum', 'lógico', true, [
4420
4456
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4421
4457
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
@@ -4431,14 +4467,26 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4431
4467
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4432
4468
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4433
4469
  ]));
4470
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarÍndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÍndice', 'inteiro', true, [
4471
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4472
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4473
+ ]));
4434
4474
  this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimo', 'inteiro', true, [
4435
4475
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4436
4476
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4437
4477
  ]));
4478
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarÚltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÚltimo', 'inteiro', true, [
4479
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4480
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4481
+ ]));
4438
4482
  this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimoIndice', 'inteiro', true, [
4439
4483
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4440
4484
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4441
4485
  ]));
4486
+ this.pilhaEscopos.definirInformacoesVariavel('encontrarÚltimoÍndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarÚltimoÍndice', 'inteiro', true, [
4487
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4488
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
4489
+ ]));
4442
4490
  this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('filtrarPor', 'qualquer[]', true, [
4443
4491
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4444
4492
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
@@ -4447,6 +4495,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4447
4495
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4448
4496
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
4449
4497
  ]));
4498
+ this.pilhaEscopos.definirInformacoesVariavel('incluído', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('incluído', 'lógico', true, [
4499
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4500
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
4501
+ ]));
4450
4502
  this.pilhaEscopos.definirInformacoesVariavel('inteiro', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('inteiro', 'inteiro', true, [
4451
4503
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valor', 'qualquer'),
4452
4504
  ]));
@@ -4462,6 +4514,18 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4462
4514
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4463
4515
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoMapeamento', 'função'),
4464
4516
  ]));
4517
+ this.pilhaEscopos.definirInformacoesVariavel('maximo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'qualquer', true, [
4518
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4519
+ ]));
4520
+ this.pilhaEscopos.definirInformacoesVariavel('máximo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('máximo', 'qualquer', true, [
4521
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4522
+ ]));
4523
+ this.pilhaEscopos.definirInformacoesVariavel('minimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'qualquer', true, [
4524
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4525
+ ]));
4526
+ this.pilhaEscopos.definirInformacoesVariavel('mínimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('mínimo', 'qualquer', true, [
4527
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4528
+ ]));
4465
4529
  this.pilhaEscopos.definirInformacoesVariavel('numero', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('número', 'número', true, [
4466
4530
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
4467
4531
  ]));
@@ -4480,6 +4544,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4480
4544
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4481
4545
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
4482
4546
  ]));
4547
+ this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondição', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('primeiroEmCondição', 'qualquer', true, [
4548
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4549
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
4550
+ ]));
4483
4551
  this.pilhaEscopos.definirInformacoesVariavel('real', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('real', 'número', true, [
4484
4552
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('valorParaConverter', 'qualquer'),
4485
4553
  ]));
@@ -4501,6 +4569,10 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4501
4569
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
4502
4570
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
4503
4571
  ]));
4572
+ this.pilhaEscopos.definirInformacoesVariavel('todosEmCondição', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondição', 'lógico', true, [
4573
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
4574
+ new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
4575
+ ]));
4504
4576
  this.pilhaEscopos.definirInformacoesVariavel('tupla', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('tupla', 'tupla', true, [
4505
4577
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
4506
4578
  ]));
@@ -5276,7 +5348,7 @@ class AvaliadorSintaticoEguaClassico {
5276
5348
  }
5277
5349
  this.consumir(egua_classico_1.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
5278
5350
  this.superclasseAtual = undefined;
5279
- return new declaracoes_1.Classe(nome, superClasse, metodos);
5351
+ return new declaracoes_1.Classe(nome, superClasse ? [superClasse] : [], metodos);
5280
5352
  }
5281
5353
  resolverDeclaracaoForaDeBloco() {
5282
5354
  try {
@@ -6651,7 +6723,7 @@ class AvaliadorSintaticoPitugues {
6651
6723
  }
6652
6724
  }
6653
6725
  this.superclasseAtual = undefined;
6654
- const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos, propriedades);
6726
+ const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos, propriedades);
6655
6727
  if (possivelDocumentacao) {
6656
6728
  definicaoClasse.documentacao = possivelDocumentacao;
6657
6729
  }
@@ -7829,7 +7901,7 @@ class AvaliadorSintaticoPrisma extends avaliador_sintatico_base_1.AvaliadorSinta
7829
7901
  }
7830
7902
  this.consumir(prisma_1.default.CHAVE_DIREITA, "Esperado '}' após métodos da classe.");
7831
7903
  this.superclasseAtual = undefined;
7832
- const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse, metodos);
7904
+ const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasse ? [superClasse] : [], metodos);
7833
7905
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
7834
7906
  return definicaoClasse;
7835
7907
  }
@@ -11295,6 +11367,75 @@ exports.default = {
11295
11367
  '\n\n ### Formas de uso \n',
11296
11368
  exemploCodigo: 'texto.tudoMinusculo()',
11297
11369
  },
11370
+ apararInício: {
11371
+ tipoRetorno: 'texto',
11372
+ argumentos: [],
11373
+ implementacao: (interpretador, texto) => Promise.resolve(texto.trimStart()),
11374
+ assinaturaFormato: 'texto.apararInício()',
11375
+ documentacao: '# `texto.apararInício()` \n \n' +
11376
+ 'Remover espaços em branco no início e no fim de um texto.' +
11377
+ '\n\n ## Exemplo de Código\n' +
11378
+ '\n\n```delegua\nvar t = " meu texto com espaços no início e no fim "\n' +
11379
+ 'escreva("|" + t.apararInício() + "|") // "|meu texto com espaços no início e no fim |"\n```' +
11380
+ '\n\n ### Formas de uso \n',
11381
+ exemploCodigo: 'texto.apararInício()',
11382
+ },
11383
+ maiúsculo: {
11384
+ tipoRetorno: 'texto',
11385
+ argumentos: [],
11386
+ implementacao: (interpretador, texto) => Promise.resolve(texto.toUpperCase()),
11387
+ assinaturaFormato: 'texto.maiúsculo()',
11388
+ documentacao: '# `texto.maiúsculo()` \n \n' +
11389
+ 'Converte todos os caracteres alfabéticos para suas respectivas formas em maiúsculo.' +
11390
+ '\n\n ## Exemplo de Código\n' +
11391
+ '\n\n```delegua\nvar t = "tudo em minúsculo"\n' +
11392
+ 'escreva(t.maiúsculo()) // "TUDO EM MINÚSCULO"\n```' +
11393
+ '\n\n ### Formas de uso \n',
11394
+ exemploCodigo: 'texto.maiúsculo()',
11395
+ },
11396
+ minúsculo: {
11397
+ tipoRetorno: 'texto',
11398
+ argumentos: [],
11399
+ implementacao: (interpretador, texto) => Promise.resolve(texto.toLowerCase()),
11400
+ assinaturaFormato: 'texto.minúsculo()',
11401
+ documentacao: '# `texto.minúsculo()` \n \n' +
11402
+ 'Converte todos os caracteres alfabéticos para suas respectivas formas em minúsculo.' +
11403
+ '\n\n ## Exemplo de Código\n' +
11404
+ '\n\n```delegua\nvar t = "TUDO EM MAIÚSCULO"\n' +
11405
+ 'escreva(t.minúsculo()) // "tudo em maiúsculo"\n```' +
11406
+ '\n\n ### Formas de uso \n',
11407
+ exemploCodigo: 'texto.minúsculo()',
11408
+ },
11409
+ tudoMaiúsculo: {
11410
+ tipoRetorno: 'lógico',
11411
+ argumentos: [],
11412
+ implementacao: (interpretador, texto) => Promise.resolve(texto === texto.toUpperCase()),
11413
+ assinaturaFormato: 'texto.tudoMaiúsculo()',
11414
+ documentacao: '# `texto.tudoMaiúsculo()` \n\n' +
11415
+ 'Devolve verdadeiro se todos os caracteres alfabéticos do texto estão em maiúsculo, e falso em caso contrário.' +
11416
+ '\n\n ## Exemplo de Código\n' +
11417
+ '\n\n```delegua\nvar t1 = "TUDO EM MAIÚSCULO"\n' +
11418
+ 'var t2 = "Tudo em Maiúsculo"\n' +
11419
+ 't1.tudoMaiúsculo() // verdadeiro\n' +
11420
+ 't2.tudoMaiúsculo() // falso\n```' +
11421
+ '\n\n ### Formas de uso \n',
11422
+ exemploCodigo: 'texto.tudoMaiúsculo()',
11423
+ },
11424
+ tudoMinúsculo: {
11425
+ tipoRetorno: 'lógico',
11426
+ argumentos: [],
11427
+ implementacao: (interpretador, texto) => Promise.resolve(texto === texto.toLowerCase()),
11428
+ assinaturaFormato: 'texto.tudoMinúsculo()',
11429
+ documentacao: '# `texto.tudoMinúsculo()` \n\n' +
11430
+ 'Devolve verdadeiro se todos os caracteres alfabéticos do texto estão em minúsculo, e falso em caso contrário.' +
11431
+ '\n\n ## Exemplo de Código\n' +
11432
+ '\n\n```delegua\nvar t1 = "tudo em minúsculo"\n' +
11433
+ 'var t2 = "Tudo em Minúsculo"\n' +
11434
+ 't1.tudoMinúsculo() // verdadeiro\n' +
11435
+ 't2.tudoMinúsculo() // falso\n```' +
11436
+ '\n\n ### Formas de uso \n',
11437
+ exemploCodigo: 'texto.tudoMinúsculo()',
11438
+ },
11298
11439
  };
11299
11440
 
11300
11441
  },{"../construtos":62,"../excecoes":131,"../informacao-elemento-sintatico":138}],32:[function(require,module,exports){
@@ -11660,6 +11801,24 @@ exports.default = {
11660
11801
  '\n\n ### Formas de uso \n',
11661
11802
  exemploCodigo: 'vetor.removerUltimo()',
11662
11803
  },
11804
+ removerÚltimo: {
11805
+ tipoRetorno: 'qualquer',
11806
+ argumentos: [],
11807
+ implementacao: (interpretador, vetor) => {
11808
+ let elemento = vetor.pop();
11809
+ return Promise.resolve(elemento);
11810
+ },
11811
+ assinaturaFormato: 'vetor.removerÚltimo()',
11812
+ documentacao: '# `vetor.removerÚltimo()` \n \n' +
11813
+ 'Remove o último elemento do vetor caso o elemento exista no vetor.\n' +
11814
+ '\n\n ## Exemplo de Código\n' +
11815
+ '\n\n```delegua\nvar vetor = [1, 2, 3]\n' +
11816
+ 'var ultimoElemento = vetor.removerÚltimo()\n' +
11817
+ 'escreva(ultimoElemento) // 3\n' +
11818
+ 'escreva(vetor) // [1, 2]\n```' +
11819
+ '\n\n ### Formas de uso \n',
11820
+ exemploCodigo: 'vetor.removerÚltimo()',
11821
+ },
11663
11822
  somar: {
11664
11823
  tipoRetorno: 'qualquer',
11665
11824
  argumentos: [],
@@ -13522,10 +13681,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
13522
13681
  exports.Classe = void 0;
13523
13682
  const declaracao_1 = require("./declaracao");
13524
13683
  class Classe extends declaracao_1.Declaracao {
13525
- constructor(simbolo, superClasse, metodos, propriedades = [], decoradores = [], abstrata = false, classeEstatica = false, implementa = []) {
13684
+ /** Compat com tradutores e analisador semântico que ainda usam .superClasse */
13685
+ get superClasse() {
13686
+ var _a;
13687
+ return (_a = this.superClasses[0]) !== null && _a !== void 0 ? _a : null;
13688
+ }
13689
+ constructor(simbolo, superClasses = [], metodos, propriedades = [], decoradores = [], abstrata = false, classeEstatica = false, implementa = [], mesclas = []) {
13526
13690
  super(Number(simbolo.linha), simbolo.hashArquivo);
13527
13691
  this.simbolo = simbolo;
13528
- this.superClasse = superClasse;
13692
+ this.superClasses = superClasses;
13693
+ this.mesclas = mesclas;
13529
13694
  this.metodos = metodos;
13530
13695
  this.propriedades = propriedades;
13531
13696
  this.decoradores = decoradores;
@@ -13538,8 +13703,11 @@ class Classe extends declaracao_1.Declaracao {
13538
13703
  }
13539
13704
  paraTexto() {
13540
13705
  let resultado = `<classe nome=${this.simbolo.lexema} `;
13541
- if (this.superClasse) {
13542
- resultado += `herda=${this.superClasse} `;
13706
+ if (this.superClasses.length > 0) {
13707
+ resultado += `herda=${this.superClasses.map((s) => { var _a, _b; return (_b = (_a = s === null || s === void 0 ? void 0 : s.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : s; }).join(', ')} `;
13708
+ }
13709
+ if (this.mesclas.length > 0) {
13710
+ resultado += `mescla=${this.mesclas.map((m) => { var _a, _b; return (_b = (_a = m === null || m === void 0 ? void 0 : m.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : m; }).join(', ')} `;
13543
13711
  }
13544
13712
  resultado += '>';
13545
13713
  for (const propriedade of this.propriedades) {
@@ -16606,27 +16774,36 @@ const bibliotecaGlobal = __importStar(require("../bibliotecas/biblioteca-global"
16606
16774
  const construtos_1 = require("../construtos");
16607
16775
  function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
16608
16776
  pilhaEscoposExecucao.definirVariavel('aleatorio', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
16777
+ pilhaEscoposExecucao.definirVariavel('aleatório', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
16609
16778
  pilhaEscoposExecucao.definirVariavel('aleatorioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
16779
+ pilhaEscoposExecucao.definirVariavel('aleatórioEntre', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.aleatorioEntre));
16610
16780
  pilhaEscoposExecucao.definirVariavel('algum', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.algum));
16611
16781
  pilhaEscoposExecucao.definirVariavel('arredondar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.arredondar));
16612
16782
  pilhaEscoposExecucao.definirVariavel('clonar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.clonar));
16613
16783
  pilhaEscoposExecucao.definirVariavel('encontrar', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrar));
16614
16784
  pilhaEscoposExecucao.definirVariavel('encontrarIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
16785
+ pilhaEscoposExecucao.definirVariavel('encontrarÍndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarIndice));
16615
16786
  pilhaEscoposExecucao.definirVariavel('encontrarUltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
16787
+ pilhaEscoposExecucao.definirVariavel('encontrarÚltimo', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimo));
16616
16788
  pilhaEscoposExecucao.definirVariavel('encontrarUltimoIndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimoIndice));
16789
+ pilhaEscoposExecucao.definirVariavel('encontrarÚltimoÍndice', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.encontrarUltimoIndice));
16617
16790
  pilhaEscoposExecucao.definirVariavel('filtrarPor', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.filtrarPor));
16618
16791
  pilhaEscoposExecucao.definirVariavel('incluido', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.incluido));
16792
+ pilhaEscoposExecucao.definirVariavel('incluído', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.incluido));
16619
16793
  pilhaEscoposExecucao.definirVariavel('inteiro', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.inteiro));
16620
16794
  pilhaEscoposExecucao.definirVariavel('longo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.longo));
16621
16795
  pilhaEscoposExecucao.definirVariavel('intervalo', new funcao_padrao_1.FuncaoPadrao(3, bibliotecaGlobal.intervalo));
16622
16796
  pilhaEscoposExecucao.definirVariavel('mapear', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.mapear));
16623
16797
  pilhaEscoposExecucao.definirVariavel('maximo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.maximo));
16798
+ pilhaEscoposExecucao.definirVariavel('máximo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.maximo));
16624
16799
  pilhaEscoposExecucao.definirVariavel('minimo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.minimo));
16800
+ pilhaEscoposExecucao.definirVariavel('mínimo', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.minimo));
16625
16801
  pilhaEscoposExecucao.definirVariavel('numero', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.numero));
16626
16802
  pilhaEscoposExecucao.definirVariavel('número', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.numero));
16627
16803
  pilhaEscoposExecucao.definirVariavel('ordenar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.ordenar));
16628
16804
  pilhaEscoposExecucao.definirVariavel('paraCada', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.paraCada));
16629
16805
  pilhaEscoposExecucao.definirVariavel('primeiroEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.primeiroEmCondicao));
16806
+ pilhaEscoposExecucao.definirVariavel('primeiroEmCondição', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.primeiroEmCondicao));
16630
16807
  pilhaEscoposExecucao.definirVariavel('real', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.real));
16631
16808
  pilhaEscoposExecucao.definirVariavel('reduzir', new funcao_padrao_1.FuncaoPadrao(3, bibliotecaGlobal.reduzir));
16632
16809
  pilhaEscoposExecucao.definirVariavel('somar', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.somar));
@@ -16634,6 +16811,7 @@ function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
16634
16811
  pilhaEscoposExecucao.definirVariavel('texto', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.texto));
16635
16812
  pilhaEscoposExecucao.definirVariavel('todos', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.todos));
16636
16813
  pilhaEscoposExecucao.definirVariavel('todosEmCondicao', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
16814
+ pilhaEscoposExecucao.definirVariavel('todosEmCondição', new funcao_padrao_1.FuncaoPadrao(2, bibliotecaGlobal.todosEmCondicao));
16637
16815
  pilhaEscoposExecucao.definirVariavel('tupla', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.tupla));
16638
16816
  pilhaEscoposExecucao.definirVariavel('vetor', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.vetor));
16639
16817
  }
@@ -17362,10 +17540,28 @@ function assinaturasIguais(a, b) {
17362
17540
  * de classe é criada, a referência para a instância é implementada aqui.
17363
17541
  */
17364
17542
  class DescritorTipoClasse extends chamavel_1.Chamavel {
17365
- constructor(simboloOriginal, superClasse, metodos, propriedades) {
17543
+ /** Obtenedor de compat: primeiro pai direto (usado por tradutores e partes do interpretador). */
17544
+ get superClasse() {
17545
+ var _a;
17546
+ return (_a = this.superClasses[0]) !== null && _a !== void 0 ? _a : null;
17547
+ }
17548
+ /** Definidor de compat: atribui um único pai direto (usado pela atribuição implícita de OBJETO_BASE). */
17549
+ set superClasse(v) {
17550
+ this.superClasses = v ? [v] : [];
17551
+ }
17552
+ constructor(simboloOriginal, superClasses, metodos, propriedades) {
17366
17553
  super();
17367
17554
  this.simboloOriginal = simboloOriginal;
17368
- this.superClasse = superClasse;
17555
+ if (Array.isArray(superClasses)) {
17556
+ this.superClasses = superClasses;
17557
+ }
17558
+ else if (superClasses) {
17559
+ this.superClasses = [superClasses];
17560
+ }
17561
+ else {
17562
+ this.superClasses = [];
17563
+ }
17564
+ this.orem = [this];
17369
17565
  this.metodos = metodos || {};
17370
17566
  this.metodosEstaticos = {};
17371
17567
  this.membrosEstaticos = {};
@@ -17381,6 +17577,44 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17381
17577
  this.acessoMetodos = {};
17382
17578
  this.acessoPropriedades = {};
17383
17579
  }
17580
+ // ─── C3 OReM ──────────────────────────────────────────────────────────────
17581
+ static mesclaC3(listas) {
17582
+ const resultado = [];
17583
+ while (true) {
17584
+ const listasNaoVazias = listas.filter((l) => l.length > 0);
17585
+ if (listasNaoVazias.length === 0)
17586
+ break;
17587
+ let candidato = null;
17588
+ for (const lista of listasNaoVazias) {
17589
+ const cabeca = lista[0];
17590
+ const naCauda = listasNaoVazias.some((l) => l.slice(1).indexOf(cabeca) >= 0);
17591
+ if (!naCauda) {
17592
+ candidato = cabeca;
17593
+ break;
17594
+ }
17595
+ }
17596
+ if (candidato === null) {
17597
+ throw new excecoes_1.ErroEmTempoDeExecucao(null, 'Hierarquia de classes inconsistente: não foi possível calcular o OReM (C3).');
17598
+ }
17599
+ resultado.push(candidato);
17600
+ for (const lista of listas) {
17601
+ const idx = lista.indexOf(candidato);
17602
+ if (idx === 0)
17603
+ lista.shift();
17604
+ }
17605
+ }
17606
+ return resultado;
17607
+ }
17608
+ /** Calcula e armazena o OReM (linearização C3) para esta classe e retorna a lista resultante. */
17609
+ static computarOReM(cls) {
17610
+ if (cls.superClasses.length === 0) {
17611
+ return [cls];
17612
+ }
17613
+ const oremsDePais = cls.superClasses.map((p) => DescritorTipoClasse.computarOReM(p));
17614
+ const listas = [...oremsDePais.map((m) => [...m]), [...cls.superClasses]];
17615
+ return [cls, ...DescritorTipoClasse.mesclaC3(listas)];
17616
+ }
17617
+ // ─── Verificação abstrata ─────────────────────────────────────────────────
17384
17618
  /**
17385
17619
  * Verifica se todos os métodos abstratos da superclasse estão implementados
17386
17620
  * na subclasse fornecida. Lança erro em tempo de execução se algum faltar.
@@ -17395,13 +17629,17 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17395
17629
  }
17396
17630
  }
17397
17631
  }
17632
+ // ─── Obtenedores e definidores ────────────────────────────────────────────
17398
17633
  encontrarObtenedor(nome, estatico = false) {
17399
17634
  const mapa = estatico ? this.obtenedoresEstaticos : this.obtenedores;
17400
17635
  if (Object.prototype.hasOwnProperty.call(mapa, nome)) {
17401
17636
  return mapa[nome];
17402
17637
  }
17403
- if (this.superClasse !== null && this.superClasse !== undefined) {
17404
- return this.superClasse.encontrarObtenedor(nome, estatico);
17638
+ for (const ancestral of this.orem.slice(1)) {
17639
+ const mapaAnc = estatico ? ancestral.obtenedoresEstaticos : ancestral.obtenedores;
17640
+ if (Object.prototype.hasOwnProperty.call(mapaAnc, nome)) {
17641
+ return mapaAnc[nome];
17642
+ }
17405
17643
  }
17406
17644
  return undefined;
17407
17645
  }
@@ -17410,11 +17648,15 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17410
17648
  if (Object.prototype.hasOwnProperty.call(mapa, nome)) {
17411
17649
  return mapa[nome];
17412
17650
  }
17413
- if (this.superClasse !== null && this.superClasse !== undefined) {
17414
- return this.superClasse.encontrarDefinidor(nome, estatico);
17651
+ for (const ancestral of this.orem.slice(1)) {
17652
+ const mapaAnc = estatico ? ancestral.definidoresEstaticos : ancestral.definidores;
17653
+ if (Object.prototype.hasOwnProperty.call(mapaAnc, nome)) {
17654
+ return mapaAnc[nome];
17655
+ }
17415
17656
  }
17416
17657
  return undefined;
17417
17658
  }
17659
+ // ─── Membros estáticos ────────────────────────────────────────────────────
17418
17660
  async obterEstatico(nome, visitante) {
17419
17661
  var _a;
17420
17662
  const obtenedor = this.encontrarObtenedor(nome, true);
@@ -17443,9 +17685,10 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17443
17685
  }
17444
17686
  this.membrosEstaticos[nome] = valor;
17445
17687
  }
17688
+ // ─── Resolução de métodos via OReM ─────────────────────────────────────────
17446
17689
  /**
17447
- * Mescla sobrecargas da classe atual com as da superclasse.
17448
- * Sobrecargas da subclasse com mesma assinatura substituem as da superclasse.
17690
+ * Mescla sobrecargas da classe atual com as de ancestrais (respeitando MRO).
17691
+ * Sobrecargas da subclasse com mesma assinatura substituem as do ancestral.
17449
17692
  */
17450
17693
  mesclarComSuperclasse(metodosAtuais, metodosSuperclasse) {
17451
17694
  const resultado = [...metodosAtuais];
@@ -17458,28 +17701,20 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17458
17701
  return resultado;
17459
17702
  }
17460
17703
  obterSobrecargasDaSuperclasse(nome) {
17461
- if (!this.superClasse)
17462
- return [];
17463
- const metodoSuper = this.superClasse.metodos.hasOwnProperty(nome)
17464
- ? this.superClasse.metodos[nome]
17465
- : undefined;
17466
- let sobrecargasSuper = [];
17467
- if (metodoSuper) {
17468
- sobrecargasSuper = Array.isArray(metodoSuper) ? metodoSuper : [metodoSuper];
17469
- }
17470
- // Recursivamente mesclar com a superclasse da superclasse
17471
- const sobrecargasAncestral = this.superClasse.obterSobrecargasDaSuperclasse(nome);
17472
- if (sobrecargasAncestral.length > 0) {
17473
- const resultado = [...sobrecargasSuper];
17474
- for (const metodoAnc of sobrecargasAncestral) {
17475
- const jaSobrescrito = resultado.some((m) => assinaturasIguais(m, metodoAnc));
17476
- if (!jaSobrescrito) {
17477
- resultado.push(metodoAnc);
17704
+ let sobrecarga = [];
17705
+ // Percorre a OReM[1:] na ordem do OReM — o primeiro ancestral vence
17706
+ for (const ancestral of this.orem.slice(1)) {
17707
+ if (!ancestral.metodos.hasOwnProperty(nome))
17708
+ continue;
17709
+ const metodo = ancestral.metodos[nome];
17710
+ const novos = Array.isArray(metodo) ? metodo : [metodo];
17711
+ for (const m of novos) {
17712
+ if (!sobrecarga.some((s) => assinaturasIguais(s, m))) {
17713
+ sobrecarga.push(m);
17478
17714
  }
17479
17715
  }
17480
- sobrecargasSuper = resultado;
17481
17716
  }
17482
- return sobrecargasSuper;
17717
+ return sobrecarga;
17483
17718
  }
17484
17719
  encontrarMetodo(nome) {
17485
17720
  let metodosAtuais = [];
@@ -17510,14 +17745,17 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
17510
17745
  if (nome in this.propriedades) {
17511
17746
  return this.propriedades[nome];
17512
17747
  }
17513
- if (this.superClasse !== null && this.superClasse !== undefined) {
17514
- return this.superClasse.encontrarPropriedade(nome);
17748
+ for (const ancestral of this.orem.slice(1)) {
17749
+ if (nome in ancestral.propriedades) {
17750
+ return ancestral.propriedades[nome];
17751
+ }
17515
17752
  }
17516
17753
  if (this.dialetoRequerDeclaracaoPropriedades) {
17517
17754
  throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Propriedade "${nome}" não declarada na classe ${this.simboloOriginal.lexema}.`);
17518
17755
  }
17519
17756
  return undefined;
17520
17757
  }
17758
+ // ─── Representação textual ────────────────────────────────────────────────
17521
17759
  /**
17522
17760
  * Método utilizado por Delégua para representar esta classe quando impressa.
17523
17761
  * @returns {string} A representação da classe como texto.
@@ -17926,7 +18164,7 @@ function criarDescritorObjeto() {
17926
18164
  descritor.metodos['igual'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('igual', 1, (instancia, args) => {
17927
18165
  return instancia === args[0];
17928
18166
  });
17929
- descritor.metodos['eInstanciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('eInstanciaDe', 1, (instancia, args) => {
18167
+ const implementacaoEInstanciaDe = (instancia, args) => {
17930
18168
  if (!instancia)
17931
18169
  return false;
17932
18170
  const classeAlvo = args[0];
@@ -17939,8 +18177,10 @@ function criarDescritorObjeto() {
17939
18177
  cls = cls.superClasse;
17940
18178
  }
17941
18179
  return false;
17942
- });
17943
- descritor.metodos['metodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('metodos', 0, (instancia) => {
18180
+ };
18181
+ descritor.metodos['eInstanciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('eInstanciaDe', 1, implementacaoEInstanciaDe);
18182
+ descritor.metodos['éInstânciaDe'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('éInstânciaDe', 1, implementacaoEInstanciaDe);
18183
+ const implementacaoMetodos = (instancia) => {
17944
18184
  if (!instancia)
17945
18185
  return [];
17946
18186
  const nomes = [];
@@ -17953,7 +18193,9 @@ function criarDescritorObjeto() {
17953
18193
  cls = cls.superClasse;
17954
18194
  }
17955
18195
  return nomes;
17956
- });
18196
+ };
18197
+ descritor.metodos['metodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('metodos', 0, implementacaoMetodos);
18198
+ descritor.metodos['métodos'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('métodos', 0, implementacaoMetodos);
17957
18199
  descritor.metodos['propriedades'] = new delegua_funcao_nativa_1.DeleguaFuncaoNativa('propriedades', 0, (instancia) => {
17958
18200
  if (!instancia)
17959
18201
  return [];
@@ -17980,55 +18222,69 @@ const excecoes_1 = require("../../excecoes");
17980
18222
  * Métodos são extraídos do descritor da classe, uma `DeleguaClasse`.
17981
18223
  */
17982
18224
  class ObjetoDeleguaClasse {
18225
+ valorPadraoParaTipo(tipo) {
18226
+ switch (tipo) {
18227
+ case 'numero': return 0;
18228
+ case 'texto': return '';
18229
+ case 'logico': return false;
18230
+ default: return undefined;
18231
+ }
18232
+ }
17983
18233
  constructor(classe) {
17984
18234
  this.classe = classe;
17985
18235
  this.propriedades = {};
17986
- if (this.classe.superClasse) {
17987
- for (let propriedade of this.classe.superClasse.propriedades) {
18236
+ // Inicializar propriedades herdadas do OReM (do mais genérico ao mais específico)
18237
+ // para que ancestrais mais próximos sobrescrevam os mais distantes.
18238
+ const ancestrais = classe.orem.slice(1).reverse();
18239
+ for (const ancestral of ancestrais) {
18240
+ for (const propriedade of ancestral.propriedades) {
17988
18241
  if (propriedade.estatico)
17989
18242
  continue;
17990
18243
  if (propriedade.autoObter || propriedade.autoDefinir) {
17991
- this.propriedades['_' + propriedade.nome.lexema] = undefined;
18244
+ this.propriedades['_' + propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
17992
18245
  }
17993
18246
  else {
17994
- this.propriedades[propriedade.nome.lexema] = undefined;
18247
+ this.propriedades[propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
17995
18248
  }
17996
18249
  }
17997
18250
  }
17998
- for (let propriedade of classe.propriedades) {
18251
+ // Propriedades da própria classe (têm prioridade máxima no valor padrão)
18252
+ for (const propriedade of classe.propriedades) {
17999
18253
  if (propriedade.estatico)
18000
18254
  continue;
18001
18255
  if (propriedade.autoObter || propriedade.autoDefinir) {
18002
- this.propriedades['_' + propriedade.nome.lexema] = undefined;
18256
+ this.propriedades['_' + propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
18003
18257
  }
18004
18258
  else {
18005
- this.propriedades[propriedade.nome.lexema] = undefined;
18259
+ this.propriedades[propriedade.nome.lexema] = this.valorPadraoParaTipo(propriedade.tipo);
18006
18260
  }
18007
18261
  }
18008
18262
  }
18009
18263
  verificarAcessoLeitura(nome, simbolo, visitante) {
18010
- var _a, _b, _c, _d, _e;
18011
- const acesso = (_b = (_a = this.classe.acessoPropriedades) === null || _a === void 0 ? void 0 : _a[nome]) !== null && _b !== void 0 ? _b : (_c = this.classe.acessoMetodos) === null || _c === void 0 ? void 0 : _c[nome];
18264
+ var _a, _b, _c, _d, _e, _f, _g;
18265
+ // Percorre o OReM para encontrar a classe que declarou o membro com um modificador de acesso.
18266
+ let declaradorClasse = undefined;
18267
+ let acesso = undefined;
18268
+ for (const cls of this.classe.orem) {
18269
+ const acessoCls = (_b = (_a = cls.acessoPropriedades) === null || _a === void 0 ? void 0 : _a[nome]) !== null && _b !== void 0 ? _b : (_c = cls.acessoMetodos) === null || _c === void 0 ? void 0 : _c[nome];
18270
+ if (acessoCls) {
18271
+ acesso = acessoCls;
18272
+ declaradorClasse = cls;
18273
+ break;
18274
+ }
18275
+ }
18012
18276
  if (!acesso || acesso === 'publico')
18013
18277
  return;
18014
18278
  const classeAtual = visitante === null || visitante === void 0 ? void 0 : visitante.classeAtualEmExecucao;
18015
18279
  if (acesso === 'privado') {
18016
- if (classeAtual !== this.classe) {
18017
- throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é privado e não pode ser acessado fora da classe '${(_d = this.classe.simboloOriginal) === null || _d === void 0 ? void 0 : _d.lexema}'.`);
18280
+ if (classeAtual !== declaradorClasse) {
18281
+ throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é privado e não pode ser acessado fora da classe '${(_d = declaradorClasse.simboloOriginal) === null || _d === void 0 ? void 0 : _d.lexema}'.`);
18018
18282
  }
18019
18283
  }
18020
18284
  else if (acesso === 'protegido') {
18021
- let cls = classeAtual;
18022
- let eAcessivel = false;
18023
- while (cls) {
18024
- if (cls === this.classe) {
18025
- eAcessivel = true;
18026
- break;
18027
- }
18028
- cls = cls.superClasse;
18029
- }
18285
+ const eAcessivel = (_f = (_e = classeAtual === null || classeAtual === void 0 ? void 0 : classeAtual.orem) === null || _e === void 0 ? void 0 : _e.includes(declaradorClasse)) !== null && _f !== void 0 ? _f : false;
18030
18286
  if (!eAcessivel) {
18031
- throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é protegido e não pode ser acessado fora da hierarquia da classe '${(_e = this.classe.simboloOriginal) === null || _e === void 0 ? void 0 : _e.lexema}'.`);
18287
+ throw new excecoes_1.ErroEmTempoDeExecucao(simbolo, `Membro '${nome}' é protegido e não pode ser acessado fora da hierarquia da classe '${(_g = declaradorClasse.simboloOriginal) === null || _g === void 0 ? void 0 : _g.lexema}'.`);
18032
18288
  }
18033
18289
  }
18034
18290
  }
@@ -19735,18 +19991,30 @@ class InterpretadorBase {
19735
19991
  * @returns Sempre retorna nulo, por ser requerido pelo contrato de visita.
19736
19992
  */
19737
19993
  async visitarDeclaracaoClasse(declaracao) {
19738
- let superClasse = null;
19739
- if (declaracao.superClasse !== null && declaracao.superClasse !== undefined) {
19740
- const variavelSuperClasse = await this.avaliar(declaracao.superClasse);
19741
- superClasse = variavelSuperClasse.valor;
19994
+ // Resolver cada superclasse listada em `herda A, B, ...`
19995
+ const superClassesResolvidas = [];
19996
+ for (const superClasseVariavel of declaracao.superClasses) {
19997
+ const variavelSuperClasse = await this.avaliar(superClasseVariavel);
19998
+ const superClasse = variavelSuperClasse.valor;
19742
19999
  if (!(superClasse instanceof estruturas_1.DescritorTipoClasse)) {
19743
- throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.superClasse.nome, 'Superclasse precisa ser uma classe.', declaracao.linha);
20000
+ throw new excecoes_1.ErroEmTempoDeExecucao(superClasseVariavel.nome, 'Superclasse precisa ser uma classe.', declaracao.linha);
20001
+ }
20002
+ superClassesResolvidas.push(superClasse);
20003
+ }
20004
+ // Resolver cada misturável listado em `mescla X, Y, ...`
20005
+ const mesclaResolvidas = [];
20006
+ for (const mesclaVariavel of declaracao.mesclas) {
20007
+ const variavelMisturavel = await this.avaliar(mesclaVariavel);
20008
+ const misturável = variavelMisturavel.valor;
20009
+ if (!(misturável instanceof estruturas_1.DescritorTipoClasse)) {
20010
+ throw new excecoes_1.ErroEmTempoDeExecucao(mesclaVariavel.nome, 'Misturável precisa ser uma classe.', declaracao.linha);
19744
20011
  }
20012
+ mesclaResolvidas.push(misturável);
19745
20013
  }
19746
20014
  // TODO: Precisamos disso?
19747
20015
  this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, declaracao);
19748
- if (declaracao.superClasse !== null && declaracao.superClasse !== undefined) {
19749
- this.pilhaEscoposExecucao.definirVariavel('super', superClasse);
20016
+ if (superClassesResolvidas.length > 0) {
20017
+ this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
19750
20018
  }
19751
20019
  const metodos = {};
19752
20020
  const metodosEstaticos = {};
@@ -19817,7 +20085,7 @@ class InterpretadorBase {
19817
20085
  acessoPropriedades[prop.nome.lexema] = prop.acesso;
19818
20086
  }
19819
20087
  }
19820
- const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClasse, metodos, declaracao.propriedades);
20088
+ const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClassesResolvidas, metodos, declaracao.propriedades);
19821
20089
  descritorTipoClasse.metodosEstaticos = metodosEstaticos;
19822
20090
  descritorTipoClasse.membrosEstaticos = membrosEstaticos;
19823
20091
  descritorTipoClasse.obtenedores = obtenedores;
@@ -19832,13 +20100,43 @@ class InterpretadorBase {
19832
20100
  // Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
19833
20101
  // Isso só deve acontecer quando OBJETO_BASE já estiver inicializado e a classe
19834
20102
  // atual não for o próprio OBJETO_BASE, para evitar cadeias de herança recursivas.
19835
- if (!descritorTipoClasse.superClasse && estruturas_1.OBJETO_BASE && descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
19836
- descritorTipoClasse.superClasse = estruturas_1.OBJETO_BASE;
20103
+ if (descritorTipoClasse.superClasses.length === 0 && estruturas_1.OBJETO_BASE && descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
20104
+ descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
20105
+ }
20106
+ // Calcular o OReM (linearização C3) após os pais estarem definidos.
20107
+ descritorTipoClasse.orem = estruturas_1.DescritorTipoClasse.computarOReM(descritorTipoClasse);
20108
+ // Mesclar métodos e propriedades dos misturávels (primeiro misturável ganha se não definido na classe).
20109
+ for (const misturável of mesclaResolvidas) {
20110
+ for (const [nome, funcao] of Object.entries(misturável.metodos)) {
20111
+ if (!descritorTipoClasse.metodos.hasOwnProperty(nome)) {
20112
+ descritorTipoClasse.metodos[nome] = funcao;
20113
+ }
20114
+ }
20115
+ for (const [nome, funcao] of Object.entries(misturável.obtenedores)) {
20116
+ if (!descritorTipoClasse.obtenedores.hasOwnProperty(nome)) {
20117
+ descritorTipoClasse.obtenedores[nome] = funcao;
20118
+ }
20119
+ }
20120
+ for (const [nome, funcao] of Object.entries(misturável.definidores)) {
20121
+ if (!descritorTipoClasse.definidores.hasOwnProperty(nome)) {
20122
+ descritorTipoClasse.definidores[nome] = funcao;
20123
+ }
20124
+ }
20125
+ for (const prop of misturável.propriedades) {
20126
+ const jaDeclarada = descritorTipoClasse.propriedades.some((p) => p.nome.lexema === prop.nome.lexema);
20127
+ if (!jaDeclarada) {
20128
+ descritorTipoClasse.propriedades.push(prop);
20129
+ }
20130
+ }
19837
20131
  }
19838
20132
  // Verifica se a subclasse concreta implementa todos os métodos abstratos
19839
- // da superclasse abstrata.
19840
- if (!declaracao.abstrata && superClasse && superClasse.abstrata) {
19841
- superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
20133
+ // da(s) superclasse(s) abstrata(s).
20134
+ if (!declaracao.abstrata) {
20135
+ for (const superClasse of superClassesResolvidas) {
20136
+ if (superClasse.abstrata) {
20137
+ superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
20138
+ }
20139
+ }
19842
20140
  }
19843
20141
  // TODO: Até então, a única exceção a isso é Égua Clássico.
19844
20142
  // Por enquanto, tudo bem deixar isso aqui.
@@ -20201,7 +20499,7 @@ class InterpretadorBase {
20201
20499
  return objeto.valor.paraTexto();
20202
20500
  if (objeto instanceof construtos_1.Literal)
20203
20501
  return this.paraTexto(objeto.valor);
20204
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao)
20502
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao || objeto instanceof estruturas_1.DescritorTipoClasse)
20205
20503
  return objeto.paraTexto();
20206
20504
  if (objeto instanceof quebras_1.RetornoQuebra) {
20207
20505
  if (typeof objeto.valor === 'boolean')
@@ -20484,7 +20782,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
20484
20782
  return objeto.valor.paraTexto();
20485
20783
  if (objeto instanceof construtos_1.Literal || objeto instanceof construtos_1.Tupla)
20486
20784
  return objeto.paraTextoSaida();
20487
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao)
20785
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao || objeto instanceof estruturas_1.DescritorTipoClasse)
20488
20786
  return objeto.paraTexto();
20489
20787
  if (objeto instanceof quebras_1.RetornoQuebra) {
20490
20788
  if (typeof objeto.valor === 'boolean')
@@ -26017,6 +26315,7 @@ exports.palavrasReservadasDelegua = {
26017
26315
  função: delegua_1.default.FUNÇÃO,
26018
26316
  herda: delegua_1.default.HERDA,
26019
26317
  implementa: delegua_1.default.IMPLEMENTA,
26318
+ mescla: delegua_1.default.MESCLA,
26020
26319
  importar: delegua_1.default.IMPORTAR,
26021
26320
  importe: delegua_1.default.IMPORTAR,
26022
26321
  interface: delegua_1.default.INTERFACE,
@@ -26318,6 +26617,7 @@ exports.default = {
26318
26617
  HERDA: 'HERDA',
26319
26618
  IDENTIFICADOR: 'IDENTIFICADOR',
26320
26619
  IMPLEMENTA: 'IMPLEMENTA',
26620
+ MESCLA: 'MESCLA',
26321
26621
  INTERFACE: 'INTERFACE',
26322
26622
  IGUAL: 'IGUAL',
26323
26623
  IGUAL_IGUAL: 'IGUAL_IGUAL',