@designliquido/delegua 1.8.1 → 1.10.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-base.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico-base.js +6 -0
- package/analisador-semantico/analisador-semantico-base.js.map +1 -1
- package/analisador-semantico/analisador-semantico.d.ts +11 -3
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +96 -4
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts +18 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +582 -123
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +9 -2
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +83 -12
- package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
- package/bin/package.json +2 -2
- package/construtos/comentario-como-construto.js +1 -1
- package/construtos/comentario-como-construto.js.map +1 -1
- package/construtos/isto.d.ts +1 -0
- package/construtos/isto.d.ts.map +1 -1
- package/construtos/isto.js +1 -0
- package/construtos/isto.js.map +1 -1
- package/declaracoes/classe.d.ts +4 -1
- package/declaracoes/classe.d.ts.map +1 -1
- package/declaracoes/classe.js +4 -1
- package/declaracoes/classe.js.map +1 -1
- package/declaracoes/extensao.d.ts +13 -0
- package/declaracoes/extensao.d.ts.map +1 -0
- package/declaracoes/extensao.js +26 -0
- package/declaracoes/extensao.js.map +1 -0
- package/declaracoes/funcao.d.ts +8 -2
- package/declaracoes/funcao.d.ts.map +1 -1
- package/declaracoes/funcao.js +6 -1
- package/declaracoes/funcao.js.map +1 -1
- package/declaracoes/index.d.ts +2 -0
- package/declaracoes/index.d.ts.map +1 -1
- package/declaracoes/index.js +2 -0
- package/declaracoes/index.js.map +1 -1
- package/declaracoes/interface.d.ts +27 -0
- package/declaracoes/interface.d.ts.map +1 -0
- package/declaracoes/interface.js +45 -0
- package/declaracoes/interface.js.map +1 -0
- package/declaracoes/propriedade-classe.d.ts +7 -2
- package/declaracoes/propriedade-classe.d.ts.map +1 -1
- package/declaracoes/propriedade-classe.js +5 -1
- package/declaracoes/propriedade-classe.js.map +1 -1
- package/interfaces/interpretador-interface.d.ts +2 -0
- package/interfaces/interpretador-interface.d.ts.map +1 -1
- package/interfaces/visitante-delegua-interface.d.ts +3 -1
- package/interfaces/visitante-delegua-interface.d.ts.map +1 -1
- package/interpretador/comum.d.ts.map +1 -1
- package/interpretador/comum.js +45 -0
- package/interpretador/comum.js.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +1 -0
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +3 -2
- package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +1 -0
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +1 -0
- package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
- package/interpretador/dialetos/pitugues/comum.js +1 -1
- package/interpretador/dialetos/pitugues/comum.js.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +1 -0
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +1 -0
- package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
- package/interpretador/estruturas/delegua-funcao-nativa.d.ts +18 -0
- package/interpretador/estruturas/delegua-funcao-nativa.d.ts.map +1 -0
- package/interpretador/estruturas/delegua-funcao-nativa.js +43 -0
- package/interpretador/estruturas/delegua-funcao-nativa.js.map +1 -0
- package/interpretador/estruturas/delegua-funcao.d.ts +5 -3
- package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
- package/interpretador/estruturas/delegua-funcao.js +40 -3
- package/interpretador/estruturas/delegua-funcao.js.map +1 -1
- package/interpretador/estruturas/descritor-tipo-classe.d.ts +36 -0
- package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
- package/interpretador/estruturas/descritor-tipo-classe.js +85 -10
- package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
- package/interpretador/estruturas/index.d.ts +2 -0
- package/interpretador/estruturas/index.d.ts.map +1 -1
- package/interpretador/estruturas/index.js +2 -0
- package/interpretador/estruturas/index.js.map +1 -1
- package/interpretador/estruturas/objeto-base.d.ts +3 -0
- package/interpretador/estruturas/objeto-base.d.ts.map +1 -0
- package/interpretador/estruturas/objeto-base.js +71 -0
- package/interpretador/estruturas/objeto-base.js.map +1 -0
- package/interpretador/estruturas/objeto-delegua-classe.d.ts +4 -3
- package/interpretador/estruturas/objeto-delegua-classe.d.ts.map +1 -1
- package/interpretador/estruturas/objeto-delegua-classe.js +98 -6
- package/interpretador/estruturas/objeto-delegua-classe.js.map +1 -1
- package/interpretador/interpretador-base.d.ts +20 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +205 -25
- package/interpretador/interpretador-base.js.map +1 -1
- package/interpretador/interpretador.d.ts +2 -1
- package/interpretador/interpretador.d.ts.map +1 -1
- package/interpretador/interpretador.js +139 -17
- package/interpretador/interpretador.js.map +1 -1
- package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
- package/interpretador/pilha-escopos-execucao.js +5 -0
- package/interpretador/pilha-escopos-execucao.js.map +1 -1
- package/lexador/lexador.d.ts +6 -0
- package/lexador/lexador.d.ts.map +1 -1
- package/lexador/lexador.js +36 -1
- package/lexador/lexador.js.map +1 -1
- package/lexador/palavras-reservadas.d.ts +15 -0
- package/lexador/palavras-reservadas.d.ts.map +1 -1
- package/lexador/palavras-reservadas.js +15 -0
- package/lexador/palavras-reservadas.js.map +1 -1
- package/package.json +2 -2
- package/tipos-de-simbolos/delegua.d.ts +10 -0
- package/tipos-de-simbolos/delegua.d.ts.map +1 -1
- package/tipos-de-simbolos/delegua.js +10 -0
- package/tipos-de-simbolos/delegua.js.map +1 -1
- package/umd/delegua.js +2041 -591
|
@@ -32,11 +32,16 @@ const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-ve
|
|
|
32
32
|
class InterpretadorBase {
|
|
33
33
|
constructor(diretorioBase, performance = false, funcaoDeRetorno = null, funcaoDeRetornoMesmaLinha = null) {
|
|
34
34
|
this.resultadoInterpretador = [];
|
|
35
|
+
this.classeAtualEmExecucao = null;
|
|
35
36
|
this.funcaoDeRetorno = null;
|
|
36
37
|
this.funcaoDeRetornoMesmaLinha = null;
|
|
37
38
|
this.interfaceDeEntrada = null; // Originalmente é `readline.Interface`
|
|
38
39
|
this.interfaceEntradaSaida = null;
|
|
39
40
|
this.emDeclaracaoTente = false;
|
|
41
|
+
// typeName → methodName → DeleguaFuncao
|
|
42
|
+
this.extensoesGlobais = new Map();
|
|
43
|
+
// hashArquivo → typeName → methodName → DeleguaFuncao
|
|
44
|
+
this.extensoesModulo = new Map();
|
|
40
45
|
this.microLexador = new lexador_1.MicroLexador();
|
|
41
46
|
this.microAvaliadorSintatico = new avaliador_sintatico_1.MicroAvaliadorSintatico();
|
|
42
47
|
this.regexInterpolacao = /\${(.*?)}/g;
|
|
@@ -75,6 +80,8 @@ class InterpretadorBase {
|
|
|
75
80
|
emLacoRepeticao: false,
|
|
76
81
|
};
|
|
77
82
|
this.pilhaEscoposExecucao.empilhar(escopoExecucao);
|
|
83
|
+
// Registrar a classe base `Objeto` no escopo global.
|
|
84
|
+
this.pilhaEscoposExecucao.definirVariavel('Objeto', estruturas_1.OBJETO_BASE);
|
|
78
85
|
}
|
|
79
86
|
/**
|
|
80
87
|
* Cede o controle ao loop de eventos do JavaScript.
|
|
@@ -324,22 +331,43 @@ class InterpretadorBase {
|
|
|
324
331
|
*/
|
|
325
332
|
async resolverInterpolacoes(textoOriginal, linha) {
|
|
326
333
|
const variaveis = textoOriginal.match(this.regexInterpolacao);
|
|
327
|
-
|
|
334
|
+
return await Promise.all(variaveis.map(async (s) => {
|
|
335
|
+
var _a, _b, _c, _d;
|
|
328
336
|
const expressaoInterpolacao = s.replace(/[\$\{\}]*/gm, '');
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
resultadoMicroAvaliadorSintatico
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
337
|
+
const microLexador = this.microLexador.mapear(expressaoInterpolacao);
|
|
338
|
+
let declaracoes = [];
|
|
339
|
+
try {
|
|
340
|
+
const resultadoMicroAvaliadorSintatico = this.microAvaliadorSintatico.analisar(microLexador, linha);
|
|
341
|
+
for (const erro of resultadoMicroAvaliadorSintatico.erros) {
|
|
342
|
+
this.erros.push({
|
|
343
|
+
erroInterno: erro,
|
|
344
|
+
linha: (_a = erro.linha) !== null && _a !== void 0 ? _a : linha,
|
|
345
|
+
hashArquivo: (_b = erro.hashArquivo) !== null && _b !== void 0 ? _b : -1,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
declaracoes = resultadoMicroAvaliadorSintatico.declaracoes;
|
|
349
|
+
}
|
|
350
|
+
catch (erroAvaliador) {
|
|
351
|
+
this.erros.push({
|
|
352
|
+
erroInterno: erroAvaliador,
|
|
353
|
+
linha: (_c = erroAvaliador.linha) !== null && _c !== void 0 ? _c : linha,
|
|
354
|
+
hashArquivo: (_d = erroAvaliador.hashArquivo) !== null && _d !== void 0 ? _d : -1,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
let valor = declaracoes.length > 0 ? await this.avaliar(declaracoes[0]) : '';
|
|
358
|
+
const instancia = valor instanceof estruturas_1.ObjetoDeleguaClasse
|
|
359
|
+
? valor
|
|
360
|
+
: (valor === null || valor === void 0 ? void 0 : valor.valor) instanceof estruturas_1.ObjetoDeleguaClasse
|
|
361
|
+
? valor.valor
|
|
362
|
+
: null;
|
|
363
|
+
if (instancia) {
|
|
364
|
+
const metodoParaTexto = instancia.classe.encontrarMetodo('paraTexto');
|
|
365
|
+
if (metodoParaTexto) {
|
|
366
|
+
const funcaoBound = metodoParaTexto.funcaoPorMetodoDeClasse(instancia);
|
|
367
|
+
valor = await funcaoBound.chamar(this, []);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return { expressaoInterpolacao, valor };
|
|
343
371
|
}));
|
|
344
372
|
}
|
|
345
373
|
async visitarExpressaoLiteral(expressao) {
|
|
@@ -519,6 +547,23 @@ class InterpretadorBase {
|
|
|
519
547
|
const direita = await this.avaliar(expressao.direita);
|
|
520
548
|
const valorEsquerdo = this.resolverValor(esquerda);
|
|
521
549
|
const valorDireito = this.resolverValor(direita);
|
|
550
|
+
// Verificar sobrecarga de operador: se o operando esquerdo é uma instância de classe,
|
|
551
|
+
// procurar método `operador<símbolo>` (ex: `operador+`, `operador==`).
|
|
552
|
+
if (valorEsquerdo instanceof estruturas_1.ObjetoDeleguaClasse) {
|
|
553
|
+
const nomeOperador = 'operador' + expressao.operador.lexema;
|
|
554
|
+
const metodoOperador = valorEsquerdo.classe.encontrarMetodo(nomeOperador);
|
|
555
|
+
if (metodoOperador) {
|
|
556
|
+
const metodoBound = metodoOperador.funcaoPorMetodoDeClasse(valorEsquerdo);
|
|
557
|
+
const argumentoOperador = direita && Object.prototype.hasOwnProperty.call(direita, 'tipo')
|
|
558
|
+
? direita
|
|
559
|
+
: {
|
|
560
|
+
tipo: (0, inferenciador_1.inferirTipoVariavel)(valorDireito),
|
|
561
|
+
valor: valorDireito,
|
|
562
|
+
imutavel: false,
|
|
563
|
+
};
|
|
564
|
+
return await metodoBound.chamar(this, [{ nome: null, valor: argumentoOperador }]);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
522
567
|
const tipoEsquerdo = (esquerda === null || esquerda === void 0 ? void 0 : esquerda.hasOwnProperty('tipo'))
|
|
523
568
|
? esquerda.tipo
|
|
524
569
|
: (0, inferenciador_1.inferirTipoVariavel)(esquerda);
|
|
@@ -868,7 +913,7 @@ class InterpretadorBase {
|
|
|
868
913
|
const valor = await this.avaliar(expressao.valor);
|
|
869
914
|
if (objeto.constructor === estruturas_1.ObjetoDeleguaClasse) {
|
|
870
915
|
const objetoDeleguaClasse = objeto;
|
|
871
|
-
objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor);
|
|
916
|
+
await objetoDeleguaClasse.definir(alvoPropriedade.simbolo, valor, this);
|
|
872
917
|
}
|
|
873
918
|
break;
|
|
874
919
|
default:
|
|
@@ -1455,7 +1500,7 @@ class InterpretadorBase {
|
|
|
1455
1500
|
}
|
|
1456
1501
|
const valor = await this.avaliar(expressao.valor);
|
|
1457
1502
|
if (objeto.constructor === estruturas_1.ObjetoDeleguaClasse) {
|
|
1458
|
-
objeto.definir(expressao.nome, valor);
|
|
1503
|
+
await objeto.definir(expressao.nome, valor, this);
|
|
1459
1504
|
return valor;
|
|
1460
1505
|
}
|
|
1461
1506
|
if (objeto.constructor === Object) {
|
|
@@ -1464,6 +1509,7 @@ class InterpretadorBase {
|
|
|
1464
1509
|
}
|
|
1465
1510
|
visitarDeclaracaoDefinicaoFuncao(declaracao) {
|
|
1466
1511
|
const funcao = new estruturas_1.DeleguaFuncao(declaracao.simbolo.lexema, declaracao.funcao);
|
|
1512
|
+
funcao.documentacao = declaracao.documentacao;
|
|
1467
1513
|
this.pilhaEscoposExecucao.definirVariavel(declaracao.simbolo.lexema, funcao);
|
|
1468
1514
|
this.pilhaEscoposExecucao.registrarReferenciaFuncao(declaracao.id, funcao);
|
|
1469
1515
|
return Promise.resolve({
|
|
@@ -1491,29 +1537,163 @@ class InterpretadorBase {
|
|
|
1491
1537
|
this.pilhaEscoposExecucao.definirVariavel('super', superClasse);
|
|
1492
1538
|
}
|
|
1493
1539
|
const metodos = {};
|
|
1540
|
+
const metodosEstaticos = {};
|
|
1541
|
+
const obtenedores = {};
|
|
1542
|
+
const definidores = {};
|
|
1543
|
+
const obtenedoresEstaticos = {};
|
|
1544
|
+
const definidoresEstaticos = {};
|
|
1545
|
+
const metodosAbstratos = [];
|
|
1546
|
+
const acessoMetodos = {};
|
|
1547
|
+
const acessoPropriedades = {};
|
|
1494
1548
|
const definirMetodos = declaracao.metodos;
|
|
1495
1549
|
for (let i = 0; i < declaracao.metodos.length; i++) {
|
|
1496
1550
|
const metodoAtual = definirMetodos[i];
|
|
1497
|
-
const eInicializador = metodoAtual.simbolo.lexema === 'construtor';
|
|
1498
|
-
const funcao = new estruturas_1.DeleguaFuncao(metodoAtual.simbolo.lexema, metodoAtual.funcao, undefined, eInicializador);
|
|
1499
1551
|
const nomeMetodo = metodoAtual.simbolo.lexema;
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1552
|
+
// Registrar nível de acesso do método.
|
|
1553
|
+
if (metodoAtual.acesso && metodoAtual.acesso !== 'publico') {
|
|
1554
|
+
acessoMetodos[nomeMetodo] = metodoAtual.acesso;
|
|
1555
|
+
}
|
|
1556
|
+
// Métodos abstratos: registrar apenas o nome, não criar função executável.
|
|
1557
|
+
if (metodoAtual.abstrato) {
|
|
1558
|
+
metodosAbstratos.push(nomeMetodo);
|
|
1559
|
+
continue;
|
|
1560
|
+
}
|
|
1561
|
+
const eInicializador = nomeMetodo === 'construtor';
|
|
1562
|
+
const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoAtual.funcao, undefined, eInicializador);
|
|
1563
|
+
funcao.documentacao = metodoAtual.documentacao;
|
|
1564
|
+
// Numa classe estática, todos os métodos (exceto construtor) são estáticos.
|
|
1565
|
+
const ehEstatico = declaracao.classeEstatica
|
|
1566
|
+
? !eInicializador
|
|
1567
|
+
: metodoAtual.estatico;
|
|
1568
|
+
if (metodoAtual.eObtenedor) {
|
|
1569
|
+
if (ehEstatico) {
|
|
1570
|
+
obtenedoresEstaticos[nomeMetodo] = funcao;
|
|
1571
|
+
}
|
|
1572
|
+
else {
|
|
1573
|
+
obtenedores[nomeMetodo] = funcao;
|
|
1574
|
+
}
|
|
1575
|
+
continue;
|
|
1576
|
+
}
|
|
1577
|
+
if (metodoAtual.eDefinidor) {
|
|
1578
|
+
if (ehEstatico) {
|
|
1579
|
+
definidoresEstaticos[nomeMetodo] = funcao;
|
|
1580
|
+
}
|
|
1581
|
+
else {
|
|
1582
|
+
definidores[nomeMetodo] = funcao;
|
|
1583
|
+
}
|
|
1584
|
+
continue;
|
|
1585
|
+
}
|
|
1586
|
+
const destino = ehEstatico && !eInicializador ? metodosEstaticos : metodos;
|
|
1587
|
+
if (destino[nomeMetodo]) {
|
|
1588
|
+
if (!Array.isArray(destino[nomeMetodo])) {
|
|
1589
|
+
destino[nomeMetodo] = [destino[nomeMetodo]];
|
|
1503
1590
|
}
|
|
1504
|
-
|
|
1591
|
+
destino[nomeMetodo].push(funcao);
|
|
1505
1592
|
}
|
|
1506
1593
|
else {
|
|
1507
|
-
|
|
1594
|
+
destino[nomeMetodo] = funcao;
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
// Registrar propriedades estáticas no mapa de membros estáticos e níveis de acesso.
|
|
1598
|
+
// Numa classe estática, todas as propriedades são tratadas como estáticas.
|
|
1599
|
+
const membrosEstaticos = {};
|
|
1600
|
+
for (const prop of declaracao.propriedades) {
|
|
1601
|
+
if (prop.estatico || declaracao.classeEstatica) {
|
|
1602
|
+
membrosEstaticos[prop.nome.lexema] = undefined;
|
|
1603
|
+
}
|
|
1604
|
+
if (prop.acesso && prop.acesso !== 'publico') {
|
|
1605
|
+
acessoPropriedades[prop.nome.lexema] = prop.acesso;
|
|
1508
1606
|
}
|
|
1509
1607
|
}
|
|
1510
1608
|
const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClasse, metodos, declaracao.propriedades);
|
|
1609
|
+
descritorTipoClasse.metodosEstaticos = metodosEstaticos;
|
|
1610
|
+
descritorTipoClasse.membrosEstaticos = membrosEstaticos;
|
|
1611
|
+
descritorTipoClasse.obtenedores = obtenedores;
|
|
1612
|
+
descritorTipoClasse.definidores = definidores;
|
|
1613
|
+
descritorTipoClasse.obtenedoresEstaticos = obtenedoresEstaticos;
|
|
1614
|
+
descritorTipoClasse.definidoresEstaticos = definidoresEstaticos;
|
|
1615
|
+
descritorTipoClasse.abstrata = declaracao.abstrata;
|
|
1616
|
+
descritorTipoClasse.classeEstatica = declaracao.classeEstatica;
|
|
1617
|
+
descritorTipoClasse.metodosAbstratos = metodosAbstratos;
|
|
1618
|
+
descritorTipoClasse.acessoMetodos = acessoMetodos;
|
|
1619
|
+
descritorTipoClasse.acessoPropriedades = acessoPropriedades;
|
|
1620
|
+
// Toda classe sem superclasse explícita herda implicitamente de `Objeto`.
|
|
1621
|
+
// Isso só deve acontecer quando OBJETO_BASE já estiver inicializado e a classe
|
|
1622
|
+
// atual não for o próprio OBJETO_BASE, para evitar cadeias de herança recursivas.
|
|
1623
|
+
if (!descritorTipoClasse.superClasse && estruturas_1.OBJETO_BASE && descritorTipoClasse !== estruturas_1.OBJETO_BASE) {
|
|
1624
|
+
descritorTipoClasse.superClasse = estruturas_1.OBJETO_BASE;
|
|
1625
|
+
}
|
|
1626
|
+
// Verifica se a subclasse concreta implementa todos os métodos abstratos
|
|
1627
|
+
// da superclasse abstrata.
|
|
1628
|
+
if (!declaracao.abstrata && superClasse && superClasse.abstrata) {
|
|
1629
|
+
superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
|
|
1630
|
+
}
|
|
1511
1631
|
// TODO: Até então, a única exceção a isso é Égua Clássico.
|
|
1512
1632
|
// Por enquanto, tudo bem deixar isso aqui.
|
|
1513
1633
|
descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
|
|
1514
1634
|
this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
|
|
1515
1635
|
return descritorTipoClasse;
|
|
1516
1636
|
}
|
|
1637
|
+
/**
|
|
1638
|
+
* Registra uma declaração de interface no ambiente de execução.
|
|
1639
|
+
* Interfaces são verificadas em tempo de análise; em tempo de execução, apenas registramos
|
|
1640
|
+
* o nome para possíveis verificações futuras (ex: `eInstanciaDe`).
|
|
1641
|
+
*/
|
|
1642
|
+
async visitarDeclaracaoInterface(_declaracao) {
|
|
1643
|
+
// Interfaces não possuem comportamento em tempo de execução.
|
|
1644
|
+
// São contratos verificados em tempo de análise sintática.
|
|
1645
|
+
return Promise.resolve();
|
|
1646
|
+
}
|
|
1647
|
+
/**
|
|
1648
|
+
* Procura um método de extensão nos registros de módulo e global,
|
|
1649
|
+
* percorrendo os tipos na ordem indicada (específico antes de base).
|
|
1650
|
+
*/
|
|
1651
|
+
encontrarMetodoExtensao(tiposParaVerificar, nomeMetodo, hashArquivo) {
|
|
1652
|
+
var _a, _b;
|
|
1653
|
+
// Extensões module-scoped têm prioridade sobre as globais.
|
|
1654
|
+
const extensoesDoModulo = this.extensoesModulo.get(hashArquivo);
|
|
1655
|
+
if (extensoesDoModulo) {
|
|
1656
|
+
for (const tipo of tiposParaVerificar) {
|
|
1657
|
+
const metodo = (_a = extensoesDoModulo.get(tipo)) === null || _a === void 0 ? void 0 : _a.get(nomeMetodo);
|
|
1658
|
+
if (metodo)
|
|
1659
|
+
return metodo;
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
for (const tipo of tiposParaVerificar) {
|
|
1663
|
+
const metodo = (_b = this.extensoesGlobais.get(tipo)) === null || _b === void 0 ? void 0 : _b.get(nomeMetodo);
|
|
1664
|
+
if (metodo)
|
|
1665
|
+
return metodo;
|
|
1666
|
+
}
|
|
1667
|
+
return undefined;
|
|
1668
|
+
}
|
|
1669
|
+
/**
|
|
1670
|
+
* Registra os métodos de uma declaração de extensão nos registros
|
|
1671
|
+
* de extensão do interpretador.
|
|
1672
|
+
*/
|
|
1673
|
+
async visitarDeclaracaoExtensao(declaracao) {
|
|
1674
|
+
const tipoNome = declaracao.simboloTipo.lexema;
|
|
1675
|
+
for (const metodoDeclarado of declaracao.metodos) {
|
|
1676
|
+
const nomeMetodo = metodoDeclarado.simbolo.lexema;
|
|
1677
|
+
const funcao = new estruturas_1.DeleguaFuncao(nomeMetodo, metodoDeclarado.funcao);
|
|
1678
|
+
if (declaracao.ehGlobal) {
|
|
1679
|
+
if (!this.extensoesGlobais.has(tipoNome)) {
|
|
1680
|
+
this.extensoesGlobais.set(tipoNome, new Map());
|
|
1681
|
+
}
|
|
1682
|
+
this.extensoesGlobais.get(tipoNome).set(nomeMetodo, funcao);
|
|
1683
|
+
}
|
|
1684
|
+
else {
|
|
1685
|
+
const hash = declaracao.hashArquivo;
|
|
1686
|
+
if (!this.extensoesModulo.has(hash)) {
|
|
1687
|
+
this.extensoesModulo.set(hash, new Map());
|
|
1688
|
+
}
|
|
1689
|
+
const mapa = this.extensoesModulo.get(hash);
|
|
1690
|
+
if (!mapa.has(tipoNome)) {
|
|
1691
|
+
mapa.set(tipoNome, new Map());
|
|
1692
|
+
}
|
|
1693
|
+
mapa.get(tipoNome).set(nomeMetodo, funcao);
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
}
|
|
1517
1697
|
/**
|
|
1518
1698
|
* Executa um acesso a método, normalmente de um objeto de classe.
|
|
1519
1699
|
* @param {AcessoMetodoOuPropriedade} expressao A expressão de acesso.
|
|
@@ -1534,7 +1714,7 @@ class InterpretadorBase {
|
|
|
1534
1714
|
// então testamos também o nome do construtor.
|
|
1535
1715
|
if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
|
|
1536
1716
|
objeto.constructor.name === 'ObjetoDeleguaClasse') {
|
|
1537
|
-
const valor = objeto.obter(expressao.simbolo);
|
|
1717
|
+
const valor = await objeto.obter(expressao.simbolo, this);
|
|
1538
1718
|
if (valor === 0)
|
|
1539
1719
|
return 0;
|
|
1540
1720
|
return valor || null;
|