@designliquido/delegua 1.25.0 → 1.26.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 (38) hide show
  1. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  2. package/avaliador-sintatico/avaliador-sintatico.js +39 -4
  3. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  4. package/bin/package.json +3 -3
  5. package/interpretador/comum.d.ts +3 -0
  6. package/interpretador/comum.d.ts.map +1 -1
  7. package/interpretador/comum.js +64 -0
  8. package/interpretador/comum.js.map +1 -1
  9. package/interpretador/dialetos/pitugues/comum.d.ts +2 -2
  10. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  11. package/interpretador/dialetos/pitugues/comum.js +8 -66
  12. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  13. package/interpretador/interpretador-base.d.ts.map +1 -1
  14. package/interpretador/interpretador-base.js +4 -6
  15. package/interpretador/interpretador-base.js.map +1 -1
  16. package/interpretador/interpretador.d.ts +2 -1
  17. package/interpretador/interpretador.d.ts.map +1 -1
  18. package/interpretador/interpretador.js +9 -8
  19. package/interpretador/interpretador.js.map +1 -1
  20. package/package.json +3 -3
  21. package/tradutores/tradutor-assemblyscript.js +4 -4
  22. package/tradutores/tradutor-assemblyscript.js.map +1 -1
  23. package/tradutores/tradutor-elixir.js +19 -17
  24. package/tradutores/tradutor-elixir.js.map +1 -1
  25. package/tradutores/tradutor-javascript.d.ts.map +1 -1
  26. package/tradutores/tradutor-javascript.js +5 -3
  27. package/tradutores/tradutor-javascript.js.map +1 -1
  28. package/tradutores/tradutor-python.js +3 -3
  29. package/tradutores/tradutor-python.js.map +1 -1
  30. package/tradutores/tradutor-reverso-javascript.d.ts +3 -1
  31. package/tradutores/tradutor-reverso-javascript.d.ts.map +1 -1
  32. package/tradutores/tradutor-reverso-javascript.js +29 -1
  33. package/tradutores/tradutor-reverso-javascript.js.map +1 -1
  34. package/tradutores/tradutor-reverso-tenda.js +1 -1
  35. package/tradutores/tradutor-reverso-tenda.js.map +1 -1
  36. package/tradutores/tradutor-ruby.js +3 -3
  37. package/tradutores/tradutor-ruby.js.map +1 -1
  38. package/umd/delegua.js +182 -52
package/umd/delegua.js CHANGED
@@ -3147,10 +3147,40 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3147
3147
  case delegua_2.default.COLCHETE_ESQUERDO:
3148
3148
  const tipoAcesso = this.resolverTipoAcessoIndiceVariavel(expressaoAnterior);
3149
3149
  this.avancarEDevolverAnterior();
3150
- const indice = await this.expressao();
3151
- const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
3152
- const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indice, simboloFechamento, tipoAcesso);
3153
- return await this.resolverCadeiaChamadas(acessoVariavel);
3150
+ // Determina se é intervalo ([:]), índice único ([indice]) ou
3151
+ // intervalo com passo ([inicio:fim:passo]).
3152
+ let indiceInicio = null;
3153
+ let indiceFim = null;
3154
+ let indicePasso = null;
3155
+ // Se começar com ':', não há início explícito (ex.: `[:fim]`).
3156
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.DOIS_PONTOS) {
3157
+ indiceInicio = await this.expressao();
3158
+ }
3159
+ if (this.simbolos[this.atual].tipo === delegua_2.default.DOIS_PONTOS) {
3160
+ // É um intervalo: [inicio:fim] ou [inicio:fim:passo].
3161
+ this.avancarEDevolverAnterior(); // Pula ':'.
3162
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.COLCHETE_DIREITO &&
3163
+ this.simbolos[this.atual].tipo !== delegua_2.default.DOIS_PONTOS) {
3164
+ indiceFim = await this.expressao();
3165
+ }
3166
+ if (this.simbolos[this.atual].tipo === delegua_2.default.DOIS_PONTOS) {
3167
+ this.avancarEDevolverAnterior(); // Pula segundo ':'.
3168
+ if (this.simbolos[this.atual].tipo !== delegua_2.default.COLCHETE_DIREITO) {
3169
+ indicePasso = await this.expressao();
3170
+ }
3171
+ }
3172
+ const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após intervalo.");
3173
+ // Fatiamento sempre retorna uma coleção do mesmo tipo de elemento.
3174
+ const tipoIntervalo = tipoAcesso + '[]';
3175
+ const acessoIntervalo = new construtos_1.AcessoIntervaloVariavel(this.hashArquivo, expressaoAnterior, indiceInicio, indiceFim, indicePasso, simboloFechamento, tipoIntervalo);
3176
+ return await this.resolverCadeiaChamadas(acessoIntervalo);
3177
+ }
3178
+ else {
3179
+ // É um índice único
3180
+ const simboloFechamento = this.consumir(delegua_2.default.COLCHETE_DIREITO, "Esperado ']' após escrita do indice.");
3181
+ const acessoVariavel = new construtos_1.AcessoIndiceVariavel(this.hashArquivo, expressaoAnterior, indiceInicio, simboloFechamento, tipoAcesso);
3182
+ return await this.resolverCadeiaChamadas(acessoVariavel);
3183
+ }
3154
3184
  default:
3155
3185
  return expressaoAnterior;
3156
3186
  }
@@ -3752,6 +3782,11 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3752
3782
  let caminhoPadrao = null;
3753
3783
  while (!this.verificarSeSimboloAtualEIgualA(delegua_2.default.CHAVE_DIREITA) &&
3754
3784
  !this.estaNoFinal()) {
3785
+ if (this.simbolos[this.atual].tipo === delegua_2.default.COMENTARIO ||
3786
+ this.simbolos[this.atual].tipo === delegua_2.default.LINHA_COMENTARIO) {
3787
+ this.avancarEDevolverAnterior();
3788
+ continue;
3789
+ }
3755
3790
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.CASO)) {
3756
3791
  const caminhoCondicoes = [await this.expressao()];
3757
3792
  this.consumir(delegua_2.default.DOIS_PONTOS, "Esperado ':' após o 'caso'.");
@@ -19972,6 +20007,7 @@ var __importStar = (this && this.__importStar) || (function () {
19972
20007
  };
19973
20008
  })();
19974
20009
  Object.defineProperty(exports, "__esModule", { value: true });
20010
+ exports.visitarExpressaoAcessoIntervaloVariavel = visitarExpressaoAcessoIntervaloVariavel;
19975
20011
  exports.carregarBibliotecasGlobais = carregarBibliotecasGlobais;
19976
20012
  exports.pontoEntradaAjuda = pontoEntradaAjuda;
19977
20013
  exports.obterTopicoAjuda = obterTopicoAjuda;
@@ -19980,7 +20016,70 @@ const delegua_funcao_1 = require("./estruturas/delegua-funcao");
19980
20016
  const descritor_tipo_classe_1 = require("./estruturas/descritor-tipo-classe");
19981
20017
  const objeto_delegua_classe_1 = require("./estruturas/objeto-delegua-classe");
19982
20018
  const construtos_1 = require("../construtos");
20019
+ const excecoes_1 = require("../excecoes");
19983
20020
  const bibliotecaGlobal = __importStar(require("../bibliotecas/biblioteca-global"));
20021
+ async function visitarExpressaoAcessoIntervaloVariavel(interpretador, expressao) {
20022
+ const resultadoEntidade = await interpretador.avaliar(expressao.entidadeChamada);
20023
+ const objeto = interpretador.resolverValor(resultadoEntidade);
20024
+ let tamanho = 0;
20025
+ let itens;
20026
+ const ehTexto = typeof objeto === 'string';
20027
+ if (objeto instanceof construtos_1.TuplaN) {
20028
+ itens = objeto.elementos;
20029
+ tamanho = objeto.elementos.length;
20030
+ }
20031
+ else if (Array.isArray(objeto) || ehTexto) {
20032
+ itens = objeto;
20033
+ tamanho = objeto.length;
20034
+ }
20035
+ else {
20036
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Acesso por intervalo só é suportado em vetores, textos e tuplas.', expressao.linha);
20037
+ }
20038
+ let passo = 1;
20039
+ if (expressao.indicePasso) {
20040
+ const resPasso = await interpretador.avaliar(expressao.indicePasso);
20041
+ passo = interpretador.resolverValor(resPasso);
20042
+ }
20043
+ if (passo === 0) {
20044
+ throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'O passo do fatiamento não pode ser zero.', expressao.linha);
20045
+ }
20046
+ let inicio = passo > 0 ? 0 : tamanho - 1;
20047
+ if (expressao.indiceInicio) {
20048
+ const resInicio = await interpretador.avaliar(expressao.indiceInicio);
20049
+ inicio = interpretador.resolverValor(resInicio);
20050
+ if (inicio < 0)
20051
+ inicio = tamanho + inicio;
20052
+ }
20053
+ let fim = passo > 0 ? tamanho : -1;
20054
+ if (expressao.indiceFim) {
20055
+ const resFim = await interpretador.avaliar(expressao.indiceFim);
20056
+ fim = interpretador.resolverValor(resFim);
20057
+ if (fim < 0)
20058
+ fim = tamanho + fim;
20059
+ }
20060
+ // Lógica de fatiamento para suportar "passo", pois o TypeScript não suporta nativamente
20061
+ const resultadoFatiado = [];
20062
+ if (passo > 0) {
20063
+ for (let i = inicio; i < fim; i += passo) {
20064
+ if (i >= 0 && i < tamanho) {
20065
+ resultadoFatiado.push(itens[i]);
20066
+ }
20067
+ }
20068
+ }
20069
+ else {
20070
+ for (let i = inicio; i > fim; i += passo) {
20071
+ if (i >= 0 && i < tamanho) {
20072
+ resultadoFatiado.push(itens[i]);
20073
+ }
20074
+ }
20075
+ }
20076
+ if (objeto instanceof construtos_1.TuplaN) {
20077
+ return new construtos_1.TuplaN(objeto.hashArquivo, objeto.linha, resultadoFatiado);
20078
+ }
20079
+ if (ehTexto)
20080
+ return resultadoFatiado.join('');
20081
+ return resultadoFatiado;
20082
+ }
19984
20083
  function carregarBibliotecasGlobais(pilhaEscoposExecucao) {
19985
20084
  pilhaEscoposExecucao.definirVariavel('aleatorio', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
19986
20085
  pilhaEscoposExecucao.definirVariavel('aleatório', new funcao_padrao_1.FuncaoPadrao(1, bibliotecaGlobal.aleatorio));
@@ -20551,7 +20650,7 @@ function obterAjudaFuncaoPadrao(funcaoPadrao) {
20551
20650
  }
20552
20651
  }
20553
20652
 
20554
- },{"../bibliotecas/biblioteca-global":29,"../construtos":67,"./estruturas/delegua-funcao":210,"./estruturas/descritor-tipo-classe":211,"./estruturas/funcao-padrao":213,"./estruturas/objeto-delegua-classe":219}],205:[function(require,module,exports){
20653
+ },{"../bibliotecas/biblioteca-global":29,"../construtos":67,"../excecoes":141,"./estruturas/delegua-funcao":210,"./estruturas/descritor-tipo-classe":211,"./estruturas/funcao-padrao":213,"./estruturas/objeto-delegua-classe":219}],205:[function(require,module,exports){
20555
20654
  "use strict";
20556
20655
  Object.defineProperty(exports, "__esModule", { value: true });
20557
20656
  exports.EspacoMemoria = void 0;
@@ -23591,7 +23690,7 @@ class InterpretadorBase {
23591
23690
  }
23592
23691
  return objeto[valorIndice];
23593
23692
  }
23594
- if (objeto instanceof construtos_1.TuplaN || objeto.constructor.name === 'TuplaN') {
23693
+ if (objeto instanceof construtos_1.TuplaN || objeto.constructor === construtos_1.TuplaN) {
23595
23694
  if (!Number.isInteger(valorIndice)) {
23596
23695
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Somente inteiros podem ser usados para indexar uma tupla.', expressao.linha));
23597
23696
  }
@@ -23602,7 +23701,7 @@ class InterpretadorBase {
23602
23701
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Índice da tupla fora de intervalo.', expressao.linha));
23603
23702
  }
23604
23703
  const elemento = objeto.elementos[valorIndice];
23605
- if (elemento && elemento.constructor && elemento.constructor.name === 'Literal') {
23704
+ if (elemento instanceof construtos_1.Literal) {
23606
23705
  return elemento.valor;
23607
23706
  }
23608
23707
  return elemento;
@@ -23622,9 +23721,7 @@ class InterpretadorBase {
23622
23721
  objeto instanceof estruturas_1.DeleguaFuncao ||
23623
23722
  objeto instanceof estruturas_1.DescritorTipoClasse ||
23624
23723
  objeto instanceof estruturas_1.DeleguaModulo) {
23625
- if (objeto[valorIndice] === 0)
23626
- return 0;
23627
- return objeto[valorIndice] || null;
23724
+ return objeto[valorIndice];
23628
23725
  }
23629
23726
  if (typeof objeto === primitivos_1.default.TEXTO) {
23630
23727
  if (!Number.isInteger(valorIndice)) {
@@ -23825,7 +23922,7 @@ class InterpretadorBase {
23825
23922
  // Outro caso que `instanceof` simplesmente não funciona para casos em Liquido,
23826
23923
  // então testamos também o nome do construtor.
23827
23924
  if (objeto instanceof estruturas_1.ObjetoDeleguaClasse ||
23828
- objeto.constructor.name === 'ObjetoDeleguaClasse') {
23925
+ objeto.constructor === estruturas_1.ObjetoDeleguaClasse) {
23829
23926
  const valor = await objeto.obter(expressao.simbolo, this);
23830
23927
  if (valor === 0)
23831
23928
  return 0;
@@ -24904,7 +25001,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
24904
25001
  }
24905
25002
  return objeto[valorIndice];
24906
25003
  }
24907
- if (objeto instanceof construtos_1.TuplaN || objeto.constructor.name === 'TuplaN') {
25004
+ if (objeto instanceof construtos_1.TuplaN || objeto.constructor === construtos_1.TuplaN) {
24908
25005
  if (!Number.isInteger(valorIndice)) {
24909
25006
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Somente inteiros podem ser usados para indexar uma tupla.', expressao.linha));
24910
25007
  }
@@ -24915,7 +25012,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
24915
25012
  return Promise.reject(new excecoes_1.ErroEmTempoDeExecucao(expressao.simboloFechamento, 'Índice da tupla fora de intervalo.', expressao.linha));
24916
25013
  }
24917
25014
  const elemento = objeto.elementos[valorIndice];
24918
- if (elemento && elemento.constructor && elemento.constructor.name === 'Literal') {
25015
+ if (elemento instanceof construtos_1.Literal) {
24919
25016
  return elemento.valor;
24920
25017
  }
24921
25018
  return elemento;
@@ -24928,9 +25025,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
24928
25025
  objeto instanceof estruturas_1.DeleguaFuncao ||
24929
25026
  objeto instanceof estruturas_1.DescritorTipoClasse ||
24930
25027
  objeto instanceof estruturas_1.DeleguaModulo) {
24931
- if (objeto[valorIndice] === 0)
24932
- return 0;
24933
- return objeto[valorIndice] || null;
25028
+ return objeto[valorIndice];
24934
25029
  }
24935
25030
  if (typeof objeto === primitivos_1.default.TEXTO) {
24936
25031
  if (!Number.isInteger(valorIndice)) {
@@ -24949,6 +25044,9 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
24949
25044
  linha: this.linhaDeclaracaoAtual,
24950
25045
  }, 'Somente listas, dicionários, classes e objetos podem ter seus valores indexados.', expressao.linha));
24951
25046
  }
25047
+ async visitarExpressaoAcessoIntervaloVariavel(expressao) {
25048
+ return (0, comum_1.visitarExpressaoAcessoIntervaloVariavel)(this, expressao);
25049
+ }
24952
25050
  logicaPropriedadesEMetodosDeClasse(declaracao, superClassesResolvidas, mesclaResolvidas) {
24953
25051
  const metodos = {};
24954
25052
  const metodosEstaticos = {};
@@ -25140,7 +25238,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
25140
25238
  throw e;
25141
25239
  }
25142
25240
  }
25143
- if (objeto instanceof construtos_1.TuplaN || objeto.constructor.name === 'TuplaN') {
25241
+ if (objeto instanceof construtos_1.TuplaN || objeto.constructor === construtos_1.TuplaN) {
25144
25242
  const metodoDePrimitivaTupla = primitivas_tupla_1.default[expressao.nomeMetodo];
25145
25243
  if (metodoDePrimitivaTupla) {
25146
25244
  return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTupla.implementacao, expressao.nomeMetodo, 'tupla');
@@ -25337,7 +25435,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
25337
25435
  throw new excecoes_1.ErroEmTempoDeExecucao(expressao.simbolo, `Método ou propriedade '${expressao.simbolo.lexema}' não encontrado em '${nomeClasse}'.`, expressao.linha);
25338
25436
  }
25339
25437
  }
25340
- if (objeto instanceof construtos_1.TuplaN || objeto.constructor.name === 'TuplaN') {
25438
+ if (objeto instanceof construtos_1.TuplaN || objeto.constructor === construtos_1.TuplaN) {
25341
25439
  const metodoDePrimitivaTupla = primitivas_tupla_1.default[expressao.simbolo.lexema];
25342
25440
  if (metodoDePrimitivaTupla) {
25343
25441
  return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoDePrimitivaTupla.implementacao, expressao.simbolo.lexema, 'tupla');
@@ -25476,7 +25574,7 @@ class Interpretador extends interpretador_base_1.InterpretadorBase {
25476
25574
  if (objeto.constructor === estruturas_1.ObjetoDeleguaClasse) {
25477
25575
  return objeto.obterMetodo(expressao.nomePropriedade) || null;
25478
25576
  }
25479
- if (objeto instanceof construtos_1.TuplaN || objeto.constructor.name === 'TuplaN') {
25577
+ if (objeto instanceof construtos_1.TuplaN || objeto.constructor === construtos_1.TuplaN) {
25480
25578
  const metodoPrimitivaTupla = primitivas_tupla_1.default[expressao.nomePropriedade];
25481
25579
  if (metodoPrimitivaTupla) {
25482
25580
  return new estruturas_1.MetodoPrimitiva(nomeObjeto, objeto, metodoPrimitivaTupla.implementacao, expressao.nomePropriedade, 'tupla');
@@ -46806,7 +46904,7 @@ class TradutorAssemblyScript {
46806
46904
  }
46807
46905
  traduzirDeclaracaoPara(declaracaoPara) {
46808
46906
  let resultado = 'for (';
46809
- if (declaracaoPara.inicializador.constructor.name === 'Array') {
46907
+ if (Array.isArray(declaracaoPara.inicializador)) {
46810
46908
  resultado +=
46811
46909
  this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0]) + ' ';
46812
46910
  }
@@ -46888,7 +46986,7 @@ class TradutorAssemblyScript {
46888
46986
  if (!corpo)
46889
46987
  return null;
46890
46988
  for (const declaracao of corpo) {
46891
- if (declaracao.constructor.name === 'Retorna') {
46989
+ if (declaracao instanceof declaracoes_1.Retorna) {
46892
46990
  const retorna = declaracao;
46893
46991
  if (retorna.tipo && retorna.tipo !== 'vazio') {
46894
46992
  return retorna.tipo;
@@ -47231,7 +47329,7 @@ class TradutorAssemblyScript {
47231
47329
  return `Math.pow(${esquerda}, ${direita})`;
47232
47330
  }
47233
47331
  let resultado = '';
47234
- if (binario.esquerda.constructor.name === 'Agrupamento')
47332
+ if (binario.esquerda instanceof construtos_1.Agrupamento)
47235
47333
  resultado +=
47236
47334
  '(' +
47237
47335
  this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda) +
@@ -47240,7 +47338,7 @@ class TradutorAssemblyScript {
47240
47338
  resultado += this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
47241
47339
  let operador = this.traduzirSimboloOperador(binario.operador);
47242
47340
  resultado += ` ${operador} `;
47243
- if (binario.direita.constructor.name === 'Agrupamento')
47341
+ if (binario.direita instanceof construtos_1.Agrupamento)
47244
47342
  resultado +=
47245
47343
  '(' +
47246
47344
  this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) +
@@ -47386,6 +47484,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
47386
47484
  };
47387
47485
  Object.defineProperty(exports, "__esModule", { value: true });
47388
47486
  exports.TradutorElixir = void 0;
47487
+ const construtos_1 = require("../construtos");
47488
+ const declaracoes_1 = require("../declaracoes");
47389
47489
  const delegua_1 = __importDefault(require("../tipos-de-simbolos/delegua"));
47390
47490
  /**
47391
47491
  * Tradutor que converte código Delégua para Elixir.
@@ -47597,27 +47697,27 @@ class TradutorElixir {
47597
47697
  */
47598
47698
  extrairCamposDeDeclaracao(declaracao, campos) {
47599
47699
  // Se é uma expressão de atribuição com isto.campo
47600
- if (declaracao.constructor.name === 'Expressao' && declaracao.expressao) {
47700
+ if (declaracao instanceof declaracoes_1.Expressao && declaracao.expressao) {
47601
47701
  const expressao = declaracao.expressao;
47602
47702
  // DefinirValor: usado para isto.campo = valor
47603
- if (expressao.constructor.name === 'DefinirValor') {
47604
- if (expressao.objeto && expressao.objeto.constructor.name === 'Isto') {
47703
+ if (expressao instanceof construtos_1.DefinirValor) {
47704
+ if (expressao.objeto && expressao.objeto.constructor === construtos_1.Isto) {
47605
47705
  campos.add(expressao.nome.lexema);
47606
47706
  }
47607
47707
  }
47608
47708
  // Atribuir: pode ser usado para isto.campo = valor
47609
- if (expressao.constructor.name === 'Atribuir') {
47709
+ if (expressao instanceof construtos_1.Atribuir) {
47610
47710
  // Verificar se o alvo é um acesso a propriedade de isto
47611
- if (expressao.alvo && expressao.alvo.constructor.name === 'AcessoPropriedade') {
47711
+ if (expressao.alvo instanceof construtos_1.AcessoPropriedade) {
47612
47712
  const acesso = expressao.alvo;
47613
- if (acesso.objeto && acesso.objeto.constructor.name === 'Isto') {
47713
+ if (acesso.objeto && acesso.objeto.constructor === construtos_1.Isto) {
47614
47714
  campos.add(acesso.nomePropriedade);
47615
47715
  }
47616
47716
  }
47617
47717
  }
47618
47718
  }
47619
47719
  // Se é um bloco, processar declarações internas
47620
- if (declaracao.constructor.name === 'Bloco') {
47720
+ if (declaracao.constructor === declaracoes_1.Bloco) {
47621
47721
  for (const decl of declaracao.declaracoes) {
47622
47722
  this.extrairCamposDeDeclaracao(decl, campos);
47623
47723
  }
@@ -47674,21 +47774,21 @@ class TradutorElixir {
47674
47774
  async extrairInicializacoesStruct(corpo, nomeModulo) {
47675
47775
  const inicializacoes = [];
47676
47776
  for (const declaracao of corpo) {
47677
- if (declaracao.constructor.name === 'Expressao' && declaracao.expressao) {
47777
+ if (declaracao instanceof declaracoes_1.Expressao && declaracao.expressao) {
47678
47778
  const expressao = declaracao.expressao;
47679
47779
  // DefinirValor: isto.campo = valor
47680
- if (expressao.constructor.name === 'DefinirValor') {
47681
- if (expressao.objeto && expressao.objeto.constructor.name === 'Isto') {
47780
+ if (expressao instanceof construtos_1.DefinirValor) {
47781
+ if (expressao.objeto && expressao.objeto.constructor === construtos_1.Isto) {
47682
47782
  const campo = this.converterIdentificador(expressao.nome.lexema);
47683
47783
  const valor = await expressao.valor.aceitar(this);
47684
47784
  inicializacoes.push(`${campo}: ${valor}`);
47685
47785
  }
47686
47786
  }
47687
47787
  // Atribuir: pode ser isto.campo = valor (se alvo é AcessoPropriedade)
47688
- if (expressao.constructor.name === 'Atribuir') {
47689
- if (expressao.alvo && expressao.alvo.constructor.name === 'AcessoPropriedade') {
47788
+ if (expressao instanceof construtos_1.Atribuir) {
47789
+ if (expressao.alvo instanceof construtos_1.AcessoPropriedade) {
47690
47790
  const acesso = expressao.alvo;
47691
- if (acesso.objeto && acesso.objeto.constructor.name === 'Isto') {
47791
+ if (acesso.objeto && acesso.objeto.constructor === construtos_1.Isto) {
47692
47792
  const campo = this.converterIdentificador(acesso.nomePropriedade);
47693
47793
  const valor = await expressao.valor.aceitar(this);
47694
47794
  inicializacoes.push(`${campo}: ${valor}`);
@@ -47883,7 +47983,7 @@ class TradutorElixir {
47883
47983
  const init = Array.isArray(declaracao.inicializador)
47884
47984
  ? declaracao.inicializador[0]
47885
47985
  : declaracao.inicializador;
47886
- if (init.constructor.name === 'Var') {
47986
+ if (init.constructor === declaracoes_1.Var) {
47887
47987
  nomeVar = this.converterIdentificador(init.simbolo.lexema);
47888
47988
  if (init.inicializador) {
47889
47989
  valorInicial = await init.inicializador.aceitar(this);
@@ -48116,7 +48216,7 @@ class TradutorElixir {
48116
48216
  }
48117
48217
  }
48118
48218
  // Verificar se é instanciação de módulo (classe)
48119
- if (expressao.entidadeChamada.constructor.name === 'Variavel') {
48219
+ if (expressao.entidadeChamada.constructor === construtos_1.Variavel) {
48120
48220
  const nomeEntidade = expressao.entidadeChamada.simbolo.lexema;
48121
48221
  if (this.modulosConhecidos.has(this.converterNomeModulo(nomeEntidade))) {
48122
48222
  // Chamada de construtor de módulo
@@ -48124,7 +48224,7 @@ class TradutorElixir {
48124
48224
  }
48125
48225
  }
48126
48226
  // Verificar se é chamada de método (AcessoMetodo ou AcessoMetodoOuPropriedade)
48127
- if (expressao.entidadeChamada.constructor.name === 'AcessoMetodo') {
48227
+ if (expressao.entidadeChamada.constructor === construtos_1.AcessoMetodo) {
48128
48228
  const acessoMetodo = expressao.entidadeChamada;
48129
48229
  const objeto = await acessoMetodo.objeto.aceitar(this);
48130
48230
  const metodo = this.converterIdentificador(acessoMetodo.nomeMetodo);
@@ -48136,7 +48236,7 @@ class TradutorElixir {
48136
48236
  // Método de módulo/struct - passar o struct como primeiro argumento
48137
48237
  return Promise.resolve(`${this.obterNomeModulo(objeto)}.${metodo}(${objeto}${argumentos.length > 0 ? ', ' + argumentos.join(', ') : ''})`);
48138
48238
  }
48139
- if (expressao.entidadeChamada.constructor.name === 'AcessoMetodoOuPropriedade') {
48239
+ if (expressao.entidadeChamada.constructor === construtos_1.AcessoMetodoOuPropriedade) {
48140
48240
  const acesso = expressao.entidadeChamada;
48141
48241
  const objeto = await acesso.objeto.aceitar(this);
48142
48242
  const simbolo = this.converterIdentificador(acesso.simbolo.lexema);
@@ -48340,7 +48440,7 @@ class TradutorElixir {
48340
48440
  }
48341
48441
  exports.TradutorElixir = TradutorElixir;
48342
48442
 
48343
- },{"../tipos-de-simbolos/delegua":258}],280:[function(require,module,exports){
48443
+ },{"../construtos":67,"../declaracoes":117,"../tipos-de-simbolos/delegua":258}],280:[function(require,module,exports){
48344
48444
  "use strict";
48345
48445
  var __importDefault = (this && this.__importDefault) || function (mod) {
48346
48446
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -48533,11 +48633,13 @@ class TradutorJavaScript {
48533
48633
  resultado += this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
48534
48634
  let operador = this.traduzirSimboloOperador(binario.operador);
48535
48635
  resultado += ` ${operador} `;
48536
- if (binario.direita.constructor.name === 'Agrupamento')
48636
+ if (binario.direita.constructor === construtos_1.Agrupamento) {
48637
+ const agrupamentoDireita = binario.direita;
48537
48638
  resultado +=
48538
48639
  '(' +
48539
- this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita) +
48640
+ this.dicionarioConstrutos[agrupamentoDireita.constructor.name](binario.direita) +
48540
48641
  ')';
48642
+ }
48541
48643
  else
48542
48644
  resultado += this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
48543
48645
  return resultado;
@@ -48794,7 +48896,7 @@ class TradutorJavaScript {
48794
48896
  }
48795
48897
  traduzirDeclaracaoPara(declaracaoPara) {
48796
48898
  let resultado = 'for (';
48797
- if (declaracaoPara.inicializador.constructor.name === 'Array') {
48899
+ if (Array.isArray(declaracaoPara.inicializador)) {
48798
48900
  resultado +=
48799
48901
  this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0], false) + '; ';
48800
48902
  }
@@ -50527,7 +50629,7 @@ class TradutorPython {
50527
50629
  if (funcao.corpo.length > 0) {
50528
50630
  const primeiraDeclaracao = funcao.corpo[0];
50529
50631
  // Se for uma declaração de retorno, extraímos a expressão
50530
- if (primeiraDeclaracao.constructor.name === 'Retorna') {
50632
+ if (primeiraDeclaracao instanceof declaracoes_1.Retorna) {
50531
50633
  const retorna = primeiraDeclaracao;
50532
50634
  if (retorna.valor) {
50533
50635
  expressao = this.dicionarioConstrutos[retorna.valor.constructor.name](retorna.valor);
@@ -50640,14 +50742,14 @@ class TradutorPython {
50640
50742
  traduzirConstrutoBinario(binario) {
50641
50743
  let resultado = '';
50642
50744
  const valorEsquerdo = this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
50643
- if (binario.esquerda.constructor.name === 'Agrupamento')
50745
+ if (binario.esquerda instanceof construtos_1.Agrupamento)
50644
50746
  resultado += '(' + valorEsquerdo + ')';
50645
50747
  else
50646
50748
  resultado += valorEsquerdo;
50647
50749
  let operador = this.traduzirSimboloOperador(binario.operador);
50648
50750
  resultado += ` ${operador} `;
50649
50751
  const valorDireito = this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
50650
- if (binario.direita.constructor.name === 'Agrupamento')
50752
+ if (binario.direita instanceof construtos_1.Agrupamento)
50651
50753
  resultado += '(' + valorDireito + ')';
50652
50754
  else
50653
50755
  resultado += valorDireito;
@@ -51396,6 +51498,7 @@ class TradutorReversoJavaScript {
51396
51498
  LogicalExpression: this.traduzirConstrutoLogico.bind(this),
51397
51499
  MemberExpression: this.traduzirExpressao.bind(this),
51398
51500
  NewExpression: this.traduzirNovo.bind(this),
51501
+ ObjectExpression: this.traduzirConstrutoObjeto.bind(this),
51399
51502
  ThisExpression: () => 'isto',
51400
51503
  UpdateExpression: this.traduzirAtualizacaoVariavel.bind(this),
51401
51504
  // Variavel: this.traduzirConstrutoVariavel.bind(this),
@@ -51471,6 +51574,31 @@ class TradutorReversoJavaScript {
51471
51574
  traduzirIdentificador(identificador) {
51472
51575
  return identificador.name;
51473
51576
  }
51577
+ traduzirConstrutoObjeto(objeto) {
51578
+ if (!objeto.properties.length) {
51579
+ return '{}';
51580
+ }
51581
+ let resultado = '{';
51582
+ for (const propriedade of objeto.properties) {
51583
+ if (propriedade.type === 'SpreadElement') {
51584
+ const spread = propriedade;
51585
+ resultado +=
51586
+ '...' + this.dicionarioConstrutos[spread.argument.type](spread.argument) + ', ';
51587
+ continue;
51588
+ }
51589
+ const propriedadeObjeto = propriedade;
51590
+ const chave = propriedadeObjeto.key.type === 'Identifier'
51591
+ ? `'${propriedadeObjeto.key.name}'`
51592
+ : this.dicionarioConstrutos[propriedadeObjeto.key.type](propriedadeObjeto.key);
51593
+ const valor = this.dicionarioConstrutos[propriedadeObjeto.value.type](propriedadeObjeto.value);
51594
+ resultado += `${chave}: ${valor}, `;
51595
+ }
51596
+ if (objeto.properties.length > 0) {
51597
+ resultado = resultado.slice(0, -2);
51598
+ }
51599
+ resultado += '}';
51600
+ return resultado;
51601
+ }
51474
51602
  traduzirAtualizacaoVariavel(atualizarVariavel) {
51475
51603
  let resultado = '';
51476
51604
  resultado += this.dicionarioConstrutos[atualizarVariavel.argument.constructor.name](atualizarVariavel.argument);
@@ -51527,6 +51655,8 @@ class TradutorReversoJavaScript {
51527
51655
  return 'verdadeiro';
51528
51656
  if (literal.raw === 'false')
51529
51657
  return 'falso';
51658
+ if (literal.value === null || literal.raw === 'null')
51659
+ return 'nulo';
51530
51660
  return `${literal.raw}`;
51531
51661
  }
51532
51662
  traduzirConstrutoBinario(binario) {
@@ -51671,7 +51801,7 @@ class TradutorReversoJavaScript {
51671
51801
  resultado += this.logicaComumBlocoEscopo(declaracao.consequent);
51672
51802
  if (declaracao?.alternate) {
51673
51803
  resultado += 'senao ';
51674
- if (declaracao.alternate.constructor.name === 'BlockStatement') {
51804
+ if (declaracao.alternate.type === 'BlockStatement') {
51675
51805
  const bloco = declaracao.alternate;
51676
51806
  resultado += this.logicaComumBlocoEscopo(bloco);
51677
51807
  return resultado;
@@ -52771,7 +52901,7 @@ class TradutorReversoTenda {
52771
52901
  }
52772
52902
  traduzirDeclaracaoPara(declaracaoPara) {
52773
52903
  let resultado = 'para ';
52774
- if (declaracaoPara.inicializador.constructor.name === 'Array') {
52904
+ if (Array.isArray(declaracaoPara.inicializador)) {
52775
52905
  resultado +=
52776
52906
  this.dicionarioDeclaracoes[declaracaoPara.inicializador[0].constructor.name](declaracaoPara.inicializador[0], false) + '; ';
52777
52907
  }
@@ -53191,7 +53321,7 @@ class TradutorRuby {
53191
53321
  if (funcao.corpo.length > 0) {
53192
53322
  const primeiraDeclaracao = funcao.corpo[0];
53193
53323
  // Se for uma declaração de retorno, extraímos a expressão
53194
- if (primeiraDeclaracao.constructor.name === 'Retorna') {
53324
+ if (primeiraDeclaracao instanceof declaracoes_1.Retorna) {
53195
53325
  const retorna = primeiraDeclaracao;
53196
53326
  if (retorna.valor) {
53197
53327
  expressao = this.dicionarioConstrutos[retorna.valor.constructor.name](retorna.valor);
@@ -53305,14 +53435,14 @@ class TradutorRuby {
53305
53435
  traduzirConstrutoBinario(binario) {
53306
53436
  let resultado = '';
53307
53437
  const valorEsquerdo = this.dicionarioConstrutos[binario.esquerda.constructor.name](binario.esquerda);
53308
- if (binario.esquerda.constructor.name === 'Agrupamento')
53438
+ if (binario.esquerda instanceof construtos_1.Agrupamento)
53309
53439
  resultado += '(' + valorEsquerdo + ')';
53310
53440
  else
53311
53441
  resultado += valorEsquerdo;
53312
53442
  let operador = this.traduzirSimboloOperador(binario.operador);
53313
53443
  resultado += ` ${operador} `;
53314
53444
  const valorDireito = this.dicionarioConstrutos[binario.direita.constructor.name](binario.direita);
53315
- if (binario.direita.constructor.name === 'Agrupamento')
53445
+ if (binario.direita instanceof construtos_1.Agrupamento)
53316
53446
  resultado += '(' + valorDireito + ')';
53317
53447
  else
53318
53448
  resultado += valorDireito;