@designliquido/delegua 1.16.2 → 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/analisador-semantico.d.ts +14 -0
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +15 -11
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- 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/dialetos/pitugues/interpretador-pitugues.js +3 -3
- package/interpretador/dialetos/pitugues/interpretador-pitugues.js.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 +101 -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/index.d.ts +1 -1
- package/tradutores/index.d.ts.map +1 -1
- package/tradutores/index.js +1 -1
- package/tradutores/index.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/tradutores/tradutor-reverso-calango.d.ts +45 -0
- package/tradutores/tradutor-reverso-calango.d.ts.map +1 -0
- package/tradutores/tradutor-reverso-calango.js +351 -0
- package/tradutores/tradutor-reverso-calango.js.map +1 -0
- package/tradutores/tradutor-reverso-python.d.ts +58 -26
- package/tradutores/tradutor-reverso-python.d.ts.map +1 -1
- package/tradutores/tradutor-reverso-python.js +609 -52
- package/tradutores/tradutor-reverso-python.js.map +1 -1
- package/umd/delegua.js +1426 -588
- package/tradutores/tradutor-calango.d.ts +0 -23
- package/tradutores/tradutor-calango.d.ts.map +0 -1
- package/tradutores/tradutor-calango.js +0 -54
- package/tradutores/tradutor-calango.js.map +0 -1
|
@@ -30,14 +30,16 @@ const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-ve
|
|
|
30
30
|
* recomendado para uso em execuções que ocorrem no navegador de internet.
|
|
31
31
|
*/
|
|
32
32
|
class InterpretadorBase {
|
|
33
|
-
constructor(diretorioBase, performance = false, funcaoDeRetorno =
|
|
33
|
+
constructor(diretorioBase, performance = false, funcaoDeRetorno = undefined, funcaoDeRetornoMesmaLinha = undefined) {
|
|
34
34
|
this.resultadoInterpretador = [];
|
|
35
|
+
this.linhaDeclaracaoAtual = -1;
|
|
36
|
+
this.hashArquivoDeclaracaoAtual = -1;
|
|
35
37
|
this.classeAtualEmExecucao = null;
|
|
36
|
-
this.funcaoDeRetorno =
|
|
37
|
-
this.funcaoDeRetornoMesmaLinha =
|
|
38
|
-
this.interfaceDeEntrada =
|
|
39
|
-
this.interfaceEntradaSaida =
|
|
40
|
-
this.funcaoVerificarIteracao =
|
|
38
|
+
this.funcaoDeRetorno = undefined;
|
|
39
|
+
this.funcaoDeRetornoMesmaLinha = undefined;
|
|
40
|
+
this.interfaceDeEntrada = undefined; // Originalmente é `readline.Interface`
|
|
41
|
+
this.interfaceEntradaSaida = undefined;
|
|
42
|
+
this.funcaoVerificarIteracao = undefined;
|
|
41
43
|
this.emDeclaracaoTente = false;
|
|
42
44
|
// typeName → methodName → DeleguaFuncao
|
|
43
45
|
this.extensoesGlobais = new Map();
|
|
@@ -60,8 +62,12 @@ class InterpretadorBase {
|
|
|
60
62
|
this.diretorioBase = diretorioBase;
|
|
61
63
|
this.performance = performance;
|
|
62
64
|
this.funcaoDeRetorno = funcaoDeRetorno || console.log;
|
|
65
|
+
const _process = globalThis.process;
|
|
63
66
|
this.funcaoDeRetornoMesmaLinha =
|
|
64
|
-
funcaoDeRetornoMesmaLinha ||
|
|
67
|
+
funcaoDeRetornoMesmaLinha ||
|
|
68
|
+
(_process?.stdout?.write
|
|
69
|
+
? _process.stdout.write.bind(_process.stdout)
|
|
70
|
+
: (texto) => console.log(texto));
|
|
65
71
|
this.erros = [];
|
|
66
72
|
this.declaracoes = [];
|
|
67
73
|
this.resultadoInterpretador = [];
|
|
@@ -92,8 +98,9 @@ class InterpretadorBase {
|
|
|
92
98
|
async cederControle(iteracoes) {
|
|
93
99
|
if (iteracoes % this.iteracoesParaCederControle === 0) {
|
|
94
100
|
await new Promise((resolve) => {
|
|
95
|
-
|
|
96
|
-
|
|
101
|
+
const _setImmediate = globalThis.setImmediate;
|
|
102
|
+
if (_setImmediate) {
|
|
103
|
+
_setImmediate(resolve);
|
|
97
104
|
}
|
|
98
105
|
else {
|
|
99
106
|
setTimeout(resolve, 0);
|
|
@@ -132,6 +139,7 @@ class InterpretadorBase {
|
|
|
132
139
|
case construtos_1.AcessoMetodoOuPropriedade:
|
|
133
140
|
case construtos_1.AcessoIndiceVariavel:
|
|
134
141
|
case construtos_1.Dicionario:
|
|
142
|
+
case construtos_1.Leia:
|
|
135
143
|
case construtos_1.Literal:
|
|
136
144
|
case construtos_1.Vetor:
|
|
137
145
|
return '';
|
|
@@ -247,10 +255,10 @@ class InterpretadorBase {
|
|
|
247
255
|
const elementosComoConstrutos = elementos.map((valor) => new construtos_1.Literal(expressao.hashArquivo, expressao.linha, valor));
|
|
248
256
|
return new construtos_1.TuplaN(expressao.hashArquivo, expressao.linha, elementosComoConstrutos);
|
|
249
257
|
}
|
|
250
|
-
async visitarExpressaoAtribuicaoPorIndicesMatriz(
|
|
258
|
+
async visitarExpressaoAtribuicaoPorIndicesMatriz(_) {
|
|
251
259
|
throw new Error('Método não implementado.');
|
|
252
260
|
}
|
|
253
|
-
async visitarExpressaoAcessoElementoMatriz(
|
|
261
|
+
async visitarExpressaoAcessoElementoMatriz(_) {
|
|
254
262
|
throw new Error('Método não implementado.');
|
|
255
263
|
}
|
|
256
264
|
textoParaRegex(texto) {
|
|
@@ -265,14 +273,14 @@ class InterpretadorBase {
|
|
|
265
273
|
visitarExpressaoExpressaoRegular(expressao) {
|
|
266
274
|
return Promise.resolve(this.textoParaRegex(expressao.valor));
|
|
267
275
|
}
|
|
268
|
-
visitarExpressaoTipoDe(
|
|
276
|
+
visitarExpressaoTipoDe(_) {
|
|
269
277
|
throw new Error('Método não implementado.');
|
|
270
278
|
}
|
|
271
279
|
async visitarExpressaoFalhar(expressao) {
|
|
272
280
|
const textoFalha = expressao.explicacao.valor ?? (await this.avaliar(expressao.explicacao)).valor;
|
|
273
281
|
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, textoFalha, expressao.linha);
|
|
274
282
|
}
|
|
275
|
-
async visitarExpressaoFimPara(
|
|
283
|
+
async visitarExpressaoFimPara(_) {
|
|
276
284
|
throw new Error('Método não implementado.');
|
|
277
285
|
}
|
|
278
286
|
async visitarExpressaoReferenciaFuncao(expressao) {
|
|
@@ -341,6 +349,9 @@ class InterpretadorBase {
|
|
|
341
349
|
*/
|
|
342
350
|
async resolverInterpolacoes(textoOriginal, linha) {
|
|
343
351
|
const variaveis = textoOriginal.match(this.regexInterpolacao);
|
|
352
|
+
if (!variaveis) {
|
|
353
|
+
return [];
|
|
354
|
+
}
|
|
344
355
|
return await Promise.all(variaveis.map(async (s) => {
|
|
345
356
|
const expressaoInterpolacao = s.replace(/[\$\{\}]*/gm, '');
|
|
346
357
|
const microLexador = this.microLexador.mapear(expressaoInterpolacao);
|
|
@@ -555,6 +566,9 @@ class InterpretadorBase {
|
|
|
555
566
|
}
|
|
556
567
|
throw new excecoes_1.ErroEmTempoDeExecucao(operador, 'Operadores precisam ser números.', operador.linha);
|
|
557
568
|
}
|
|
569
|
+
converterParaBigInt(valor) {
|
|
570
|
+
return typeof valor === 'bigint' ? valor : BigInt(Math.floor(Number(valor)));
|
|
571
|
+
}
|
|
558
572
|
async visitarExpressaoBinaria(expressao) {
|
|
559
573
|
const esquerda = await this.avaliar(expressao.esquerda);
|
|
560
574
|
const direita = await this.avaliar(expressao.direita);
|
|
@@ -566,7 +580,7 @@ class InterpretadorBase {
|
|
|
566
580
|
const nomeOperador = 'operador' + expressao.operador.lexema;
|
|
567
581
|
const metodoOperador = valorEsquerdo.classe.encontrarMetodo(nomeOperador);
|
|
568
582
|
if (metodoOperador) {
|
|
569
|
-
const
|
|
583
|
+
const metodoASerChamado = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
|
|
570
584
|
const argumentoOperador = direita && Object.prototype.hasOwnProperty.call(direita, 'tipo')
|
|
571
585
|
? direita
|
|
572
586
|
: {
|
|
@@ -574,7 +588,7 @@ class InterpretadorBase {
|
|
|
574
588
|
valor: valorDireito,
|
|
575
589
|
imutavel: false,
|
|
576
590
|
};
|
|
577
|
-
return await
|
|
591
|
+
return await metodoASerChamado.chamar(this, [{ nome: null, valor: argumentoOperador }]);
|
|
578
592
|
}
|
|
579
593
|
}
|
|
580
594
|
const tipoEsquerdo = esquerda?.hasOwnProperty('tipo')
|
|
@@ -588,13 +602,7 @@ class InterpretadorBase {
|
|
|
588
602
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
589
603
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
590
604
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
591
|
-
|
|
592
|
-
? valorEsquerdo
|
|
593
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
594
|
-
const dir = typeof valorDireito === 'bigint'
|
|
595
|
-
? valorDireito
|
|
596
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
597
|
-
return esq ** dir;
|
|
605
|
+
return this.converterParaBigInt(valorEsquerdo) ** this.converterParaBigInt(valorDireito);
|
|
598
606
|
}
|
|
599
607
|
const resultadoExponenciacao = Math.pow(valorEsquerdo, valorDireito);
|
|
600
608
|
return resultadoExponenciacao;
|
|
@@ -621,13 +629,7 @@ class InterpretadorBase {
|
|
|
621
629
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
622
630
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
623
631
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
624
|
-
|
|
625
|
-
? valorEsquerdo
|
|
626
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
627
|
-
const dir = typeof valorDireito === 'bigint'
|
|
628
|
-
? valorDireito
|
|
629
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
630
|
-
return esq - dir;
|
|
632
|
+
return this.converterParaBigInt(valorEsquerdo) - this.converterParaBigInt(valorDireito);
|
|
631
633
|
}
|
|
632
634
|
return Number(valorEsquerdo) - Number(valorDireito);
|
|
633
635
|
case delegua_1.default.ADICAO:
|
|
@@ -638,13 +640,13 @@ class InterpretadorBase {
|
|
|
638
640
|
}
|
|
639
641
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
640
642
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
641
|
-
const
|
|
643
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
642
644
|
? valorEsquerdo
|
|
643
645
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
644
|
-
const
|
|
646
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
645
647
|
? valorDireito
|
|
646
648
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
647
|
-
return
|
|
649
|
+
return valorResolvidoEsquerdo + valorResolvidoDireito;
|
|
648
650
|
}
|
|
649
651
|
if (this.tiposNumericos.includes(tipoEsquerdo) &&
|
|
650
652
|
this.tiposNumericos.includes(tipoDireito)) {
|
|
@@ -674,13 +676,13 @@ class InterpretadorBase {
|
|
|
674
676
|
}
|
|
675
677
|
// Retorna BigInt se qualquer operando for BigInt
|
|
676
678
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
677
|
-
const
|
|
679
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
678
680
|
? valorEsquerdo
|
|
679
681
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
680
|
-
const
|
|
682
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
681
683
|
? valorDireito
|
|
682
684
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
683
|
-
return
|
|
685
|
+
return valorResolvidoEsquerdo / valorResolvidoDireito; // Trunca automaticamente
|
|
684
686
|
}
|
|
685
687
|
return Math.floor(Number(valorEsquerdo) / Number(valorDireito));
|
|
686
688
|
case delegua_1.default.MULTIPLICACAO:
|
|
@@ -689,13 +691,13 @@ class InterpretadorBase {
|
|
|
689
691
|
if ((typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') &&
|
|
690
692
|
tipoEsquerdo !== delegua_2.default.TEXTO &&
|
|
691
693
|
tipoDireito !== delegua_2.default.TEXTO) {
|
|
692
|
-
const
|
|
694
|
+
const valorResolvidoEsquerdo = typeof valorEsquerdo === 'bigint'
|
|
693
695
|
? valorEsquerdo
|
|
694
696
|
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
695
|
-
const
|
|
697
|
+
const valorResolvidoDireito = typeof valorDireito === 'bigint'
|
|
696
698
|
? valorDireito
|
|
697
699
|
: BigInt(Math.floor(Number(valorDireito)));
|
|
698
|
-
return
|
|
700
|
+
return valorResolvidoEsquerdo * valorResolvidoDireito;
|
|
699
701
|
}
|
|
700
702
|
if (tipoEsquerdo === delegua_2.default.TEXTO ||
|
|
701
703
|
tipoDireito === delegua_2.default.TEXTO) {
|
|
@@ -742,13 +744,7 @@ class InterpretadorBase {
|
|
|
742
744
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
743
745
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
744
746
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
745
|
-
|
|
746
|
-
? valorEsquerdo
|
|
747
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
748
|
-
const dir = typeof valorDireito === 'bigint'
|
|
749
|
-
? valorDireito
|
|
750
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
751
|
-
return esq & dir;
|
|
747
|
+
return this.converterParaBigInt(valorEsquerdo) & this.converterParaBigInt(valorDireito);
|
|
752
748
|
}
|
|
753
749
|
return Number(valorEsquerdo) & Number(valorDireito);
|
|
754
750
|
case delegua_1.default.CIRCUMFLEXO:
|
|
@@ -758,13 +754,7 @@ class InterpretadorBase {
|
|
|
758
754
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
759
755
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
760
756
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
761
|
-
|
|
762
|
-
? valorEsquerdo
|
|
763
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
764
|
-
const dir = typeof valorDireito === 'bigint'
|
|
765
|
-
? valorDireito
|
|
766
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
767
|
-
return esq ^ dir;
|
|
757
|
+
return this.converterParaBigInt(valorEsquerdo) ^ this.converterParaBigInt(valorDireito);
|
|
768
758
|
}
|
|
769
759
|
return Number(valorEsquerdo) ^ Number(valorDireito);
|
|
770
760
|
case delegua_1.default.BIT_OR:
|
|
@@ -774,45 +764,21 @@ class InterpretadorBase {
|
|
|
774
764
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
775
765
|
// Auto-promove para BigInt se qualquer operando for BigInt
|
|
776
766
|
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint') {
|
|
777
|
-
|
|
778
|
-
? valorEsquerdo
|
|
779
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
780
|
-
const dir = typeof valorDireito === 'bigint'
|
|
781
|
-
? valorDireito
|
|
782
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
783
|
-
return esq | dir;
|
|
767
|
+
return this.converterParaBigInt(valorEsquerdo) | this.converterParaBigInt(valorDireito);
|
|
784
768
|
}
|
|
785
769
|
return Number(valorEsquerdo) | Number(valorDireito);
|
|
786
770
|
case delegua_1.default.MENOR_MENOR:
|
|
787
771
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
788
772
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
typeof valorDireito === 'bigint' ||
|
|
792
|
-
tamanhoDeslocamentoEsquerda >= 32) {
|
|
793
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
794
|
-
? valorEsquerdo
|
|
795
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
796
|
-
const dir = typeof valorDireito === 'bigint'
|
|
797
|
-
? valorDireito
|
|
798
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
799
|
-
return esq << dir;
|
|
773
|
+
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
|
|
774
|
+
return this.converterParaBigInt(valorEsquerdo) << this.converterParaBigInt(valorDireito);
|
|
800
775
|
}
|
|
801
776
|
return Number(valorEsquerdo) << Number(valorDireito);
|
|
802
777
|
case delegua_1.default.MAIOR_MAIOR:
|
|
803
778
|
this.verificarOperandosNumeros(expressao.operador, esquerda, direita);
|
|
804
779
|
// Auto-promove para BigInt (interno para longo) se qualquer operando for BigInt ou se deslocamento >= 32
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
typeof valorDireito === 'bigint' ||
|
|
808
|
-
tamanhoDeslocamentoDireita >= 32) {
|
|
809
|
-
const esq = typeof valorEsquerdo === 'bigint'
|
|
810
|
-
? valorEsquerdo
|
|
811
|
-
: BigInt(Math.floor(Number(valorEsquerdo)));
|
|
812
|
-
const dir = typeof valorDireito === 'bigint'
|
|
813
|
-
? valorDireito
|
|
814
|
-
: BigInt(Math.floor(Number(valorDireito)));
|
|
815
|
-
return esq >> dir;
|
|
780
|
+
if (typeof valorEsquerdo === 'bigint' || typeof valorDireito === 'bigint' || Number(valorDireito) >= 32) {
|
|
781
|
+
return this.converterParaBigInt(valorEsquerdo) >> this.converterParaBigInt(valorDireito);
|
|
816
782
|
}
|
|
817
783
|
return Number(valorEsquerdo) >> Number(valorDireito);
|
|
818
784
|
case delegua_1.default.DIFERENTE:
|
|
@@ -845,7 +811,7 @@ class InterpretadorBase {
|
|
|
845
811
|
: undefined;
|
|
846
812
|
let valor = await this.avaliar(variavelArgumento);
|
|
847
813
|
argumentos.push({
|
|
848
|
-
nome: nomeArgumento,
|
|
814
|
+
nome: nomeArgumento ?? null,
|
|
849
815
|
valor,
|
|
850
816
|
});
|
|
851
817
|
}
|
|
@@ -914,8 +880,8 @@ class InterpretadorBase {
|
|
|
914
880
|
// mesmo que esteja tudo certo com `DeleguaFuncao`,
|
|
915
881
|
// então precisamos testar o nome do construtor também.
|
|
916
882
|
if (entidadeChamada instanceof estruturas_1.Chamavel ||
|
|
917
|
-
entidadeChamada.constructor
|
|
918
|
-
entidadeChamada.constructor
|
|
883
|
+
entidadeChamada.constructor === estruturas_1.DeleguaFuncao ||
|
|
884
|
+
entidadeChamada.constructor === estruturas_1.MetodoPolimorfico) {
|
|
919
885
|
const retornoEntidadeChamada = await entidadeChamada.chamar(this, argumentos);
|
|
920
886
|
return retornoEntidadeChamada;
|
|
921
887
|
}
|
|
@@ -961,10 +927,6 @@ class InterpretadorBase {
|
|
|
961
927
|
indice = this.resolverValor(await this.avaliar(expressao.indice));
|
|
962
928
|
}
|
|
963
929
|
switch (expressao.alvo.constructor) {
|
|
964
|
-
case construtos_1.Variavel:
|
|
965
|
-
const alvoVariavel = expressao.alvo;
|
|
966
|
-
this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
|
|
967
|
-
break;
|
|
968
930
|
case construtos_1.AcessoMetodoOuPropriedade:
|
|
969
931
|
// Nunca será método aqui: apenas propriedade.
|
|
970
932
|
const alvoPropriedade = expressao.alvo;
|
|
@@ -976,8 +938,12 @@ class InterpretadorBase {
|
|
|
976
938
|
await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
|
|
977
939
|
}
|
|
978
940
|
break;
|
|
941
|
+
case construtos_1.Variavel:
|
|
942
|
+
const alvoVariavel = expressao.alvo;
|
|
943
|
+
this.pilhaEscoposExecucao.atribuirVariavel(alvoVariavel.simbolo, valorResolvido, indice);
|
|
944
|
+
break;
|
|
979
945
|
default:
|
|
980
|
-
throw new excecoes_1.ErroEmTempoDeExecucao(
|
|
946
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloOperador, `Atribuição com caso faltante: ${JSON.stringify(expressao)}.`);
|
|
981
947
|
}
|
|
982
948
|
return valorResolvido;
|
|
983
949
|
}
|
|
@@ -1069,10 +1035,10 @@ class InterpretadorBase {
|
|
|
1069
1035
|
const declaracaoInicializador = Array.isArray(declaracao.inicializador)
|
|
1070
1036
|
? declaracao.inicializador[0]
|
|
1071
1037
|
: declaracao.inicializador;
|
|
1072
|
-
if (declaracaoInicializador !== null) {
|
|
1038
|
+
if (declaracaoInicializador !== null && declaracaoInicializador !== undefined) {
|
|
1073
1039
|
await this.avaliar(declaracaoInicializador);
|
|
1074
1040
|
}
|
|
1075
|
-
let retornoExecucao;
|
|
1041
|
+
let retornoExecucao = undefined;
|
|
1076
1042
|
let iteracoes = 0;
|
|
1077
1043
|
while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra)) {
|
|
1078
1044
|
if (declaracao.condicao !== null &&
|
|
@@ -1086,7 +1052,7 @@ class InterpretadorBase {
|
|
|
1086
1052
|
return null;
|
|
1087
1053
|
}
|
|
1088
1054
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1089
|
-
retornoExecucao =
|
|
1055
|
+
retornoExecucao = undefined;
|
|
1090
1056
|
}
|
|
1091
1057
|
}
|
|
1092
1058
|
catch (erro) {
|
|
@@ -1097,15 +1063,19 @@ class InterpretadorBase {
|
|
|
1097
1063
|
});
|
|
1098
1064
|
return Promise.reject(erro);
|
|
1099
1065
|
}
|
|
1100
|
-
if (declaracao.incrementar
|
|
1066
|
+
if (declaracao.incrementar) {
|
|
1101
1067
|
await this.avaliar(declaracao.incrementar);
|
|
1102
1068
|
}
|
|
1103
1069
|
}
|
|
1104
1070
|
return retornoExecucao;
|
|
1105
1071
|
}
|
|
1106
|
-
|
|
1072
|
+
/**
|
|
1073
|
+
* Lógica de `para cada`, usada por Delégua, Pituguês, e Tenda.
|
|
1074
|
+
* @param {ParaCada} declaracao A declaração de `para cada` a ser executada.
|
|
1075
|
+
* @returns {Promise<any>} O resultado da execução da declaração.
|
|
1076
|
+
*/
|
|
1107
1077
|
async visitarDeclaracaoParaCada(declaracao) {
|
|
1108
|
-
let retornoExecucao;
|
|
1078
|
+
let retornoExecucao = undefined;
|
|
1109
1079
|
// Posição atual precisa ser reiniciada, pois pode estar dentro de outro
|
|
1110
1080
|
// laço de repetição.
|
|
1111
1081
|
declaracao.posicaoAtual = 0;
|
|
@@ -1143,7 +1113,7 @@ class InterpretadorBase {
|
|
|
1143
1113
|
return null;
|
|
1144
1114
|
}
|
|
1145
1115
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1146
|
-
retornoExecucao =
|
|
1116
|
+
retornoExecucao = undefined;
|
|
1147
1117
|
}
|
|
1148
1118
|
declaracao.posicaoAtual++;
|
|
1149
1119
|
}
|
|
@@ -1169,19 +1139,20 @@ class InterpretadorBase {
|
|
|
1169
1139
|
if (this.eVerdadeiro(avaliacaoCondicaoSe)) {
|
|
1170
1140
|
return await this.executar(declaracao.caminhoEntao);
|
|
1171
1141
|
}
|
|
1172
|
-
|
|
1173
|
-
|
|
1142
|
+
const declaracaoCaminhosSeSenao = declaracao.caminhosSeSenao || [];
|
|
1143
|
+
for (let i = 0; i < declaracaoCaminhosSeSenao.length; i++) {
|
|
1144
|
+
const atual = declaracaoCaminhosSeSenao[i];
|
|
1174
1145
|
if (this.eVerdadeiro(await this.avaliar(atual.condicao))) {
|
|
1175
1146
|
return await this.executar(atual.caminho);
|
|
1176
1147
|
}
|
|
1177
1148
|
}
|
|
1178
|
-
if (declaracao.caminhoSenao
|
|
1149
|
+
if (declaracao.caminhoSenao) {
|
|
1179
1150
|
return await this.executar(declaracao.caminhoSenao);
|
|
1180
1151
|
}
|
|
1181
1152
|
return null;
|
|
1182
1153
|
}
|
|
1183
1154
|
async visitarDeclaracaoEnquanto(declaracao) {
|
|
1184
|
-
let retornoExecucao;
|
|
1155
|
+
let retornoExecucao = undefined;
|
|
1185
1156
|
let iteracoes = 0;
|
|
1186
1157
|
while (!(retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.Quebra) &&
|
|
1187
1158
|
this.eVerdadeiro(await this.avaliar(declaracao.condicao))) {
|
|
@@ -1192,7 +1163,7 @@ class InterpretadorBase {
|
|
|
1192
1163
|
return null;
|
|
1193
1164
|
}
|
|
1194
1165
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1195
|
-
retornoExecucao =
|
|
1166
|
+
retornoExecucao = undefined;
|
|
1196
1167
|
}
|
|
1197
1168
|
}
|
|
1198
1169
|
catch (erro) {
|
|
@@ -1247,17 +1218,17 @@ class InterpretadorBase {
|
|
|
1247
1218
|
}
|
|
1248
1219
|
}
|
|
1249
1220
|
async visitarDeclaracaoFazer(declaracao) {
|
|
1250
|
-
let retornoExecucao;
|
|
1221
|
+
let retornoExecucao = undefined;
|
|
1251
1222
|
let iteracoes = 0;
|
|
1252
1223
|
do {
|
|
1253
1224
|
try {
|
|
1254
1225
|
await this.cederControle(++iteracoes);
|
|
1255
1226
|
retornoExecucao = await this.executar(declaracao.caminhoFazer);
|
|
1256
1227
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.SustarQuebra) {
|
|
1257
|
-
return
|
|
1228
|
+
return undefined;
|
|
1258
1229
|
}
|
|
1259
1230
|
if (retornoExecucao && retornoExecucao.valorRetornado instanceof quebras_1.ContinuarQuebra) {
|
|
1260
|
-
retornoExecucao =
|
|
1231
|
+
retornoExecucao = undefined;
|
|
1261
1232
|
}
|
|
1262
1233
|
}
|
|
1263
1234
|
catch (erro) {
|
|
@@ -1299,7 +1270,7 @@ class InterpretadorBase {
|
|
|
1299
1270
|
}
|
|
1300
1271
|
}
|
|
1301
1272
|
finally {
|
|
1302
|
-
if (declaracao.caminhoFinalmente
|
|
1273
|
+
if (declaracao.caminhoFinalmente)
|
|
1303
1274
|
valorRetorno = await this.executarBloco(declaracao.caminhoFinalmente);
|
|
1304
1275
|
this.emDeclaracaoTente = false;
|
|
1305
1276
|
}
|
|
@@ -1331,7 +1302,7 @@ class InterpretadorBase {
|
|
|
1331
1302
|
async visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
|
|
1332
1303
|
try {
|
|
1333
1304
|
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
1334
|
-
this.funcaoDeRetornoMesmaLinha(formatoTexto);
|
|
1305
|
+
this.funcaoDeRetornoMesmaLinha?.(formatoTexto);
|
|
1335
1306
|
return {
|
|
1336
1307
|
tipo: 'vazio',
|
|
1337
1308
|
tipoExplicito: false,
|
|
@@ -1354,7 +1325,7 @@ class InterpretadorBase {
|
|
|
1354
1325
|
async visitarDeclaracaoEscreva(declaracao) {
|
|
1355
1326
|
try {
|
|
1356
1327
|
const formatoTexto = await this.avaliarArgumentosEscreva(declaracao.argumentos);
|
|
1357
|
-
this.funcaoDeRetorno(formatoTexto);
|
|
1328
|
+
this.funcaoDeRetorno?.(formatoTexto);
|
|
1358
1329
|
return {
|
|
1359
1330
|
tipo: 'vazio',
|
|
1360
1331
|
tipoExplicito: false,
|
|
@@ -1398,7 +1369,7 @@ class InterpretadorBase {
|
|
|
1398
1369
|
}
|
|
1399
1370
|
async avaliacaoDeclaracaoVarOuConst(declaracao) {
|
|
1400
1371
|
let valorOuOutraVariavel = null;
|
|
1401
|
-
if (declaracao.inicializador
|
|
1372
|
+
if (declaracao.inicializador != null) {
|
|
1402
1373
|
valorOuOutraVariavel = await this.avaliar(declaracao.inicializador);
|
|
1403
1374
|
}
|
|
1404
1375
|
let valorFinal = null;
|
|
@@ -1427,16 +1398,16 @@ class InterpretadorBase {
|
|
|
1427
1398
|
*/
|
|
1428
1399
|
async visitarDeclaracaoConstMultiplo(declaracao) {
|
|
1429
1400
|
const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
|
|
1430
|
-
const tipoIndividual = declaracao.tipo.replace('[]', '');
|
|
1401
|
+
const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
|
|
1431
1402
|
for (let [indice, valor] of valoresFinais.entries()) {
|
|
1432
1403
|
this.pilhaEscoposExecucao.definirConstante(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
|
|
1433
1404
|
}
|
|
1434
1405
|
return null;
|
|
1435
1406
|
}
|
|
1436
|
-
visitarExpressaoContinua(
|
|
1407
|
+
visitarExpressaoContinua(_) {
|
|
1437
1408
|
return new quebras_1.ContinuarQuebra();
|
|
1438
1409
|
}
|
|
1439
|
-
visitarExpressaoSustar(
|
|
1410
|
+
visitarExpressaoSustar(_) {
|
|
1440
1411
|
return new quebras_1.SustarQuebra();
|
|
1441
1412
|
}
|
|
1442
1413
|
async visitarExpressaoRetornar(declaracao) {
|
|
@@ -1616,133 +1587,29 @@ class InterpretadorBase {
|
|
|
1616
1587
|
if (superClassesResolvidas.length > 0) {
|
|
1617
1588
|
this.pilhaEscoposExecucao.definirVariavel('super', superClassesResolvidas[0]);
|
|
1618
1589
|
}
|
|
1590
|
+
const descritorTipoClasse = this.resolverMetodoDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas);
|
|
1591
|
+
// TODO: Até então, a única exceção a isso é Égua Clássico.
|
|
1592
|
+
// Por enquanto, tudo bem deixar isso aqui.
|
|
1593
|
+
descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
|
|
1594
|
+
this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
|
|
1595
|
+
return descritorTipoClasse;
|
|
1596
|
+
}
|
|
1597
|
+
resolverMetodoDeClasse(declaracao, superClassesResolvidas, _mesclaResolvidas) {
|
|
1619
1598
|
const metodos = {};
|
|
1620
|
-
const
|
|
1621
|
-
const obtenedores = {};
|
|
1622
|
-
const definidores = {};
|
|
1623
|
-
const obtenedoresEstaticos = {};
|
|
1624
|
-
const definidoresEstaticos = {};
|
|
1625
|
-
const metodosAbstratos = [];
|
|
1626
|
-
const acessoMetodos = {};
|
|
1627
|
-
const acessoPropriedades = {};
|
|
1628
|
-
const definirMetodos = declaracao.metodos;
|
|
1629
|
-
for (let i = 0; i < declaracao.metodos.length; i++) {
|
|
1630
|
-
const metodoAtual = definirMetodos[i];
|
|
1599
|
+
for (const metodoAtual of declaracao.metodos) {
|
|
1631
1600
|
const nomeMetodo = metodoAtual.simbolo.lexema;
|
|
1632
|
-
// Registrar nível de acesso do método.
|
|
1633
|
-
if (metodoAtual.acesso && metodoAtual.acesso !== 'publico') {
|
|
1634
|
-
acessoMetodos[nomeMetodo] = metodoAtual.acesso;
|
|
1635
|
-
}
|
|
1636
|
-
// Métodos abstratos: registrar apenas o nome, não criar função executável.
|
|
1637
|
-
if (metodoAtual.abstrato) {
|
|
1638
|
-
metodosAbstratos.push(nomeMetodo);
|
|
1639
|
-
continue;
|
|
1640
|
-
}
|
|
1641
1601
|
const eInicializador = nomeMetodo === 'construtor';
|
|
1642
1602
|
const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
|
|
1643
1603
|
funcao.documentacao = metodoAtual.documentacao;
|
|
1644
|
-
|
|
1645
|
-
const ehEstatico = declaracao.classeEstatica ? !eInicializador : metodoAtual.estatico;
|
|
1646
|
-
if (metodoAtual.eObtenedor) {
|
|
1647
|
-
if (ehEstatico) {
|
|
1648
|
-
obtenedoresEstaticos[nomeMetodo] = funcao;
|
|
1649
|
-
}
|
|
1650
|
-
else {
|
|
1651
|
-
obtenedores[nomeMetodo] = funcao;
|
|
1652
|
-
}
|
|
1653
|
-
continue;
|
|
1654
|
-
}
|
|
1655
|
-
if (metodoAtual.eDefinidor) {
|
|
1656
|
-
if (ehEstatico) {
|
|
1657
|
-
definidoresEstaticos[nomeMetodo] = funcao;
|
|
1658
|
-
}
|
|
1659
|
-
else {
|
|
1660
|
-
definidores[nomeMetodo] = funcao;
|
|
1661
|
-
}
|
|
1662
|
-
continue;
|
|
1663
|
-
}
|
|
1664
|
-
const destino = ehEstatico && !eInicializador ? metodosEstaticos : metodos;
|
|
1665
|
-
if (destino[nomeMetodo]) {
|
|
1666
|
-
if (!Array.isArray(destino[nomeMetodo])) {
|
|
1667
|
-
destino[nomeMetodo] = [destino[nomeMetodo]];
|
|
1668
|
-
}
|
|
1669
|
-
destino[nomeMetodo].push(funcao);
|
|
1670
|
-
}
|
|
1671
|
-
else {
|
|
1672
|
-
destino[nomeMetodo] = funcao;
|
|
1673
|
-
}
|
|
1674
|
-
}
|
|
1675
|
-
// Registrar propriedades estáticas no mapa de membros estáticos e níveis de acesso.
|
|
1676
|
-
// Numa classe estática, todas as propriedades são tratadas como estáticas.
|
|
1677
|
-
const membrosEstaticos = {};
|
|
1678
|
-
for (const prop of declaracao.propriedades) {
|
|
1679
|
-
if (prop.estatico || declaracao.classeEstatica) {
|
|
1680
|
-
membrosEstaticos[prop.nome.lexema] = undefined;
|
|
1681
|
-
}
|
|
1682
|
-
if (prop.acesso && prop.acesso !== 'publico') {
|
|
1683
|
-
acessoPropriedades[prop.nome.lexema] = prop.acesso;
|
|
1684
|
-
}
|
|
1604
|
+
metodos[nomeMetodo] = funcao;
|
|
1685
1605
|
}
|
|
1686
1606
|
const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClassesResolvidas, metodos, declaracao.propriedades);
|
|
1687
|
-
descritorTipoClasse.metodosEstaticos = metodosEstaticos;
|
|
1688
|
-
descritorTipoClasse.membrosEstaticos = membrosEstaticos;
|
|
1689
|
-
descritorTipoClasse.obtenedores = obtenedores;
|
|
1690
|
-
descritorTipoClasse.definidores = definidores;
|
|
1691
|
-
descritorTipoClasse.obtenedoresEstaticos = obtenedoresEstaticos;
|
|
1692
|
-
descritorTipoClasse.definidoresEstaticos = definidoresEstaticos;
|
|
1693
|
-
descritorTipoClasse.abstrata = declaracao.abstrata;
|
|
1694
|
-
descritorTipoClasse.estrangeira = declaracao.estrangeira;
|
|
1695
|
-
descritorTipoClasse.classeEstatica = declaracao.classeEstatica;
|
|
1696
|
-
descritorTipoClasse.metodosAbstratos = metodosAbstratos;
|
|
1697
|
-
descritorTipoClasse.acessoMetodos = acessoMetodos;
|
|
1698
|
-
descritorTipoClasse.acessoPropriedades = acessoPropriedades;
|
|
1699
|
-
// Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
|
|
1700
|
-
// Isso só deve acontecer quando OBJETO_BASE já estiver inicializado e a classe
|
|
1701
|
-
// atual não for o próprio OBJETO_BASE, para evitar cadeias de herança recursivas.
|
|
1702
1607
|
if (descritorTipoClasse.superClasses.length === 0 &&
|
|
1703
1608
|
estruturas_1.OBJETO_BASE &&
|
|
1704
1609
|
descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
|
|
1705
1610
|
descritorTipoClasse.superClasses = [estruturas_1.OBJETO_BASE];
|
|
1706
1611
|
}
|
|
1707
|
-
// Calcular o OReM (linearização C3) após os pais estarem definidos.
|
|
1708
1612
|
descritorTipoClasse.orem = estruturas_1.DescritorTipoClasse.computarOReM(descritorTipoClasse);
|
|
1709
|
-
// Mesclar métodos e propriedades dos misturávels (primeiro misturável ganha se não definido na classe).
|
|
1710
|
-
for (const misturável of mesclaResolvidas) {
|
|
1711
|
-
for (const [nome, funcao] of Object.entries(misturável.metodos)) {
|
|
1712
|
-
if (!descritorTipoClasse.metodos.hasOwnProperty(nome)) {
|
|
1713
|
-
descritorTipoClasse.metodos[nome] = funcao;
|
|
1714
|
-
}
|
|
1715
|
-
}
|
|
1716
|
-
for (const [nome, funcao] of Object.entries(misturável.obtenedores)) {
|
|
1717
|
-
if (!descritorTipoClasse.obtenedores.hasOwnProperty(nome)) {
|
|
1718
|
-
descritorTipoClasse.obtenedores[nome] = funcao;
|
|
1719
|
-
}
|
|
1720
|
-
}
|
|
1721
|
-
for (const [nome, funcao] of Object.entries(misturável.definidores)) {
|
|
1722
|
-
if (!descritorTipoClasse.definidores.hasOwnProperty(nome)) {
|
|
1723
|
-
descritorTipoClasse.definidores[nome] = funcao;
|
|
1724
|
-
}
|
|
1725
|
-
}
|
|
1726
|
-
for (const prop of misturável.propriedades) {
|
|
1727
|
-
const jaDeclarada = descritorTipoClasse.propriedades.some((p) => p.nome.lexema === prop.nome.lexema);
|
|
1728
|
-
if (!jaDeclarada) {
|
|
1729
|
-
descritorTipoClasse.propriedades.push(prop);
|
|
1730
|
-
}
|
|
1731
|
-
}
|
|
1732
|
-
}
|
|
1733
|
-
// Verifica se a subclasse concreta implementa todos os métodos abstratos
|
|
1734
|
-
// da(s) superclasse(s) abstrata(s).
|
|
1735
|
-
if (!declaracao.abstrata && !declaracao.estrangeira) {
|
|
1736
|
-
for (const superClasse of superClassesResolvidas) {
|
|
1737
|
-
if (superClasse.abstrata || superClasse.estrangeira) {
|
|
1738
|
-
superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
|
|
1739
|
-
}
|
|
1740
|
-
}
|
|
1741
|
-
}
|
|
1742
|
-
// TODO: Até então, a única exceção a isso é Égua Clássico.
|
|
1743
|
-
// Por enquanto, tudo bem deixar isso aqui.
|
|
1744
|
-
descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
|
|
1745
|
-
this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
|
|
1746
1613
|
return descritorTipoClasse;
|
|
1747
1614
|
}
|
|
1748
1615
|
/**
|
|
@@ -1789,7 +1656,8 @@ class InterpretadorBase {
|
|
|
1789
1656
|
if (!this.extensoesGlobais.has(tipoNome)) {
|
|
1790
1657
|
this.extensoesGlobais.set(tipoNome, new Map());
|
|
1791
1658
|
}
|
|
1792
|
-
this.extensoesGlobais.get(tipoNome)
|
|
1659
|
+
const extensaoGlobal = this.extensoesGlobais.get(tipoNome);
|
|
1660
|
+
extensaoGlobal?.set(nomeMetodo, funcao);
|
|
1793
1661
|
}
|
|
1794
1662
|
else {
|
|
1795
1663
|
const hash = declaracao.hashArquivo;
|
|
@@ -1797,10 +1665,13 @@ class InterpretadorBase {
|
|
|
1797
1665
|
this.extensoesModulo.set(hash, new Map());
|
|
1798
1666
|
}
|
|
1799
1667
|
const mapa = this.extensoesModulo.get(hash);
|
|
1668
|
+
if (!mapa) {
|
|
1669
|
+
throw new excecoes_1.ErroEmTempoDeExecucao(declaracao.simboloTipo, 'Erro interno: mapa de extensões do módulo não encontrado.', declaracao.linha);
|
|
1670
|
+
}
|
|
1800
1671
|
if (!mapa.has(tipoNome)) {
|
|
1801
|
-
mapa
|
|
1672
|
+
mapa?.set(tipoNome, new Map());
|
|
1802
1673
|
}
|
|
1803
|
-
mapa.get(tipoNome)
|
|
1674
|
+
mapa.get(tipoNome)?.set(nomeMetodo, funcao);
|
|
1804
1675
|
}
|
|
1805
1676
|
}
|
|
1806
1677
|
}
|
|
@@ -1903,7 +1774,7 @@ class InterpretadorBase {
|
|
|
1903
1774
|
dicionario[chaveLogico] = this.resolverValor(promises[1]);
|
|
1904
1775
|
continue;
|
|
1905
1776
|
}
|
|
1906
|
-
dicionario[promises[0]] = this.resolverValor(promises[1]);
|
|
1777
|
+
dicionario[promises[0].toString()] = this.resolverValor(promises[1]);
|
|
1907
1778
|
}
|
|
1908
1779
|
}
|
|
1909
1780
|
return dicionario;
|
|
@@ -1946,7 +1817,7 @@ class InterpretadorBase {
|
|
|
1946
1817
|
*/
|
|
1947
1818
|
async visitarDeclaracaoVarMultiplo(declaracao) {
|
|
1948
1819
|
const valoresFinais = await this.avaliacaoDeclaracaoVarOuConst(declaracao);
|
|
1949
|
-
const tipoIndividual = declaracao.tipo.replace('[]', '');
|
|
1820
|
+
const tipoIndividual = (declaracao.tipo || '').replace('[]', '');
|
|
1950
1821
|
for (let [indice, valor] of valoresFinais.entries()) {
|
|
1951
1822
|
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolos[indice].lexema, valor, tipoIndividual);
|
|
1952
1823
|
}
|