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