@designliquido/delegua 0.54.2 → 0.54.4

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/umd/delegua.js CHANGED
@@ -257,13 +257,13 @@ const informacao_escopo_1 = require("./informacao-escopo");
257
257
  const informacao_elemento_sintatico_1 = require("../informacao-elemento-sintatico");
258
258
  const comum_1 = require("./comum");
259
259
  const montao_tipos_1 = require("./montao-tipos");
260
+ const elemento_montao_tipos_1 = require("./elemento-montao-tipos");
260
261
  const delegua_1 = __importDefault(require("../tipos-de-dados/delegua"));
261
262
  const delegua_2 = __importDefault(require("../tipos-de-simbolos/delegua"));
262
263
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
263
264
  const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
264
265
  const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
265
266
  const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-vetor"));
266
- const elemento_montao_tipos_1 = require("./elemento-montao-tipos");
267
267
  /**
268
268
  * O avaliador sintático (_Parser_) é responsável por transformar os símbolos do Lexador em estruturas de alto nível.
269
269
  * Essas estruturas de alto nível são as partes que executam lógica de programação de fato.
@@ -790,6 +790,9 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
790
790
  * @returns A entidade chamada resolvida, se as validações passarem.
791
791
  */
792
792
  resolverEntidadeChamada(entidadeChamada, argumentos, tipoPrimitiva = undefined) {
793
+ if (entidadeChamada.constructor === construtos_1.AcessoMetodoOuPropriedade) {
794
+ return this.resolverEntidadeChamadaAcessoMetodoOuPropriedade(entidadeChamada);
795
+ }
793
796
  if (entidadeChamada.constructor === construtos_1.Variavel) {
794
797
  const entidadeChamadaResolvidaVariavel = entidadeChamada;
795
798
  if (tipoPrimitiva === 'qualquer') {
@@ -822,9 +825,6 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
822
825
  }
823
826
  return new construtos_1.ArgumentoReferenciaFuncao(entidadeChamadaResolvidaVariavel.hashArquivo, entidadeChamadaResolvidaVariavel.linha, entidadeChamadaResolvidaVariavel.simbolo);
824
827
  }
825
- if (entidadeChamada.constructor === construtos_1.AcessoMetodoOuPropriedade) {
826
- return this.resolverEntidadeChamadaAcessoMetodoOuPropriedade(entidadeChamada);
827
- }
828
828
  return entidadeChamada;
829
829
  }
830
830
  finalizarChamada(entidadeChamada, tipoPrimitiva = undefined) {
@@ -1232,7 +1232,16 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1232
1232
  if (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.DE, delegua_2.default.EM)) {
1233
1233
  throw this.erro(this.simbolos[this.atual], "Esperado palavras reservadas 'em' ou 'de' após variável de iteração em instrução 'para cada'.");
1234
1234
  }
1235
- const vetor = this.expressao();
1235
+ let vetor = this.expressao();
1236
+ if (vetor.constructor === construtos_1.AcessoIndiceVariavel) {
1237
+ const construtoAcessoIndiceVariavel = vetor;
1238
+ if (construtoAcessoIndiceVariavel.entidadeChamada.tipo === 'dicionário') {
1239
+ // A avaliação sintática não deve verificar valores de dicionários.
1240
+ // Aqui se supõe que o programador sabe o que está fazendo.
1241
+ // TODO: Talvez pensar numa forma melhor de fazer isso.
1242
+ vetor.tipo = 'vetor';
1243
+ }
1244
+ }
1236
1245
  if (!vetor.hasOwnProperty('tipo')) {
1237
1246
  throw this.erro(simboloPara, `Variável ou constante em 'para cada' não parece possuir um tipo iterável.`);
1238
1247
  }
@@ -1553,7 +1562,8 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
1553
1562
  switch (entidadeChamadaChamada.constructor) {
1554
1563
  case construtos_1.AcessoMetodo:
1555
1564
  const entidadeChamadaAcessoMetodo = entidadeChamadaChamada;
1556
- return entidadeChamadaAcessoMetodo.tipoRetornoMetodo;
1565
+ const tipoRetornoAcessoMetodoResolvido = entidadeChamadaAcessoMetodo.tipoRetornoMetodo.replace('<T>', entidadeChamadaAcessoMetodo.objeto.tipo);
1566
+ return tipoRetornoAcessoMetodoResolvido;
1557
1567
  case construtos_1.AcessoMetodoOuPropriedade:
1558
1568
  // Este caso ocorre quando a variável/constante é do tipo 'qualquer',
1559
1569
  // e a chamada normalmente é feita para uma primitiva.
@@ -2178,8 +2188,8 @@ function logicaDescobertaRetornoFuncao(avaliadorSintatico, declaracoesDaFuncao,
2178
2188
  }
2179
2189
  function registrarPrimitiva(primitivasConhecidas, tipo, catalogoPrimitivas) {
2180
2190
  primitivasConhecidas[tipo] = {};
2181
- for (const [nomePrimitivaDicionario, dadosPrimitiva] of Object.entries(catalogoPrimitivas)) {
2182
- primitivasConhecidas[tipo][nomePrimitivaDicionario] = new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomePrimitivaDicionario, tipo, true, dadosPrimitiva.argumentos);
2191
+ for (const [nomePrimitiva, dadosPrimitiva] of Object.entries(catalogoPrimitivas)) {
2192
+ primitivasConhecidas[tipo][nomePrimitiva] = new informacao_elemento_sintatico_1.InformacaoElementoSintatico(nomePrimitiva, dadosPrimitiva.tipoRetorno, true, dadosPrimitiva.argumentos);
2183
2193
  }
2184
2194
  }
2185
2195
 
@@ -6317,7 +6327,7 @@ exports.default = {
6317
6327
  assinaturaFormato: `dicionário.remover(chave: qualquer)`,
6318
6328
  },
6319
6329
  valores: {
6320
- tipoRetorno: 'qualquer[]',
6330
+ tipoRetorno: '<T>[]',
6321
6331
  argumentos: [],
6322
6332
  implementacao: (interpretador, nomePrimitiva, valor) => {
6323
6333
  return Promise.resolve(Object.values(valor));
@@ -11288,7 +11298,7 @@ class InterpretadorBase {
11288
11298
  for (const elemento of interpolacoes) {
11289
11299
  // TODO: Há alguma chance de `elemento` ser `undefined` aqui?
11290
11300
  let valor = elemento === null || elemento === void 0 ? void 0 : elemento.valor;
11291
- if (valor.hasOwnProperty('valorRetornado')) {
11301
+ if (valor.hasOwnProperty && valor.hasOwnProperty('valorRetornado')) {
11292
11302
  valor = valor.valorRetornado;
11293
11303
  }
11294
11304
  if (valor.tipo === delegua_2.default.LOGICO) {
@@ -12541,6 +12551,7 @@ const estruturas_1 = require("./estruturas");
12541
12551
  const interpretador_base_1 = require("./interpretador-base");
12542
12552
  const inferenciador_1 = require("../inferenciador");
12543
12553
  const excecoes_1 = require("../excecoes");
12554
+ const declaracoes_1 = require("../declaracoes");
12544
12555
  const quebras_1 = require("../quebras");
12545
12556
  const montao_1 = require("./montao");
12546
12557
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
@@ -12582,17 +12593,19 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
12582
12593
  if (objeto instanceof quebras_1.RetornoQuebra) {
12583
12594
  return this.resolverValor(objeto.valor);
12584
12595
  }
12585
- if (objeto.hasOwnProperty && objeto.hasOwnProperty('valorRetornado')) {
12586
- return this.resolverValor(objeto.valorRetornado);
12587
- }
12588
- if (objeto.hasOwnProperty('valor')) {
12589
- if (Array.isArray(objeto.valor)) {
12590
- return this.resolverValor(objeto.valor);
12596
+ if (objeto.hasOwnProperty) {
12597
+ if (objeto.hasOwnProperty('valorRetornado')) {
12598
+ return this.resolverValor(objeto.valorRetornado);
12591
12599
  }
12592
- if (objeto.valor instanceof estruturas_1.ReferenciaMontao) {
12593
- return this.resolverReferenciaMontao(objeto.valor);
12600
+ if (objeto.hasOwnProperty('valor')) {
12601
+ if (Array.isArray(objeto.valor)) {
12602
+ return this.resolverValor(objeto.valor);
12603
+ }
12604
+ if (objeto.valor instanceof estruturas_1.ReferenciaMontao) {
12605
+ return this.resolverReferenciaMontao(objeto.valor);
12606
+ }
12607
+ return objeto.valor;
12594
12608
  }
12595
- return objeto.valor;
12596
12609
  }
12597
12610
  return objeto;
12598
12611
  }
@@ -12604,7 +12617,8 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
12604
12617
  }
12605
12618
  if (objeto.valor instanceof estruturas_1.ObjetoPadrao)
12606
12619
  return objeto.valor.paraTexto();
12607
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto instanceof estruturas_1.DeleguaFuncao)
12620
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
12621
+ objeto instanceof estruturas_1.DeleguaFuncao)
12608
12622
  return objeto.paraTexto();
12609
12623
  if (objeto instanceof quebras_1.RetornoQuebra) {
12610
12624
  if (typeof objeto.valor === 'boolean')
@@ -12642,7 +12656,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
12642
12656
  if (typeof valor === primitivos_1.default.BOOLEANO) {
12643
12657
  valor = valor ? 'verdadeiro' : 'falso';
12644
12658
  }
12645
- if (valor instanceof estruturas_1.ReferenciaMontao) {
12659
+ if (valor instanceof estruturas_1.ReferenciaMontao || ((valor === null || valor === void 0 ? void 0 : valor.hasOwnProperty) && (valor === null || valor === void 0 ? void 0 : valor.hasOwnProperty('tipo')))) {
12646
12660
  valor = this.resolverValor(valor);
12647
12661
  }
12648
12662
  objetoEscrita[propriedade] = valor;
@@ -13035,6 +13049,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13035
13049
  // Objeto simples do JavaScript, ou dicionário de Delégua.
13036
13050
  if (objeto.constructor === Object) {
13037
13051
  if (expressao.simbolo.lexema in primitivas_dicionario_1.default) {
13052
+ if (!(expressao.simbolo.lexema in primitivas_numero_1.default)) {
13053
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo dicionário.`);
13054
+ }
13038
13055
  const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.simbolo.lexema].implementacao;
13039
13056
  return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaDicionario);
13040
13057
  }
@@ -13056,12 +13073,18 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13056
13073
  case delegua_1.default.INTEIRO:
13057
13074
  case delegua_1.default.NUMERO:
13058
13075
  case delegua_1.default.NÚMERO:
13076
+ if (!(expressao.simbolo.lexema in primitivas_numero_1.default)) {
13077
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
13078
+ }
13059
13079
  const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.simbolo.lexema].implementacao;
13060
13080
  if (metodoDePrimitivaNumero) {
13061
13081
  return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaNumero);
13062
13082
  }
13063
13083
  break;
13064
13084
  case delegua_1.default.TEXTO:
13085
+ if (!(expressao.simbolo.lexema in primitivas_texto_1.default)) {
13086
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
13087
+ }
13065
13088
  const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema].implementacao;
13066
13089
  if (metodoDePrimitivaTexto) {
13067
13090
  return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTexto);
@@ -13075,6 +13098,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13075
13098
  case delegua_1.default.VETOR_NÚMERO:
13076
13099
  case delegua_1.default.VETOR_QUALQUER:
13077
13100
  case delegua_1.default.VETOR_TEXTO:
13101
+ if (!(expressao.simbolo.lexema in primitivas_vetor_1.default)) {
13102
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método de primitiva '${expressao.simbolo.lexema}' não existe para o tipo ${tipoObjeto}.`);
13103
+ }
13078
13104
  const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.simbolo.lexema].implementacao;
13079
13105
  if (metodoDePrimitivaVetor) {
13080
13106
  return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaVetor);
@@ -13326,41 +13352,42 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13326
13352
  }
13327
13353
  async visitarExpressaoTipoDe(expressao) {
13328
13354
  let valorTipoDe = expressao.valor;
13329
- switch (valorTipoDe.constructor.name) {
13330
- case 'AcessoIndiceVariavel':
13331
- case 'Agrupamento':
13332
- case 'Binario':
13333
- case 'Chamada':
13334
- case 'Dicionario':
13335
- case 'Unario':
13355
+ switch (valorTipoDe.constructor) {
13356
+ case construtos_1.AcessoIndiceVariavel:
13357
+ case construtos_1.Agrupamento:
13358
+ case construtos_1.Binario:
13359
+ case construtos_1.Chamada:
13360
+ case construtos_1.Dicionario:
13361
+ case construtos_1.Unario:
13336
13362
  valorTipoDe = await this.avaliar(valorTipoDe);
13337
13363
  if (valorTipoDe instanceof estruturas_1.ReferenciaMontao) {
13338
13364
  valorTipoDe = this.montao.obterReferencia(this.hashArquivoDeclaracaoAtual, this.linhaDeclaracaoAtual, valorTipoDe.endereco);
13339
13365
  }
13340
13366
  return valorTipoDe.tipo || (0, inferenciador_1.inferirTipoVariavel)(valorTipoDe);
13341
- case 'AcessoMetodo':
13367
+ case construtos_1.AcessoMetodo:
13342
13368
  const acessoMetodo = valorTipoDe;
13343
- return `método<${acessoMetodo.tipoRetornoMetodo}>`;
13344
- case 'AcessoPropriedade':
13369
+ const tipoRetornoMetodoResolvido = acessoMetodo.tipoRetornoMetodo.replace('<T>', acessoMetodo.objeto.tipo);
13370
+ return `método<${tipoRetornoMetodoResolvido}>`;
13371
+ case construtos_1.AcessoPropriedade:
13345
13372
  const acessoPropriedade = valorTipoDe;
13346
13373
  return acessoPropriedade.tipoRetornoPropriedade;
13347
- case 'AcessoMetodoOuPropriedade':
13374
+ case construtos_1.AcessoMetodoOuPropriedade:
13348
13375
  // TODO: Deve ser removido mais futuramente.
13349
13376
  // Apenas `AcessoMetodo` e `AcessoPropriedade` devem funcionar aqui.
13350
13377
  throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, 'Não deveria cair aqui.');
13351
- case 'Escreva':
13378
+ case declaracoes_1.Escreva:
13352
13379
  return 'função<vazio>';
13353
- case 'Leia':
13380
+ case construtos_1.Leia:
13354
13381
  return 'função<texto>';
13355
- case 'Literal':
13382
+ case construtos_1.Literal:
13356
13383
  const tipoLiteral = valorTipoDe;
13357
13384
  return tipoLiteral.tipo;
13358
- case 'TipoDe':
13385
+ case construtos_1.TipoDe:
13359
13386
  const alvoTipoDe = await this.avaliar(valorTipoDe);
13360
13387
  return `tipo de<${alvoTipoDe}>`;
13361
- case 'Variavel':
13388
+ case construtos_1.Variavel:
13362
13389
  return valorTipoDe.tipo;
13363
- case 'Vetor':
13390
+ case construtos_1.Vetor:
13364
13391
  const vetor = valorTipoDe;
13365
13392
  const apenasValores = vetor.valores.filter((v) => !['ComentarioComoConstruto', 'Separador'].includes(v.constructor.name));
13366
13393
  return (0, inferenciador_1.inferirTipoVariavel)(apenasValores);
@@ -13442,7 +13469,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
13442
13469
  }
13443
13470
  exports.Interpretador = Interpretador;
13444
13471
 
13445
- },{"../bibliotecas/primitivas-dicionario":20,"../bibliotecas/primitivas-numero":21,"../bibliotecas/primitivas-texto":22,"../bibliotecas/primitivas-vetor":23,"../construtos":49,"../excecoes":106,"../inferenciador":112,"../quebras":176,"../tipos-de-dados/delegua":177,"../tipos-de-dados/primitivos":179,"./estruturas":145,"./interpretador-base":152,"./montao":154}],154:[function(require,module,exports){
13472
+ },{"../bibliotecas/primitivas-dicionario":20,"../bibliotecas/primitivas-numero":21,"../bibliotecas/primitivas-texto":22,"../bibliotecas/primitivas-vetor":23,"../construtos":49,"../declaracoes":93,"../excecoes":106,"../inferenciador":112,"../quebras":176,"../tipos-de-dados/delegua":177,"../tipos-de-dados/primitivos":179,"./estruturas":145,"./interpretador-base":152,"./montao":154}],154:[function(require,module,exports){
13446
13473
  "use strict";
13447
13474
  Object.defineProperty(exports, "__esModule", { value: true });
13448
13475
  exports.Montao = void 0;