@designliquido/delegua 0.41.3 → 0.41.5

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
@@ -274,14 +274,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
274
274
  this.performance = performance;
275
275
  this.tiposDefinidosEmCodigo = {};
276
276
  this.tiposDeFerramentasExternas = {};
277
- this.primitivasConhecidas = [
278
- ...Object.keys(primitivas_dicionario_1.default),
279
- ...Object.keys(primitivas_numero_1.default),
280
- ...Object.keys(primitivas_texto_1.default),
281
- ...Object.keys(primitivas_vetor_1.default),
282
- 'inteiro',
283
- 'texto',
284
- ];
277
+ this.primitivasConhecidas = {};
278
+ for (const nomePrimitivaDicionario of Object.keys(primitivas_dicionario_1.default)) {
279
+ this.primitivasConhecidas[nomePrimitivaDicionario] = 'dicionário';
280
+ }
281
+ for (const nomePrimitivaNumero of Object.keys(primitivas_numero_1.default)) {
282
+ this.primitivasConhecidas[nomePrimitivaNumero] = 'número';
283
+ }
284
+ for (const nomePrimitivaTexto of Object.keys(primitivas_texto_1.default)) {
285
+ this.primitivasConhecidas[nomePrimitivaTexto] = 'texto';
286
+ }
287
+ for (const nomePrimitivaVetor of Object.keys(primitivas_vetor_1.default)) {
288
+ this.primitivasConhecidas[nomePrimitivaVetor] = 'vetor';
289
+ }
290
+ this.primitivasConhecidas['inteiro'] = 'inteiro';
291
+ this.primitivasConhecidas['texto'] = 'texto';
285
292
  this.pilhaEscopos = new pilha_escopos_1.PilhaEscopos();
286
293
  }
287
294
  verificarDefinicaoTipoAtual() {
@@ -603,7 +610,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
603
610
  resolverEntidadeChamada(entidadeChamada) {
604
611
  if (entidadeChamada.constructor.name === 'Variavel') {
605
612
  const entidadeChamadaResolvidaVariavel = entidadeChamada;
606
- if (this.primitivasConhecidas.includes(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
613
+ if (this.primitivasConhecidas.hasOwnProperty(entidadeChamadaResolvidaVariavel.simbolo.lexema)) {
607
614
  return entidadeChamadaResolvidaVariavel;
608
615
  }
609
616
  if (entidadeChamadaResolvidaVariavel.simbolo.lexema in this.tiposDefinidosEmCodigo) {
@@ -8092,15 +8099,14 @@ const espaco_variaveis_1 = require("../espaco-variaveis");
8092
8099
  const comum_1 = require("./comum");
8093
8100
  const excecoes_1 = require("../excecoes");
8094
8101
  const primitivas_dicionario_1 = __importDefault(require("../bibliotecas/primitivas-dicionario"));
8095
- const primitivas_numero_1 = __importDefault(require("../bibliotecas/primitivas-numero"));
8096
- const primitivas_texto_1 = __importDefault(require("../bibliotecas/primitivas-texto"));
8097
- const primitivas_vetor_1 = __importDefault(require("../bibliotecas/primitivas-vetor"));
8098
8102
  const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
8099
8103
  const primitivos_1 = __importDefault(require("../tipos-de-dados/primitivos"));
8100
8104
  const delegua_2 = __importDefault(require("../tipos-de-dados/delegua"));
8101
8105
  /**
8102
8106
  * O Interpretador visita todos os elementos complexos gerados pelo avaliador sintático (_parser_),
8103
- * e de fato executa a lógica de programação descrita no código.
8107
+ * e de fato executa a lógica de programação descrita no código. Este interpretador base é usado
8108
+ * por Delégua e todos os seus dialetos, contendo somente os pontos em comum entre todas as
8109
+ * linguagens.
8104
8110
  *
8105
8111
  * O Interpretador Base não contém dependências com o Node.js. É
8106
8112
  * recomendado para uso em execuções que ocorrem no navegador de internet.
@@ -9158,13 +9164,10 @@ class InterpretadorBase {
9158
9164
  metodos[metodoAtual.simbolo.lexema] = funcao;
9159
9165
  }
9160
9166
  const descritorTipoClasse = new estruturas_1.DescritorTipoClasse(declaracao.simbolo, superClasse, metodos, declaracao.propriedades);
9167
+ // TODO: Mover para Potigol, que é o único dialeto que realmente usa isso.
9161
9168
  descritorTipoClasse.dialetoRequerExpansaoPropriedadesEspacoVariaveis =
9162
9169
  this.expandirPropriedadesDeObjetosEmEspacoVariaveis;
9163
9170
  descritorTipoClasse.dialetoRequerDeclaracaoPropriedades = this.requerDeclaracaoPropriedades;
9164
- // TODO: Recolocar isso se for necessário.
9165
- /* if (superClasse !== null) {
9166
- this.ambiente = this.ambiente.enclosing;
9167
- } */
9168
9171
  this.pilhaEscoposExecucao.atribuirVariavel(declaracao.simbolo, descritorTipoClasse);
9169
9172
  return null;
9170
9173
  }
@@ -9219,35 +9222,7 @@ class InterpretadorBase {
9219
9222
  if (tipoObjeto === null || tipoObjeto === undefined) {
9220
9223
  tipoObjeto = (0, inferenciador_1.inferirTipoVariavel)(variavelObjeto);
9221
9224
  }
9222
- // Como internamente um dicionário de Delégua é simplesmente um objeto de
9223
- // JavaScript, as primitivas de dicionário, especificamente, são tratadas
9224
- // mais acima.
9225
- switch (tipoObjeto) {
9226
- case delegua_2.default.INTEIRO:
9227
- case delegua_2.default.NUMERO:
9228
- case delegua_2.default.NÚMERO:
9229
- const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.simbolo.lexema].implementacao;
9230
- if (metodoDePrimitivaNumero) {
9231
- return new metodo_primitiva_1.MetodoPrimitiva(objeto, metodoDePrimitivaNumero);
9232
- }
9233
- break;
9234
- case delegua_2.default.TEXTO:
9235
- const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema].implementacao;
9236
- if (metodoDePrimitivaTexto) {
9237
- return new metodo_primitiva_1.MetodoPrimitiva(objeto, metodoDePrimitivaTexto);
9238
- }
9239
- break;
9240
- case delegua_2.default.VETOR:
9241
- case delegua_2.default.VETOR_NUMERO:
9242
- case delegua_2.default.VETOR_NÚMERO:
9243
- case delegua_2.default.VETOR_TEXTO:
9244
- const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.simbolo.lexema].implementacao;
9245
- if (metodoDePrimitivaVetor) {
9246
- return new metodo_primitiva_1.MetodoPrimitiva(objeto, metodoDePrimitivaVetor);
9247
- }
9248
- break;
9249
- }
9250
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método para objeto ou primitiva não encontrado: ${expressao.simbolo.lexema}.`, expressao.linha));
9225
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método ou propriedade para objeto não encontrado: ${expressao.simbolo.lexema}.`, expressao.linha));
9251
9226
  }
9252
9227
  visitarExpressaoIsto(expressao) {
9253
9228
  return this.procurarVariavel(expressao.palavraChave);
@@ -9375,6 +9350,7 @@ class InterpretadorBase {
9375
9350
  async executar(declaracao, mostrarResultado = false) {
9376
9351
  const resultado = await declaracao.aceitar(this);
9377
9352
  /* console.log("Resultado aceitar: " + resultado, this); */
9353
+ // TODO: Mover a lógica abaixo para `delegua-node`.
9378
9354
  if (mostrarResultado) {
9379
9355
  this.funcaoDeRetorno(this.paraTexto(resultado));
9380
9356
  }
@@ -9470,7 +9446,7 @@ class InterpretadorBase {
9470
9446
  exports.InterpretadorBase = InterpretadorBase;
9471
9447
 
9472
9448
  }).call(this)}).call(this,require('_process'))
9473
- },{"../avaliador-sintatico":8,"../bibliotecas/primitivas-dicionario":16,"../bibliotecas/primitivas-numero":17,"../bibliotecas/primitivas-texto":18,"../bibliotecas/primitivas-vetor":19,"../construtos":42,"../espaco-variaveis":97,"../excecoes":99,"../inferenciador":105,"../lexador":152,"../quebras":159,"../tipos-de-dados/delegua":160,"../tipos-de-dados/primitivos":161,"../tipos-de-simbolos/delegua":163,"./comum":128,"./estruturas":134,"./estruturas/metodo-primitiva":135,"./pilha-escopos-execucao":143,"_process":383,"browser-process-hrtime":340}],141:[function(require,module,exports){
9449
+ },{"../avaliador-sintatico":8,"../bibliotecas/primitivas-dicionario":16,"../construtos":42,"../espaco-variaveis":97,"../excecoes":99,"../inferenciador":105,"../lexador":152,"../quebras":159,"../tipos-de-dados/delegua":160,"../tipos-de-dados/primitivos":161,"../tipos-de-simbolos/delegua":163,"./comum":128,"./estruturas":134,"./estruturas/metodo-primitiva":135,"./pilha-escopos-execucao":143,"_process":383,"browser-process-hrtime":340}],141:[function(require,module,exports){
9474
9450
  "use strict";
9475
9451
  var __importDefault = (this && this.__importDefault) || function (mod) {
9476
9452
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -10080,9 +10056,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
10080
10056
  variavelObjeto = variavelObjeto.valor;
10081
10057
  }
10082
10058
  const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
10083
- // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
10084
- // então testamos também o nome do construtor.
10085
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto.constructor.name === 'ObjetoDeleguaClasse') {
10059
+ if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
10086
10060
  return objeto.obterMetodo(expressao.nomeMetodo) || null;
10087
10061
  }
10088
10062
  // Objeto simples do JavaScript, ou dicionário de Delégua.
@@ -10143,7 +10117,16 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
10143
10117
  }
10144
10118
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, `Método para objeto ou primitiva não encontrado: ${expressao.nomeMetodo}.`, expressao.linha));
10145
10119
  }
10146
- async visitarExpressaoAcessoPropriedade(expressao) {
10120
+ /**
10121
+ * Casos que ocorrem aqui:
10122
+ *
10123
+ * - Quando o método ou propriedade é ou 'qualquer', ou vetor
10124
+ * de 'qualquer' ('qualquer[]'), e uma primitiva é usada.
10125
+ * - Quando o objeto é uma classe definida em código.
10126
+ * @param {AcessoMetodoOuPropriedade} expressao A expressão de acesso a método ou propriedade.
10127
+ * @returns A primitiva encontrada.
10128
+ */
10129
+ async visitarExpressaoAcessoMetodoOuPropriedade(expressao) {
10147
10130
  let variavelObjeto = await this.avaliar(expressao.objeto);
10148
10131
  // Este caso acontece quando há encadeamento de métodos.
10149
10132
  // Por exemplo, `objeto1.metodo1().metodo2()`.
@@ -10153,34 +10136,16 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
10153
10136
  variavelObjeto = variavelObjeto.valor;
10154
10137
  }
10155
10138
  const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
10156
- // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
10157
- // então testamos também o nome do construtor.
10158
- if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto.constructor.name === 'ObjetoDeleguaClasse') {
10159
- return objeto.obterMetodo(expressao.nomePropriedade) || null;
10139
+ if (objeto.constructor.name === 'ObjetoDeleguaClasse') {
10140
+ return objeto.obter(expressao.simbolo);
10160
10141
  }
10161
10142
  // Objeto simples do JavaScript, ou dicionário de Delégua.
10162
10143
  if (objeto.constructor === Object) {
10163
- if (expressao.nomePropriedade in primitivas_dicionario_1.default) {
10164
- const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomePropriedade].implementacao;
10144
+ if (expressao.simbolo.lexema in primitivas_dicionario_1.default) {
10145
+ const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.simbolo.lexema].implementacao;
10165
10146
  return new estruturas_1.MetodoPrimitiva(objeto, metodoDePrimitivaDicionario);
10166
10147
  }
10167
- return objeto[expressao.nomePropriedade] || null;
10168
- }
10169
- // Casos em que o objeto possui algum outro tipo que não o de objeto simples.
10170
- // Normalmente executam quando uma biblioteca é importada, e estamos tentando
10171
- // obter alguma propriedade ou método desse objeto.
10172
- // Caso 1: Função tradicional do JavaScript.
10173
- if (typeof objeto[expressao.nomePropriedade] === primitivos_1.default.FUNCAO) {
10174
- return objeto[expressao.nomePropriedade];
10175
- }
10176
- // Caso 2: Objeto tradicional do JavaScript.
10177
- if (typeof objeto[expressao.nomePropriedade] === primitivos_1.default.OBJETO) {
10178
- return objeto[expressao.nomePropriedade];
10179
- }
10180
- // A partir daqui, presume-se que o objeto é uma das estruturas
10181
- // de Delégua.
10182
- if (objeto instanceof estruturas_1.DeleguaModulo) {
10183
- return objeto.componentes[expressao.nomePropriedade] || null;
10148
+ return objeto[expressao.simbolo.lexema] || null;
10184
10149
  }
10185
10150
  let tipoObjeto = variavelObjeto.tipo;
10186
10151
  if (tipoObjeto === null || tipoObjeto === undefined) {
@@ -10193,28 +10158,76 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
10193
10158
  case delegua_1.default.INTEIRO:
10194
10159
  case delegua_1.default.NUMERO:
10195
10160
  case delegua_1.default.NÚMERO:
10196
- const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.nomePropriedade].implementacao;
10161
+ const metodoDePrimitivaNumero = primitivas_numero_1.default[expressao.simbolo.lexema].implementacao;
10197
10162
  if (metodoDePrimitivaNumero) {
10198
10163
  return new estruturas_1.MetodoPrimitiva(objeto, metodoDePrimitivaNumero);
10199
10164
  }
10200
10165
  break;
10201
10166
  case delegua_1.default.TEXTO:
10202
- const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.nomePropriedade].implementacao;
10167
+ const metodoDePrimitivaTexto = primitivas_texto_1.default[expressao.simbolo.lexema].implementacao;
10203
10168
  if (metodoDePrimitivaTexto) {
10204
10169
  return new estruturas_1.MetodoPrimitiva(objeto, metodoDePrimitivaTexto);
10205
10170
  }
10206
10171
  break;
10207
10172
  case delegua_1.default.VETOR:
10173
+ case delegua_1.default.VETOR_INTEIRO:
10174
+ case delegua_1.default.VETOR_LOGICO:
10175
+ case delegua_1.default.VETOR_LÓGICO:
10208
10176
  case delegua_1.default.VETOR_NUMERO:
10209
10177
  case delegua_1.default.VETOR_NÚMERO:
10178
+ case delegua_1.default.VETOR_QUALQUER:
10210
10179
  case delegua_1.default.VETOR_TEXTO:
10211
- const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.nomePropriedade].implementacao;
10180
+ const metodoDePrimitivaVetor = primitivas_vetor_1.default[expressao.simbolo.lexema].implementacao;
10212
10181
  if (metodoDePrimitivaVetor) {
10213
10182
  return new estruturas_1.MetodoPrimitiva(objeto, metodoDePrimitivaVetor);
10214
10183
  }
10215
10184
  break;
10216
10185
  }
10217
- return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, `Método para objeto ou primitiva não encontrado: ${expressao.nomePropriedade}.`, expressao.linha));
10186
+ }
10187
+ async visitarExpressaoAcessoPropriedade(expressao) {
10188
+ let variavelObjeto = await this.avaliar(expressao.objeto);
10189
+ // Este caso acontece quando há encadeamento de métodos.
10190
+ // Por exemplo, `objeto1.metodo1().metodo2()`.
10191
+ // Como `RetornoQuebra` também possui `valor`, precisamos extrair o
10192
+ // valor dele primeiro.
10193
+ if (variavelObjeto.constructor.name === 'RetornoQuebra') {
10194
+ variavelObjeto = variavelObjeto.valor;
10195
+ }
10196
+ const objeto = variavelObjeto.hasOwnProperty('valor') ? variavelObjeto.valor : variavelObjeto;
10197
+ // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
10198
+ // então testamos também o nome do construtor.
10199
+ if (objeto instanceof estruturas_1.ObjetoDeleguaClasse || objeto.constructor.name === 'ObjetoDeleguaClasse') {
10200
+ return objeto.obterMetodo(expressao.nomePropriedade) || null;
10201
+ }
10202
+ // Objeto simples do JavaScript, ou dicionário de Delégua.
10203
+ if (objeto.constructor === Object) {
10204
+ if (expressao.nomePropriedade in primitivas_dicionario_1.default) {
10205
+ const metodoDePrimitivaDicionario = primitivas_dicionario_1.default[expressao.nomePropriedade].implementacao;
10206
+ return new estruturas_1.MetodoPrimitiva(objeto, metodoDePrimitivaDicionario);
10207
+ }
10208
+ return objeto[expressao.nomePropriedade] || null;
10209
+ }
10210
+ // Casos em que o objeto possui algum outro tipo que não o de objeto simples.
10211
+ // Normalmente executam quando uma biblioteca é importada, e estamos tentando
10212
+ // obter alguma propriedade ou método desse objeto.
10213
+ // Caso 1: Função tradicional do JavaScript.
10214
+ if (typeof objeto[expressao.nomePropriedade] === primitivos_1.default.FUNCAO) {
10215
+ return objeto[expressao.nomePropriedade];
10216
+ }
10217
+ // Caso 2: Objeto tradicional do JavaScript.
10218
+ if (typeof objeto[expressao.nomePropriedade] === primitivos_1.default.OBJETO) {
10219
+ return objeto[expressao.nomePropriedade];
10220
+ }
10221
+ // A partir daqui, presume-se que o objeto é uma das estruturas
10222
+ // de Delégua.
10223
+ if (objeto instanceof estruturas_1.DeleguaModulo) {
10224
+ return objeto.componentes[expressao.nomePropriedade] || null;
10225
+ }
10226
+ let tipoObjeto = variavelObjeto.tipo;
10227
+ if (tipoObjeto === null || tipoObjeto === undefined) {
10228
+ tipoObjeto = (0, inferenciador_1.inferirTipoVariavel)(variavelObjeto);
10229
+ }
10230
+ return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(null, `Propriedade para objeto ou primitiva não encontrado: ${expressao.nomePropriedade}.`, expressao.linha));
10218
10231
  }
10219
10232
  async visitarExpressaoArgumentoReferenciaFuncao(expressao) {
10220
10233
  const deleguaFuncao = this.pilhaEscoposExecucao.obterVariavelPorNome(expressao.simboloFuncao.lexema);
@@ -12687,8 +12700,12 @@ exports.default = {
12687
12700
  TUPLA: 'tupla',
12688
12701
  VAZIO: 'vazio',
12689
12702
  VETOR: 'vetor',
12703
+ VETOR_INTEIRO: 'inteiro[]',
12704
+ VETOR_LOGICO: 'logico[]',
12705
+ VETOR_LÓGICO: 'lógico[]',
12690
12706
  VETOR_NUMERO: 'numero[]',
12691
12707
  VETOR_NÚMERO: 'número[]',
12708
+ VETOR_QUALQUER: 'qualquer[]',
12692
12709
  VETOR_TEXTO: 'texto[]',
12693
12710
  };
12694
12711