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