@designliquido/delegua 1.27.2 → 1.28.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 (114) hide show
  1. package/avaliador-sintatico/avaliador-sintatico.d.ts +1 -0
  2. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  3. package/avaliador-sintatico/avaliador-sintatico.js +15 -6
  4. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  5. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  6. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +0 -1
  7. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  8. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +0 -1
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
  11. package/bibliotecas/biblioteca-global.js +1 -1
  12. package/bibliotecas/biblioteca-global.js.map +1 -1
  13. package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
  14. package/bibliotecas/primitivas-vetor.js +2 -1
  15. package/bibliotecas/primitivas-vetor.js.map +1 -1
  16. package/bin/package.json +3 -2
  17. package/construtos/agrupamento.d.ts +1 -1
  18. package/construtos/agrupamento.d.ts.map +1 -1
  19. package/construtos/agrupamento.js +2 -2
  20. package/construtos/agrupamento.js.map +1 -1
  21. package/construtos/atribuir.d.ts +1 -1
  22. package/construtos/atribuir.d.ts.map +1 -1
  23. package/construtos/atribuir.js +2 -2
  24. package/construtos/atribuir.js.map +1 -1
  25. package/construtos/binario.d.ts +1 -1
  26. package/construtos/binario.d.ts.map +1 -1
  27. package/construtos/binario.js +2 -2
  28. package/construtos/binario.js.map +1 -1
  29. package/construtos/literal.d.ts +1 -1
  30. package/construtos/literal.d.ts.map +1 -1
  31. package/construtos/literal.js +2 -2
  32. package/construtos/literal.js.map +1 -1
  33. package/construtos/logico.d.ts +1 -1
  34. package/construtos/logico.d.ts.map +1 -1
  35. package/construtos/logico.js +2 -2
  36. package/construtos/logico.js.map +1 -1
  37. package/construtos/para-como-construto.d.ts +2 -1
  38. package/construtos/para-como-construto.d.ts.map +1 -1
  39. package/construtos/para-como-construto.js +2 -1
  40. package/construtos/para-como-construto.js.map +1 -1
  41. package/construtos/unario.d.ts +1 -1
  42. package/construtos/unario.d.ts.map +1 -1
  43. package/construtos/unario.js +2 -2
  44. package/construtos/unario.js.map +1 -1
  45. package/construtos/variavel.d.ts +2 -2
  46. package/construtos/variavel.d.ts.map +1 -1
  47. package/construtos/variavel.js +2 -2
  48. package/construtos/variavel.js.map +1 -1
  49. package/declaracoes/para.d.ts +2 -1
  50. package/declaracoes/para.d.ts.map +1 -1
  51. package/declaracoes/para.js +2 -1
  52. package/declaracoes/para.js.map +1 -1
  53. package/formatadores/formatador-delegua.d.ts.map +1 -1
  54. package/formatadores/formatador-delegua.js +11 -7
  55. package/formatadores/formatador-delegua.js.map +1 -1
  56. package/formatadores/formatador-pitugues.d.ts.map +1 -1
  57. package/formatadores/formatador-pitugues.js +2 -1
  58. package/formatadores/formatador-pitugues.js.map +1 -1
  59. package/interfaces/construtos/construto-interface.d.ts +6 -1
  60. package/interfaces/construtos/construto-interface.d.ts.map +1 -1
  61. package/interfaces/delegua/para-interface.d.ts +7 -0
  62. package/interfaces/delegua/para-interface.d.ts.map +1 -1
  63. package/interfaces/interpretador-interface.d.ts +13 -1
  64. package/interfaces/interpretador-interface.d.ts.map +1 -1
  65. package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts +1 -0
  66. package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts.map +1 -1
  67. package/interpretador/depuracao/interpretador-base-com-depuracao.js +1 -0
  68. package/interpretador/depuracao/interpretador-base-com-depuracao.js.map +1 -1
  69. package/interpretador/depuracao/interpretador-com-depuracao.d.ts +1 -0
  70. package/interpretador/depuracao/interpretador-com-depuracao.d.ts.map +1 -1
  71. package/interpretador/depuracao/interpretador-com-depuracao.js +1 -0
  72. package/interpretador/depuracao/interpretador-com-depuracao.js.map +1 -1
  73. package/interpretador/dialetos/calango/interpretador-calango.d.ts +1 -1
  74. package/interpretador/dialetos/calango/interpretador-calango.d.ts.map +1 -1
  75. package/interpretador/dialetos/calango/interpretador-calango.js +14 -10
  76. package/interpretador/dialetos/calango/interpretador-calango.js.map +1 -1
  77. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  78. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +3 -3
  79. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  80. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +1 -1
  81. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
  82. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +8 -6
  83. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  84. package/interpretador/dialetos/prisma/interpretador-prisma.d.ts +2 -2
  85. package/interpretador/dialetos/prisma/interpretador-prisma.d.ts.map +1 -1
  86. package/interpretador/dialetos/prisma/interpretador-prisma.js +26 -19
  87. package/interpretador/dialetos/prisma/interpretador-prisma.js.map +1 -1
  88. package/interpretador/encadear.d.ts +36 -0
  89. package/interpretador/encadear.d.ts.map +1 -0
  90. package/interpretador/encadear.js +43 -0
  91. package/interpretador/encadear.js.map +1 -0
  92. package/interpretador/estruturas/delegua-funcao.d.ts +25 -0
  93. package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
  94. package/interpretador/estruturas/delegua-funcao.js +90 -23
  95. package/interpretador/estruturas/delegua-funcao.js.map +1 -1
  96. package/interpretador/interpretador-base.d.ts +34 -22
  97. package/interpretador/interpretador-base.d.ts.map +1 -1
  98. package/interpretador/interpretador-base.js +630 -557
  99. package/interpretador/interpretador-base.js.map +1 -1
  100. package/interpretador/interpretador.d.ts +8 -11
  101. package/interpretador/interpretador.d.ts.map +1 -1
  102. package/interpretador/interpretador.js +170 -116
  103. package/interpretador/interpretador.js.map +1 -1
  104. package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
  105. package/lexador/dialetos/lexador-pitugues.js +0 -1
  106. package/lexador/dialetos/lexador-pitugues.js.map +1 -1
  107. package/lexador/dialetos/lexador-tenda.d.ts.map +1 -1
  108. package/lexador/dialetos/lexador-tenda.js +0 -1
  109. package/lexador/dialetos/lexador-tenda.js.map +1 -1
  110. package/lexador/lexador.d.ts.map +1 -1
  111. package/lexador/lexador.js +0 -1
  112. package/lexador/lexador.js.map +1 -1
  113. package/package.json +3 -2
  114. package/umd/delegua.js +1377 -1105
@@ -9,6 +9,7 @@ const estruturas_1 = require("./estruturas");
9
9
  const interpretador_base_1 = require("./interpretador-base");
10
10
  const inferenciador_1 = require("../inferenciador");
11
11
  const excecoes_1 = require("../excecoes");
12
+ const encadear_1 = require("./encadear");
12
13
  const declaracoes_1 = require("../declaracoes");
13
14
  const quebras_1 = require("../quebras");
14
15
  const montao_1 = require("./montao");
@@ -215,16 +216,16 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
215
216
  }
216
217
  return objeto.toString();
217
218
  }
218
- async avaliacaoDeclaracaoVarOuConst(declaracao) {
219
- let valorOuOutraVariavel = null;
220
- if (declaracao.inicializador != null) {
221
- valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
222
- }
223
- let valorFinal = null;
224
- if (valorOuOutraVariavel !== null && valorOuOutraVariavel !== undefined) {
225
- valorFinal = this.resolverValor(valorOuOutraVariavel);
219
+ avaliacaoDeclaracaoVarOuConst(declaracao) {
220
+ if (declaracao.inicializador == null) {
221
+ return null;
226
222
  }
227
- return valorFinal;
223
+ return (0, encadear_1.encadear)(this.avaliar(declaracao.inicializador), (valorOuOutraVariavel) => {
224
+ if (valorOuOutraVariavel !== null && valorOuOutraVariavel !== undefined) {
225
+ return this.resolverValor(valorOuOutraVariavel);
226
+ }
227
+ return null;
228
+ });
228
229
  }
229
230
  /**
230
231
  * Declaração de ajuda.
@@ -298,7 +299,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
298
299
  return this.resolverValor(await this.avaliar(expressaoDecoradora), true);
299
300
  }
300
301
  async visitarDeclaracaoDefinicaoFuncao(declaracao) {
301
- let funcao = new estruturas_1.DeleguaFuncao(declaracao.simbolo.lexema, declaracao.funcao);
302
+ let funcao = new estruturas_1.DeleguaFuncao(declaracao.simbolo.lexema, declaracao.funcao).capturarEscopo(this.pilhaEscoposExecucao);
302
303
  funcao.documentacao = declaracao.documentacao;
303
304
  if (declaracao.decoradores && declaracao.decoradores.length > 0) {
304
305
  for (const decorador of [...declaracao.decoradores].reverse()) {
@@ -338,53 +339,76 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
338
339
  declaracao: funcao,
339
340
  });
340
341
  }
341
- async logicaComumExecucaoEnquanto(enquanto, acumularRetornos) {
342
+ logicaComumExecucaoEnquanto(enquanto, acumularRetornos) {
342
343
  const retornos = [];
343
344
  let retornoExecucao = undefined;
344
345
  let iteracoes = 0;
345
- while ((acumularRetornos ||
346
- !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) &&
347
- this.eVerdadeiro(await this.avaliar(enquanto.condicao))) {
348
- try {
349
- if (this.funcaoVerificarIteracao) {
350
- await this.funcaoVerificarIteracao();
346
+ const finalizarNormal = () => {
347
+ if (acumularRetornos) {
348
+ return {
349
+ valorRetornado: retornos,
350
+ tipo: 'vetor',
351
+ };
352
+ }
353
+ return retornoExecucao;
354
+ };
355
+ const tratarErro = (erro) => {
356
+ this.erros.push({
357
+ erroInterno: erro,
358
+ linha: enquanto.linha,
359
+ hashArquivo: enquanto.hashArquivo,
360
+ });
361
+ return Promise.reject(erro);
362
+ };
363
+ const proximaIteracao = () => {
364
+ // Curto-circuito: espelha `(acumularRetornos || !(...Quebra)) && eVerdadeiro(...)` —
365
+ // se a primeira parte já é falsa, nem avalia a condição do laço.
366
+ if (!acumularRetornos &&
367
+ retornoExecucao &&
368
+ retornoExecucao.valorRetornado instanceof quebras_1.Quebra) {
369
+ return finalizarNormal();
370
+ }
371
+ return (0, encadear_1.encadear)(this.avaliar(enquanto.condicao), (condicaoBruta) => {
372
+ if (!this.eVerdadeiro(condicaoBruta)) {
373
+ return finalizarNormal();
351
374
  }
352
- await this.cederControle(++iteracoes);
353
- retornoExecucao = await this.executar(enquanto.corpo);
354
- if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
375
+ const corpoIteracao = () => (0, encadear_1.encadear)(this.cederControle(++iteracoes), () => (0, encadear_1.encadear)(this.executar(enquanto.corpo), (resultado) => {
376
+ retornoExecucao = resultado;
377
+ if (retornoExecucao &&
378
+ retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
379
+ if (acumularRetornos) {
380
+ return {
381
+ valorRetornado: retornos,
382
+ tipo: 'vetor',
383
+ };
384
+ }
385
+ return null;
386
+ }
387
+ if (retornoExecucao &&
388
+ retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
389
+ retornoExecucao = undefined;
390
+ }
355
391
  if (acumularRetornos) {
356
- return {
357
- valorRetornado: retornos,
358
- tipo: 'vetor',
359
- };
392
+ retornos.push(this.resolverValor(retornoExecucao));
360
393
  }
361
- return null;
362
- }
363
- if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
364
- retornoExecucao = undefined;
394
+ return proximaIteracao();
395
+ }));
396
+ try {
397
+ const resultadoOuPromise = this.funcaoVerificarIteracao
398
+ ? (0, encadear_1.encadear)(this.funcaoVerificarIteracao(), () => corpoIteracao())
399
+ : corpoIteracao();
400
+ return resultadoOuPromise instanceof Promise
401
+ ? resultadoOuPromise.catch(tratarErro)
402
+ : resultadoOuPromise;
365
403
  }
366
- if (acumularRetornos) {
367
- retornos.push(this.resolverValor(retornoExecucao));
404
+ catch (erro) {
405
+ return tratarErro(erro);
368
406
  }
369
- }
370
- catch (erro) {
371
- this.erros.push({
372
- erroInterno: erro,
373
- linha: enquanto.linha,
374
- hashArquivo: enquanto.hashArquivo,
375
- });
376
- return Promise.reject(erro);
377
- }
378
- }
379
- if (acumularRetornos) {
380
- return {
381
- valorRetornado: retornos,
382
- tipo: 'vetor',
383
- };
384
- }
385
- return retornoExecucao;
407
+ });
408
+ };
409
+ return proximaIteracao();
386
410
  }
387
- async visitarDeclaracaoEnquanto(declaracao) {
411
+ visitarDeclaracaoEnquanto(declaracao) {
388
412
  return this.logicaComumExecucaoEnquanto(declaracao, false);
389
413
  }
390
414
  async logicaComumExecucaoFazer(fazer, acumularRetornos) {
@@ -435,54 +459,63 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
435
459
  async visitarDeclaracaoFazer(declaracao) {
436
460
  return this.logicaComumExecucaoFazer(declaracao, false);
437
461
  }
438
- async logicaComumExecucaoPara(para, acumularRetornos) {
462
+ logicaComumExecucaoPara(para, acumularRetornos) {
439
463
  const declaracaoInicializador = Array.isArray(para.inicializador)
440
464
  ? para.inicializador[0]
441
465
  : para.inicializador;
442
- if (declaracaoInicializador !== null && declaracaoInicializador !== undefined) {
443
- await this.avaliar(declaracaoInicializador);
444
- }
445
466
  const retornos = [];
446
467
  let retornoExecucao = undefined;
447
468
  let iteracoes = 0;
448
- while (acumularRetornos ||
449
- !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
450
- if (para.condicao !== null && !this.eVerdadeiro(await this.avaliar(para.condicao))) {
451
- break;
452
- }
453
- if (this.funcaoVerificarIteracao) {
454
- await this.funcaoVerificarIteracao();
455
- }
456
- await this.cederControle(++iteracoes);
457
- retornoExecucao = await this.executar(para.corpo);
458
- if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
459
- if (acumularRetornos) {
460
- return {
461
- valorRetornado: retornos,
462
- tipo: 'vetor',
463
- };
464
- }
465
- return undefined;
466
- }
467
- if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
468
- retornoExecucao = undefined;
469
- }
470
- if (acumularRetornos) {
471
- retornos.push(this.resolverValor(retornoExecucao));
472
- }
473
- if (para.incrementar !== null) {
474
- await this.avaliar(para.incrementar);
475
- }
476
- }
477
- if (acumularRetornos) {
478
- return {
479
- valorRetornado: retornos,
480
- tipo: 'vetor',
469
+ const finalizarAcumulado = () => ({
470
+ valorRetornado: retornos,
471
+ tipo: 'vetor',
472
+ });
473
+ const proximaIteracao = () => {
474
+ if (!(acumularRetornos ||
475
+ !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra))) {
476
+ return acumularRetornos ? finalizarAcumulado() : retornoExecucao;
477
+ }
478
+ const continuarAposCondicao = () => {
479
+ const corpoIteracao = () => (0, encadear_1.encadear)(this.cederControle(++iteracoes), () => (0, encadear_1.encadear)(this.executar(para.corpo), (resultado) => {
480
+ retornoExecucao = resultado;
481
+ if (retornoExecucao &&
482
+ retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
483
+ if (acumularRetornos)
484
+ return finalizarAcumulado();
485
+ return undefined;
486
+ }
487
+ if (retornoExecucao &&
488
+ retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
489
+ retornoExecucao = undefined;
490
+ }
491
+ if (acumularRetornos) {
492
+ retornos.push(this.resolverValor(retornoExecucao));
493
+ }
494
+ if (para.incrementar !== null) {
495
+ return (0, encadear_1.encadear)(this.avaliar(para.incrementar), () => proximaIteracao());
496
+ }
497
+ return proximaIteracao();
498
+ }));
499
+ return this.funcaoVerificarIteracao
500
+ ? (0, encadear_1.encadear)(this.funcaoVerificarIteracao(), () => corpoIteracao())
501
+ : corpoIteracao();
481
502
  };
503
+ if (para.condicao !== null) {
504
+ return (0, encadear_1.encadear)(this.avaliar(para.condicao), (condicaoBruta) => {
505
+ if (!this.eVerdadeiro(condicaoBruta)) {
506
+ return acumularRetornos ? finalizarAcumulado() : retornoExecucao;
507
+ }
508
+ return continuarAposCondicao();
509
+ });
510
+ }
511
+ return continuarAposCondicao();
512
+ };
513
+ if (declaracaoInicializador !== null && declaracaoInicializador !== undefined) {
514
+ return (0, encadear_1.encadear)(this.avaliar(declaracaoInicializador), () => proximaIteracao());
482
515
  }
483
- return retornoExecucao;
516
+ return proximaIteracao();
484
517
  }
485
- async visitarDeclaracaoPara(declaracao) {
518
+ visitarDeclaracaoPara(declaracao) {
486
519
  return this.logicaComumExecucaoPara(declaracao, false);
487
520
  }
488
521
  /**
@@ -672,7 +705,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
672
705
  continue;
673
706
  }
674
707
  const eInicializador = nomeMetodo === 'construtor';
675
- const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
708
+ const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador).capturarEscopo(this.pilhaEscoposExecucao);
676
709
  funcao.documentacao = metodoAtual.documentacao;
677
710
  // Numa classe estática, todos os métodos (exceto construtor) são estáticos.
678
711
  const ehEstatico = declaracao.classeEstatica ? !eInicializador : metodoAtual.estatico;
@@ -1477,7 +1510,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
1477
1510
  return (0, inferenciador_1.inferirTipoVariavel)(valorTipoDe);
1478
1511
  }
1479
1512
  }
1480
- async visitarExpressaoUnaria(expressao) {
1513
+ visitarExpressaoUnaria(expressao) {
1481
1514
  // Tratamento especial para expressões unárias aplicadas a chamadas de método em literais numéricos.
1482
1515
  // Por exemplo: -5.absoluto() deve ser avaliado como (-5).absoluto(), não como -(5.absoluto())
1483
1516
  // Isso garante que o operador unário seja aplicado ao literal antes de chamar o método.
@@ -1506,12 +1539,12 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
1506
1539
  // Cria uma nova Chamada com o acesso modificado
1507
1540
  const novaChamada = new construtos_1.Chamada(expressao.operando.hashArquivo, novoAcesso, expressao.operando.argumentos);
1508
1541
  // Avalia a nova chamada
1509
- return await this.avaliar(novaChamada);
1542
+ return this.avaliar(novaChamada);
1510
1543
  }
1511
1544
  }
1512
1545
  }
1513
1546
  // Para outros casos, usa o comportamento padrão
1514
- return await super.visitarExpressaoUnaria(expressao);
1547
+ return super.visitarExpressaoUnaria(expressao);
1515
1548
  }
1516
1549
  async visitarExpressaoVetor(expressao) {
1517
1550
  // Delega ao interpretador base para processar o vetor
@@ -1531,33 +1564,13 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
1531
1564
  * @param manterAmbiente Se verdadeiro, ambiente do topo da pilha de escopo é copiado para o ambiente imediatamente abaixo.
1532
1565
  * @returns O resultado da execução do escopo, se houver.
1533
1566
  */
1534
- async executarUltimoEscopo(manterAmbiente = false) {
1567
+ executarUltimoEscopo(manterAmbiente = false) {
1535
1568
  const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
1536
1569
  let retornoExecucao = undefined;
1537
- try {
1538
- for (; !(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
1539
- ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
1540
- const declaracaoAtual = ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual];
1541
- this.linhaDeclaracaoAtual = declaracaoAtual.linha;
1542
- this.hashArquivoDeclaracaoAtual = declaracaoAtual.hashArquivo;
1543
- retornoExecucao = await this.executar(declaracaoAtual);
1544
- }
1545
- return retornoExecucao;
1546
- }
1547
- catch (erro) {
1548
- const declaracaoAtual = ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual];
1549
- if (!this.emDeclaracaoTente) {
1550
- this.erros.push({
1551
- erroInterno: erro,
1552
- linha: declaracaoAtual.linha,
1553
- hashArquivo: declaracaoAtual.hashArquivo,
1554
- });
1555
- }
1556
- else {
1557
- return Promise.reject(erro);
1558
- }
1559
- }
1560
- finally {
1570
+ // Substitui o `finally` original: precisa rodar em toda saída (sucesso, erro síncrono
1571
+ // ou rejeição assíncrona), então é chamado explicitamente em cada um desses três casos
1572
+ // abaixo, nunca implicitamente — não há `finally` de verdade quando não se usa `await`.
1573
+ const finalizar = () => {
1561
1574
  const escopoFinalizado = this.pilhaEscoposExecucao.removerUltimo();
1562
1575
  const escopoAnterior = this.pilhaEscoposExecucao.topoDaPilha();
1563
1576
  if (manterAmbiente ||
@@ -1571,6 +1584,47 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
1571
1584
  else {
1572
1585
  this.montao.excluirReferencias(...escopoFinalizado.espacoMemoria.enderecosMontao);
1573
1586
  }
1587
+ };
1588
+ const tratarErro = (erro) => {
1589
+ try {
1590
+ const declaracaoAtual = ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual];
1591
+ if (!this.emDeclaracaoTente) {
1592
+ this.erros.push({
1593
+ erroInterno: erro,
1594
+ linha: declaracaoAtual.linha,
1595
+ hashArquivo: declaracaoAtual.hashArquivo,
1596
+ });
1597
+ return undefined;
1598
+ }
1599
+ return Promise.reject(erro);
1600
+ }
1601
+ finally {
1602
+ finalizar();
1603
+ }
1604
+ };
1605
+ const proximaDeclaracao = () => {
1606
+ if ((retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) ||
1607
+ ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length) {
1608
+ finalizar();
1609
+ return retornoExecucao;
1610
+ }
1611
+ const declaracaoAtual = ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual];
1612
+ this.linhaDeclaracaoAtual = declaracaoAtual.linha;
1613
+ this.hashArquivoDeclaracaoAtual = declaracaoAtual.hashArquivo;
1614
+ return (0, encadear_1.encadear)(this.executar(declaracaoAtual), (resultado) => {
1615
+ retornoExecucao = resultado;
1616
+ ultimoEscopo.declaracaoAtual++;
1617
+ return proximaDeclaracao();
1618
+ });
1619
+ };
1620
+ try {
1621
+ const resultadoOuPromise = proximaDeclaracao();
1622
+ return resultadoOuPromise instanceof Promise
1623
+ ? resultadoOuPromise.catch(tratarErro)
1624
+ : resultadoOuPromise;
1625
+ }
1626
+ catch (erro) {
1627
+ return tratarErro(erro);
1574
1628
  }
1575
1629
  }
1576
1630
  async visitarExpressaoTuplaN(expressao) {