@designliquido/delegua 1.18.1 → 1.18.3

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 (25) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico.js +21 -2
  3. package/analisador-semantico/analisador-semantico.js.map +1 -1
  4. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +1 -1
  5. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico.d.ts +2 -0
  7. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  8. package/avaliador-sintatico/avaliador-sintatico.js +93 -5
  9. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +8 -8
  11. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  12. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +1 -1
  13. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  14. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +19 -19
  15. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  16. package/bin/package.json +2 -2
  17. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  18. package/interpretador/dialetos/pitugues/comum.js +78 -158
  19. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  20. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +1 -0
  21. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
  22. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +9 -0
  23. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  24. package/package.json +2 -2
  25. package/umd/delegua.js +122 -15
@@ -1730,9 +1730,26 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1730
1730
  // Isso ocorre quando a importação é feita de uma biblioteca Node.js.
1731
1731
  // Nesse caso, o tipo de `entidadeChamada.objeto` começa com uma letra maiúscula.
1732
1732
  if (entidadeChamada.objeto.tipo && entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
1733
- const tipoCorrespondente = this.tiposDefinidosPorBibliotecas[entidadeChamada.objeto.tipo];
1733
+ const tipoObjeto = entidadeChamada.objeto.tipo;
1734
+ // Classe definida em código (local ou importada de arquivo .delegua) tem precedência.
1735
+ if (tipoObjeto in this.tiposDefinidosEmCodigo) {
1736
+ const classeDefinida = this.tiposDefinidosEmCodigo[tipoObjeto];
1737
+ if (classeDefinida instanceof declaracoes_1.Classe) {
1738
+ const nomeMembro = entidadeChamada.simbolo.lexema;
1739
+ const metodo = classeDefinida.metodos?.find(m => m.simbolo.lexema === nomeMembro);
1740
+ if (metodo) {
1741
+ return metodo.tipo || 'qualquer';
1742
+ }
1743
+ const propriedade = classeDefinida.propriedades?.find(p => p.nome.lexema === nomeMembro);
1744
+ if (propriedade) {
1745
+ return propriedade.tipo || 'qualquer';
1746
+ }
1747
+ return 'qualquer';
1748
+ }
1749
+ }
1750
+ const tipoCorrespondente = this.tiposDefinidosPorBibliotecas[tipoObjeto];
1734
1751
  if (!tipoCorrespondente) {
1735
- throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Tipo '${entidadeChamada.objeto.tipo}' não foi encontrado entre os tipos definidos por bibliotecas.`);
1752
+ throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Tipo '${tipoObjeto}' não foi encontrado entre os tipos definidos por bibliotecas.`);
1736
1753
  }
1737
1754
  if (!(entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) &&
1738
1755
  !(entidadeChamada.simbolo.lexema in tipoCorrespondente.propriedades)) {
@@ -1745,6 +1762,17 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1745
1762
  const propriedadeCorrespondente = tipoCorrespondente.propriedades[entidadeChamada.simbolo.lexema];
1746
1763
  return propriedadeCorrespondente.tipo;
1747
1764
  }
1765
+ // Chamada via 'isto': verificar métodos da classe em análise antes de checar primitivas.
1766
+ if (entidadeChamada.objeto instanceof construtos_1.Isto) {
1767
+ if (this.metodosClasseAtualEmAnalise) {
1768
+ const nomeMembro = entidadeChamada.simbolo.lexema;
1769
+ const metodo = this.metodosClasseAtualEmAnalise.find(m => m.simbolo.lexema === nomeMembro);
1770
+ if (metodo) {
1771
+ return metodo.tipo || 'qualquer';
1772
+ }
1773
+ }
1774
+ return 'qualquer';
1775
+ }
1748
1776
  // Este caso ocorre quando a variável/constante é do tipo 'qualquer',
1749
1777
  // e a chamada normalmente é feita para uma primitiva.
1750
1778
  // A inferência, portanto, ocorre pelo uso da primitiva.
@@ -2254,7 +2282,20 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2254
2282
  }
2255
2283
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros do operador.");
2256
2284
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do operador.");
2257
- const corpoOp = await this.blocoEscopo();
2285
+ const indiceAberturaCorpoOp = this.atual - 1;
2286
+ const quantidadeErrosAntesCorpoOp = this.erros.length;
2287
+ let corpoOp = [];
2288
+ try {
2289
+ corpoOp = await this.blocoEscopo();
2290
+ }
2291
+ catch (erro) {
2292
+ this.erros.push(erro);
2293
+ }
2294
+ if (this.erros.length > quantidadeErrosAntesCorpoOp) {
2295
+ this.atual = this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpoOp);
2296
+ corpoOp = [];
2297
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
2298
+ }
2258
2299
  const corpoFuncaoOp = new construtos_1.FuncaoConstruto(this.hashArquivo, simboloNomeMetodo.linha, paramsOp, corpoOp);
2259
2300
  const metodoOp = new declaracoes_1.FuncaoDeclaracao(simboloNomeMetodo, corpoFuncaoOp);
2260
2301
  metodoOp.estatico = ehEstatico;
@@ -2312,7 +2353,20 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2312
2353
  // Método concreto: com corpo.
2313
2354
  // Inferência de tipo de retorno igual a corpoDaFuncao().
2314
2355
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do método.");
2315
- const corpo = await this.blocoEscopo();
2356
+ const indiceAberturaCorpo = this.atual - 1;
2357
+ const quantidadeErrosAntesCorpo = this.erros.length;
2358
+ let corpo = [];
2359
+ try {
2360
+ corpo = await this.blocoEscopo();
2361
+ }
2362
+ catch (erro) {
2363
+ this.erros.push(erro);
2364
+ }
2365
+ if (this.erros.length > quantidadeErrosAntesCorpo) {
2366
+ this.atual = this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpo);
2367
+ corpo = [];
2368
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
2369
+ }
2316
2370
  let expressoesRetorna = [];
2317
2371
  for (const declaracao of corpo) {
2318
2372
  expressoesRetorna = expressoesRetorna.concat((0, comum_1.buscarRetornos)(declaracao));
@@ -2378,7 +2432,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2378
2432
  }
2379
2433
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros do acessor.");
2380
2434
  this.consumir(delegua_2.default.CHAVE_ESQUERDA, "Esperado '{' antes do corpo do acessor.");
2381
- const corpoAcessor = await this.blocoEscopo();
2435
+ const indiceAberturaCorpoAcessor = this.atual - 1;
2436
+ const quantidadeErrosAntesCorpoAcessor = this.erros.length;
2437
+ let corpoAcessor = [];
2438
+ try {
2439
+ corpoAcessor = await this.blocoEscopo();
2440
+ }
2441
+ catch (erro) {
2442
+ this.erros.push(erro);
2443
+ }
2444
+ if (this.erros.length >
2445
+ quantidadeErrosAntesCorpoAcessor) {
2446
+ this.atual = this.encontrarIndiceAposFechamentoDeBloco(indiceAberturaCorpoAcessor);
2447
+ corpoAcessor = [];
2448
+ this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
2449
+ }
2382
2450
  // Inferência de tipo de retorno
2383
2451
  let tipoAcessor = 'qualquer';
2384
2452
  let expressoesRetornaAcessor = [];
@@ -2443,6 +2511,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2443
2511
  }
2444
2512
  }
2445
2513
  };
2514
+ this.metodosClasseAtualEmAnalise = metodos;
2446
2515
  await compreenderMembros('publico', false);
2447
2516
  this.consumir(delegua_2.default.CHAVE_DIREITA, "Esperado '}' após o escopo da classe.");
2448
2517
  // Verificação em tempo de análise: classe deve implementar todos os contratos das interfaces.
@@ -2501,6 +2570,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2501
2570
  const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasses, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstrangeira, ehEstatica, implementaInterfaces, mesclas);
2502
2571
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
2503
2572
  this.superclasseAtual = undefined;
2573
+ this.metodosClasseAtualEmAnalise = undefined;
2504
2574
  return definicaoClasse;
2505
2575
  }
2506
2576
  /**
@@ -2648,6 +2718,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2648
2718
  * @returns Sempre retorna `void`.
2649
2719
  */
2650
2720
  sincronizar() {
2721
+ if (this.estaNoFinal()) {
2722
+ return;
2723
+ }
2651
2724
  this.avancarEDevolverAnterior(); // avança além do token com erro
2652
2725
  while (!this.estaNoFinal()) {
2653
2726
  // Um ponto-e-vírgula já consumido indica fronteira limpa entre declarações.
@@ -2671,6 +2744,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
2671
2744
  this.avancarEDevolverAnterior();
2672
2745
  }
2673
2746
  }
2747
+ encontrarIndiceAposFechamentoDeBloco(indiceAbertura) {
2748
+ let aberturasPendentes = 1;
2749
+ for (let indice = indiceAbertura + 1; indice < this.simbolos.length; indice++) {
2750
+ if (this.simbolos[indice].tipo === delegua_2.default.CHAVE_ESQUERDA) {
2751
+ aberturasPendentes++;
2752
+ }
2753
+ else if (this.simbolos[indice].tipo === delegua_2.default.CHAVE_DIREITA) {
2754
+ aberturasPendentes--;
2755
+ if (aberturasPendentes === 0) {
2756
+ return indice + 1;
2757
+ }
2758
+ }
2759
+ }
2760
+ return this.simbolos.length;
2761
+ }
2674
2762
  /**
2675
2763
  * Todas as resoluções triviais da linguagem, ou seja, todas as
2676
2764
  * resoluções que podem ocorrer dentro ou fora de um bloco.