@designliquido/delegua 1.18.1 → 1.18.2

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 (24) hide show
  1. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  2. package/analisador-semantico/analisador-semantico.js +21 -2
  3. package/analisador-semantico/analisador-semantico.js.map +1 -1
  4. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +1 -1
  5. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  6. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  7. package/avaliador-sintatico/avaliador-sintatico.js +19 -2
  8. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  9. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js +8 -8
  10. package/avaliador-sintatico/dialetos/avaliador-sintatico-pitugues.js.map +1 -1
  11. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts +1 -1
  12. package/bibliotecas/dialetos/pitugues/biblioteca-global.d.ts.map +1 -1
  13. package/bibliotecas/dialetos/pitugues/biblioteca-global.js +19 -19
  14. package/bibliotecas/dialetos/pitugues/biblioteca-global.js.map +1 -1
  15. package/bin/package.json +2 -2
  16. package/interpretador/dialetos/pitugues/comum.d.ts.map +1 -1
  17. package/interpretador/dialetos/pitugues/comum.js +78 -158
  18. package/interpretador/dialetos/pitugues/comum.js.map +1 -1
  19. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts +1 -0
  20. package/interpretador/dialetos/pitugues/interpretador-pitugues.d.ts.map +1 -1
  21. package/interpretador/dialetos/pitugues/interpretador-pitugues.js +9 -0
  22. package/interpretador/dialetos/pitugues/interpretador-pitugues.js.map +1 -1
  23. package/package.json +2 -2
  24. package/umd/delegua.js +48 -12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@designliquido/delegua",
3
- "version": "1.18.1",
3
+ "version": "1.18.2",
4
4
  "description": "Linguagem de programação simples e moderna usando português estruturado.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -102,7 +102,7 @@
102
102
  "jest": "^30.0.2",
103
103
  "jest-coverage-badges": "^1.1.2",
104
104
  "prettier": "^3.5.3",
105
- "release-it": "^19.0.3",
105
+ "release-it": "^20.0.0",
106
106
  "rimraf": "^6.0.1",
107
107
  "ts-jest": "^29.3.0",
108
108
  "ts-node": "^10.9.2",
package/umd/delegua.js CHANGED
@@ -822,6 +822,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
822
822
  visitarDeclaracaoEscolha(declaracao) {
823
823
  const identificadorOuLiteral = declaracao.identificadorOuLiteral;
824
824
  const tipo = identificadorOuLiteral.tipo || 'qualquer';
825
+ const tiposLiteraisCasos = [];
825
826
  for (let caminho of declaracao.caminhos) {
826
827
  for (let condicao of caminho.condicoes) {
827
828
  switch (condicao.constructor) {
@@ -830,7 +831,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
830
831
  const tiposNumericos = ['inteiro', 'número', 'real'];
831
832
  const ambosSaoNumericos = tiposNumericos.includes(condicaoLiteral.tipo) &&
832
833
  tiposNumericos.includes(tipo);
833
- if (condicaoLiteral.tipo !== tipo && !ambosSaoNumericos) {
834
+ if (condicaoLiteral.tipo !== tipo && !ambosSaoNumericos && tipo !== 'qualquer') {
834
835
  this.erro({
835
836
  lexema: condicaoLiteral.valor,
836
837
  tipo: condicaoLiteral.tipo,
@@ -838,6 +839,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
838
839
  hashArquivo: condicaoLiteral.hashArquivo,
839
840
  }, `'caso ${condicaoLiteral.valor}:' não é do mesmo tipo esperado em 'escolha' (esperado: ${tipo}, atual: ${condicaoLiteral.tipo}).`);
840
841
  }
842
+ tiposLiteraisCasos.push(condicaoLiteral.tipo);
841
843
  break;
842
844
  case construtos_1.Variavel:
843
845
  const condicaoVariavel = condicao;
@@ -850,6 +852,23 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
850
852
  }
851
853
  }
852
854
  }
855
+ if (tipo === 'qualquer' && tiposLiteraisCasos.length > 0 && identificadorOuLiteral instanceof construtos_1.Variavel) {
856
+ const tiposUnicos = [...new Set(tiposLiteraisCasos)];
857
+ if (tiposUnicos.length === 1) {
858
+ const tipoInferido = tiposUnicos[0];
859
+ const variavelEscopo = this.gerenciadorEscopos.buscar(identificadorOuLiteral.simbolo.lexema);
860
+ if (variavelEscopo) {
861
+ this.sugestao(identificadorOuLiteral.simbolo, `Um tipo melhor pode ser inferido para '${identificadorOuLiteral.simbolo.lexema}': '${tipoInferido}'`, [{
862
+ titulo: `Alterar tipo de '${identificadorOuLiteral.simbolo.lexema}' para '${tipoInferido}'`,
863
+ textoOriginal: 'qualquer',
864
+ textoSubstituto: tipoInferido,
865
+ linha: variavelEscopo.linha,
866
+ colunaInicio: 0,
867
+ colunaFim: 0,
868
+ }]);
869
+ }
870
+ }
871
+ }
853
872
  return Promise.resolve();
854
873
  }
855
874
  async visitarDeclaracaoEnquanto(declaracao) {
@@ -1277,7 +1296,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1277
1296
  this.erro(argumento.simbolo, `Variável ou função '${argumento.simbolo.lexema}' não existe.`);
1278
1297
  continue;
1279
1298
  }
1280
- if (possivelVariavel && possivelVariavel.valor === undefined) {
1299
+ if (possivelVariavel && !possivelVariavel.inicializada) {
1281
1300
  this.aviso(argumento.simbolo, `Variável '${argumento.simbolo.lexema}' não foi inicializada.`);
1282
1301
  }
1283
1302
  }
@@ -3823,9 +3842,26 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
3823
3842
  // Isso ocorre quando a importação é feita de uma biblioteca Node.js.
3824
3843
  // Nesse caso, o tipo de `entidadeChamada.objeto` começa com uma letra maiúscula.
3825
3844
  if (entidadeChamada.objeto.tipo && entidadeChamada.objeto.tipo.match(/^[A-Z]/)) {
3826
- const tipoCorrespondente = this.tiposDefinidosPorBibliotecas[entidadeChamada.objeto.tipo];
3845
+ const tipoObjeto = entidadeChamada.objeto.tipo;
3846
+ // Classe definida em código (local ou importada de arquivo .delegua) tem precedência.
3847
+ if (tipoObjeto in this.tiposDefinidosEmCodigo) {
3848
+ const classeDefinida = this.tiposDefinidosEmCodigo[tipoObjeto];
3849
+ if (classeDefinida instanceof declaracoes_1.Classe) {
3850
+ const nomeMembro = entidadeChamada.simbolo.lexema;
3851
+ const metodo = classeDefinida.metodos?.find(m => m.simbolo.lexema === nomeMembro);
3852
+ if (metodo) {
3853
+ return metodo.tipo || 'qualquer';
3854
+ }
3855
+ const propriedade = classeDefinida.propriedades?.find(p => p.nome.lexema === nomeMembro);
3856
+ if (propriedade) {
3857
+ return propriedade.tipo || 'qualquer';
3858
+ }
3859
+ return 'qualquer';
3860
+ }
3861
+ }
3862
+ const tipoCorrespondente = this.tiposDefinidosPorBibliotecas[tipoObjeto];
3827
3863
  if (!tipoCorrespondente) {
3828
- throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Tipo '${entidadeChamada.objeto.tipo}' não foi encontrado entre os tipos definidos por bibliotecas.`);
3864
+ throw new erro_avaliador_sintatico_1.ErroAvaliadorSintatico(entidadeChamada.simbolo, `Tipo '${tipoObjeto}' não foi encontrado entre os tipos definidos por bibliotecas.`);
3829
3865
  }
3830
3866
  if (!(entidadeChamada.simbolo.lexema in tipoCorrespondente.metodos) &&
3831
3867
  !(entidadeChamada.simbolo.lexema in tipoCorrespondente.propriedades)) {
@@ -7414,7 +7450,7 @@ class AvaliadorSintaticoPitugues {
7414
7450
  this.pilhaEscopos.empilhar(new informacao_escopo_1.InformacaoEscopo());
7415
7451
  // Funções nativas de Delégua (e de Pituguês também, por enquanto)
7416
7452
  this.pilhaEscopos.definirInformacoesVariavel('aleatorio', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio', 'número'));
7417
- this.pilhaEscopos.definirInformacoesVariavel('aleatorioEntre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorioEntre', 'número', true, [
7453
+ this.pilhaEscopos.definirInformacoesVariavel('aleatorio_entre', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('aleatorio_entre', 'número', true, [
7418
7454
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('minimo', 'número'),
7419
7455
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('maximo', 'número'),
7420
7456
  ]));
@@ -7430,19 +7466,19 @@ class AvaliadorSintaticoPitugues {
7430
7466
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
7431
7467
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
7432
7468
  ]));
7433
- this.pilhaEscopos.definirInformacoesVariavel('encontrarIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarIndice', 'inteiro', true, [
7469
+ this.pilhaEscopos.definirInformacoesVariavel('encontrar_indice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrar_indice', 'inteiro', true, [
7434
7470
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
7435
7471
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
7436
7472
  ]));
7437
- this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimo', 'inteiro', true, [
7473
+ this.pilhaEscopos.definirInformacoesVariavel('encontrar_ultimo', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrar_ultimo', 'inteiro', true, [
7438
7474
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
7439
7475
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
7440
7476
  ]));
7441
- this.pilhaEscopos.definirInformacoesVariavel('encontrarUltimoIndice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrarUltimoIndice', 'inteiro', true, [
7477
+ this.pilhaEscopos.definirInformacoesVariavel('encontrar_ultimo_indice', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('encontrar_ultimo_indice', 'inteiro', true, [
7442
7478
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
7443
7479
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoPesquisa', 'função'),
7444
7480
  ]));
7445
- this.pilhaEscopos.definirInformacoesVariavel('filtrarPor', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('filtrarPor', 'qualquer[]', true, [
7481
+ this.pilhaEscopos.definirInformacoesVariavel('filtrar_por', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('filtrar_por', 'qualquer[]', true, [
7446
7482
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
7447
7483
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
7448
7484
  ]));
@@ -7481,11 +7517,11 @@ class AvaliadorSintaticoPitugues {
7481
7517
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
7482
7518
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoOrdenacao', 'função'),
7483
7519
  ]));
7484
- this.pilhaEscopos.definirInformacoesVariavel('paraCada', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('paraCada', 'qualquer[]', true, [
7520
+ this.pilhaEscopos.definirInformacoesVariavel('para_cada', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('para_cada', 'qualquer[]', true, [
7485
7521
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
7486
7522
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
7487
7523
  ]));
7488
- this.pilhaEscopos.definirInformacoesVariavel('primeiroEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('primeiroEmCondicao', 'qualquer', true, [
7524
+ this.pilhaEscopos.definirInformacoesVariavel('primeiro_em_condicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('primeiro_em_condicao', 'qualquer', true, [
7489
7525
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('vetor', 'qualquer[]'),
7490
7526
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoFiltragem', 'função'),
7491
7527
  ]));
@@ -7512,7 +7548,7 @@ class AvaliadorSintaticoPitugues {
7512
7548
  this.pilhaEscopos.definirInformacoesVariavel('todos', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todos', 'lógico', true, [
7513
7549
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
7514
7550
  ]));
7515
- this.pilhaEscopos.definirInformacoesVariavel('todosEmCondicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todosEmCondicao', 'lógico', true, [
7551
+ this.pilhaEscopos.definirInformacoesVariavel('todos_em_condicao', new informacao_elemento_sintatico_1.InformacaoElementoSintatico('todos_em_condicao', 'lógico', true, [
7516
7552
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('iteravel', 'qualquer'),
7517
7553
  new informacao_elemento_sintatico_1.InformacaoElementoSintatico('funcaoCondicional', 'função'),
7518
7554
  ]));