@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.
- package/avaliador-sintatico/avaliador-sintatico.d.ts +1 -0
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +15 -6
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +0 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js +0 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-tenda.js.map +1 -1
- package/bibliotecas/biblioteca-global.js +1 -1
- package/bibliotecas/biblioteca-global.js.map +1 -1
- package/bibliotecas/primitivas-vetor.d.ts.map +1 -1
- package/bibliotecas/primitivas-vetor.js +2 -1
- package/bibliotecas/primitivas-vetor.js.map +1 -1
- package/bin/package.json +3 -2
- package/construtos/agrupamento.d.ts +1 -1
- package/construtos/agrupamento.d.ts.map +1 -1
- package/construtos/agrupamento.js +2 -2
- package/construtos/agrupamento.js.map +1 -1
- package/construtos/atribuir.d.ts +1 -1
- package/construtos/atribuir.d.ts.map +1 -1
- package/construtos/atribuir.js +2 -2
- package/construtos/atribuir.js.map +1 -1
- package/construtos/binario.d.ts +1 -1
- package/construtos/binario.d.ts.map +1 -1
- package/construtos/binario.js +2 -2
- package/construtos/binario.js.map +1 -1
- package/construtos/literal.d.ts +1 -1
- package/construtos/literal.d.ts.map +1 -1
- package/construtos/literal.js +2 -2
- package/construtos/literal.js.map +1 -1
- package/construtos/logico.d.ts +1 -1
- package/construtos/logico.d.ts.map +1 -1
- package/construtos/logico.js +2 -2
- package/construtos/logico.js.map +1 -1
- package/construtos/para-como-construto.d.ts +2 -1
- package/construtos/para-como-construto.d.ts.map +1 -1
- package/construtos/para-como-construto.js +2 -1
- package/construtos/para-como-construto.js.map +1 -1
- package/construtos/unario.d.ts +1 -1
- package/construtos/unario.d.ts.map +1 -1
- package/construtos/unario.js +2 -2
- package/construtos/unario.js.map +1 -1
- package/construtos/variavel.d.ts +2 -2
- package/construtos/variavel.d.ts.map +1 -1
- package/construtos/variavel.js +2 -2
- package/construtos/variavel.js.map +1 -1
- package/declaracoes/para.d.ts +2 -1
- package/declaracoes/para.d.ts.map +1 -1
- package/declaracoes/para.js +2 -1
- package/declaracoes/para.js.map +1 -1
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js +11 -7
- package/formatadores/formatador-delegua.js.map +1 -1
- package/formatadores/formatador-pitugues.d.ts.map +1 -1
- package/formatadores/formatador-pitugues.js +2 -1
- package/formatadores/formatador-pitugues.js.map +1 -1
- package/interfaces/construtos/construto-interface.d.ts +6 -1
- package/interfaces/construtos/construto-interface.d.ts.map +1 -1
- package/interfaces/delegua/para-interface.d.ts +7 -0
- package/interfaces/delegua/para-interface.d.ts.map +1 -1
- package/interfaces/interpretador-interface.d.ts +13 -1
- package/interfaces/interpretador-interface.d.ts.map +1 -1
- package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts +1 -0
- package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts.map +1 -1
- package/interpretador/depuracao/interpretador-base-com-depuracao.js +1 -0
- package/interpretador/depuracao/interpretador-base-com-depuracao.js.map +1 -1
- package/interpretador/depuracao/interpretador-com-depuracao.d.ts +1 -0
- package/interpretador/depuracao/interpretador-com-depuracao.d.ts.map +1 -1
- package/interpretador/depuracao/interpretador-com-depuracao.js +1 -0
- package/interpretador/depuracao/interpretador-com-depuracao.js.map +1 -1
- package/interpretador/dialetos/calango/interpretador-calango.d.ts +1 -1
- package/interpretador/dialetos/calango/interpretador-calango.d.ts.map +1 -1
- package/interpretador/dialetos/calango/interpretador-calango.js +14 -10
- package/interpretador/dialetos/calango/interpretador-calango.js.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +3 -3
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js +8 -6
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
- package/interpretador/dialetos/prisma/interpretador-prisma.d.ts +2 -2
- package/interpretador/dialetos/prisma/interpretador-prisma.d.ts.map +1 -1
- package/interpretador/dialetos/prisma/interpretador-prisma.js +26 -19
- package/interpretador/dialetos/prisma/interpretador-prisma.js.map +1 -1
- package/interpretador/encadear.d.ts +36 -0
- package/interpretador/encadear.d.ts.map +1 -0
- package/interpretador/encadear.js +43 -0
- package/interpretador/encadear.js.map +1 -0
- package/interpretador/estruturas/delegua-funcao.d.ts +25 -0
- package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
- package/interpretador/estruturas/delegua-funcao.js +90 -23
- package/interpretador/estruturas/delegua-funcao.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +34 -22
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +630 -557
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +8 -11
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +170 -116
- package/interpretador/interpretador.js.map +1 -1
- package/lexador/dialetos/lexador-pitugues.d.ts.map +1 -1
- package/lexador/dialetos/lexador-pitugues.js +0 -1
- package/lexador/dialetos/lexador-pitugues.js.map +1 -1
- package/lexador/dialetos/lexador-tenda.d.ts.map +1 -1
- package/lexador/dialetos/lexador-tenda.js +0 -1
- package/lexador/dialetos/lexador-tenda.js.map +1 -1
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +0 -1
- package/lexador/lexador.js.map +1 -1
- package/package.json +3 -2
- 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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
|
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
|
-
|
|
342
|
+
logicaComumExecucaoEnquanto(enquanto, acumularRetornos) {
|
|
342
343
|
const retornos = [];
|
|
343
344
|
let retornoExecucao = undefined;
|
|
344
345
|
let iteracoes = 0;
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
357
|
-
valorRetornado: retornos,
|
|
358
|
-
tipo: 'vetor',
|
|
359
|
-
};
|
|
392
|
+
retornos.push(this.resolverValor(retornoExecucao));
|
|
360
393
|
}
|
|
361
|
-
return
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
|
|
367
|
-
|
|
404
|
+
catch (erro) {
|
|
405
|
+
return tratarErro(erro);
|
|
368
406
|
}
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
if (
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
valorRetornado
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
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
|
|
516
|
+
return proximaIteracao();
|
|
484
517
|
}
|
|
485
|
-
|
|
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
|
-
|
|
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
|
|
1542
|
+
return this.avaliar(novaChamada);
|
|
1510
1543
|
}
|
|
1511
1544
|
}
|
|
1512
1545
|
}
|
|
1513
1546
|
// Para outros casos, usa o comportamento padrão
|
|
1514
|
-
return
|
|
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
|
-
|
|
1567
|
+
executarUltimoEscopo(manterAmbiente = false) {
|
|
1535
1568
|
const ultimoEscopo = this.pilhaEscoposExecucao.topoDaPilha();
|
|
1536
1569
|
let retornoExecucao = undefined;
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
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) {
|