@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.
Files changed (116) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico-base.js +6 -0
  3. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  4. package/analisador-semantico/analisador-semantico.d.ts +11 -3
  5. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  6. package/analisador-semantico/analisador-semantico.js +96 -4
  7. package/analisador-semantico/analisador-semantico.js.map +1 -1
  8. package/avaliador-sintatico/avaliador-sintatico.d.ts +18 -1
  9. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  10. package/avaliador-sintatico/avaliador-sintatico.js +582 -123
  11. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  12. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts +9 -2
  13. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.d.ts.map +1 -1
  14. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +83 -12
  15. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  16. package/bin/package.json +2 -2
  17. package/construtos/comentario-como-construto.js +1 -1
  18. package/construtos/comentario-como-construto.js.map +1 -1
  19. package/construtos/isto.d.ts +1 -0
  20. package/construtos/isto.d.ts.map +1 -1
  21. package/construtos/isto.js +1 -0
  22. package/construtos/isto.js.map +1 -1
  23. package/declaracoes/classe.d.ts +4 -1
  24. package/declaracoes/classe.d.ts.map +1 -1
  25. package/declaracoes/classe.js +4 -1
  26. package/declaracoes/classe.js.map +1 -1
  27. package/declaracoes/extensao.d.ts +13 -0
  28. package/declaracoes/extensao.d.ts.map +1 -0
  29. package/declaracoes/extensao.js +26 -0
  30. package/declaracoes/extensao.js.map +1 -0
  31. package/declaracoes/funcao.d.ts +8 -2
  32. package/declaracoes/funcao.d.ts.map +1 -1
  33. package/declaracoes/funcao.js +6 -1
  34. package/declaracoes/funcao.js.map +1 -1
  35. package/declaracoes/index.d.ts +2 -0
  36. package/declaracoes/index.d.ts.map +1 -1
  37. package/declaracoes/index.js +2 -0
  38. package/declaracoes/index.js.map +1 -1
  39. package/declaracoes/interface.d.ts +27 -0
  40. package/declaracoes/interface.d.ts.map +1 -0
  41. package/declaracoes/interface.js +45 -0
  42. package/declaracoes/interface.js.map +1 -0
  43. package/declaracoes/propriedade-classe.d.ts +7 -2
  44. package/declaracoes/propriedade-classe.d.ts.map +1 -1
  45. package/declaracoes/propriedade-classe.js +5 -1
  46. package/declaracoes/propriedade-classe.js.map +1 -1
  47. package/interfaces/interpretador-interface.d.ts +2 -0
  48. package/interfaces/interpretador-interface.d.ts.map +1 -1
  49. package/interfaces/visitante-delegua-interface.d.ts +3 -1
  50. package/interfaces/visitante-delegua-interface.d.ts.map +1 -1
  51. package/interpretador/comum.d.ts.map +1 -1
  52. package/interpretador/comum.js +45 -0
  53. package/interpretador/comum.js.map +1 -1
  54. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts +1 -0
  55. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.d.ts.map +1 -1
  56. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js +3 -2
  57. package/interpretador/dialetos/egua-classico/interpretador-egua-classico.js.map +1 -1
  58. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts +1 -0
  59. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.d.ts.map +1 -1
  60. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js +1 -0
  61. package/interpretador/dialetos/egua-classico/resolvedor/resolvedor.js.map +1 -1
  62. package/interpretador/dialetos/pitugues/comum.js +1 -1
  63. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  64. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts +1 -0
  65. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.d.ts.map +1 -1
  66. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js +1 -0
  67. package/interpretador/dialetos/portugol-ipt/interpretador-portugol-ipt.js.map +1 -1
  68. package/interpretador/estruturas/delegua-funcao-nativa.d.ts +18 -0
  69. package/interpretador/estruturas/delegua-funcao-nativa.d.ts.map +1 -0
  70. package/interpretador/estruturas/delegua-funcao-nativa.js +43 -0
  71. package/interpretador/estruturas/delegua-funcao-nativa.js.map +1 -0
  72. package/interpretador/estruturas/delegua-funcao.d.ts +5 -3
  73. package/interpretador/estruturas/delegua-funcao.d.ts.map +1 -1
  74. package/interpretador/estruturas/delegua-funcao.js +40 -3
  75. package/interpretador/estruturas/delegua-funcao.js.map +1 -1
  76. package/interpretador/estruturas/descritor-tipo-classe.d.ts +36 -0
  77. package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
  78. package/interpretador/estruturas/descritor-tipo-classe.js +85 -10
  79. package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
  80. package/interpretador/estruturas/index.d.ts +2 -0
  81. package/interpretador/estruturas/index.d.ts.map +1 -1
  82. package/interpretador/estruturas/index.js +2 -0
  83. package/interpretador/estruturas/index.js.map +1 -1
  84. package/interpretador/estruturas/objeto-base.d.ts +3 -0
  85. package/interpretador/estruturas/objeto-base.d.ts.map +1 -0
  86. package/interpretador/estruturas/objeto-base.js +71 -0
  87. package/interpretador/estruturas/objeto-base.js.map +1 -0
  88. package/interpretador/estruturas/objeto-delegua-classe.d.ts +4 -3
  89. package/interpretador/estruturas/objeto-delegua-classe.d.ts.map +1 -1
  90. package/interpretador/estruturas/objeto-delegua-classe.js +98 -6
  91. package/interpretador/estruturas/objeto-delegua-classe.js.map +1 -1
  92. package/interpretador/interpretador-base.d.ts +20 -1
  93. package/interpretador/interpretador-base.d.ts.map +1 -1
  94. package/interpretador/interpretador-base.js +205 -25
  95. package/interpretador/interpretador-base.js.map +1 -1
  96. package/interpretador/interpretador.d.ts +2 -1
  97. package/interpretador/interpretador.d.ts.map +1 -1
  98. package/interpretador/interpretador.js +139 -17
  99. package/interpretador/interpretador.js.map +1 -1
  100. package/interpretador/pilha-escopos-execucao.d.ts.map +1 -1
  101. package/interpretador/pilha-escopos-execucao.js +5 -0
  102. package/interpretador/pilha-escopos-execucao.js.map +1 -1
  103. package/lexador/lexador.d.ts +6 -0
  104. package/lexador/lexador.d.ts.map +1 -1
  105. package/lexador/lexador.js +36 -1
  106. package/lexador/lexador.js.map +1 -1
  107. package/lexador/palavras-reservadas.d.ts +15 -0
  108. package/lexador/palavras-reservadas.d.ts.map +1 -1
  109. package/lexador/palavras-reservadas.js +15 -0
  110. package/lexador/palavras-reservadas.js.map +1 -1
  111. package/package.json +2 -2
  112. package/tipos-de-simbolos/delegua.d.ts +10 -0
  113. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  114. package/tipos-de-simbolos/delegua.js +10 -0
  115. package/tipos-de-simbolos/delegua.js.map +1 -1
  116. 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
- let resultadosAvaliacaoSintatica = variaveis.map((s) => {
334
+ return await Promise.all(variaveis.map(async (s) => {
335
+ var _a, _b, _c, _d;
328
336
  const expressaoInterpolacao = s.replace(/[\$\{\}]*/gm, '');
329
- let microLexador = this.microLexador.mapear(expressaoInterpolacao);
330
- const resultadoMicroAvaliadorSintatico = this.microAvaliadorSintatico.analisar(microLexador, linha);
331
- return {
332
- expressaoInterpolacao,
333
- resultadoMicroAvaliadorSintatico,
334
- };
335
- });
336
- // TODO: Verificar erros do `resultadosAvaliacaoSintatica`.
337
- const resolucoesPromises = await Promise.all(resultadosAvaliacaoSintatica
338
- .flatMap((r) => r.resultadoMicroAvaliadorSintatico.declaracoes)
339
- .map((d) => this.avaliar(d)));
340
- return resolucoesPromises.map((item, indice) => ({
341
- expressaoInterpolacao: resultadosAvaliacaoSintatica[indice].expressaoInterpolacao,
342
- valor: item,
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
- if (metodos[nomeMetodo]) {
1501
- if (!Array.isArray(metodos[nomeMetodo])) {
1502
- metodos[nomeMetodo] = [metodos[nomeMetodo]];
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
- metodos[nomeMetodo].push(funcao);
1591
+ destino[nomeMetodo].push(funcao);
1505
1592
  }
1506
1593
  else {
1507
- metodos[nomeMetodo] = funcao;
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;