@designliquido/delegua 1.15.6 → 1.16.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 (47) hide show
  1. package/analisador-semantico/analisador-semantico-base.d.ts +6 -2
  2. package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
  3. package/analisador-semantico/analisador-semantico-base.js +30 -7
  4. package/analisador-semantico/analisador-semantico-base.js.map +1 -1
  5. package/analisador-semantico/analisador-semantico.d.ts +6 -1
  6. package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
  7. package/analisador-semantico/analisador-semantico.js +26 -32
  8. package/analisador-semantico/analisador-semantico.js.map +1 -1
  9. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +6 -1
  10. package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
  11. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +31 -35
  12. package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
  13. package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
  14. package/avaliador-sintatico/avaliador-sintatico.js +19 -6
  15. package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
  16. package/bin/package.json +1 -1
  17. package/declaracoes/classe.d.ts +2 -1
  18. package/declaracoes/classe.d.ts.map +1 -1
  19. package/declaracoes/classe.js +2 -1
  20. package/declaracoes/classe.js.map +1 -1
  21. package/formatadores/formatador-delegua.d.ts.map +1 -1
  22. package/formatadores/formatador-delegua.js +24 -2
  23. package/formatadores/formatador-delegua.js.map +1 -1
  24. package/interpretador/estruturas/descritor-tipo-classe.d.ts +4 -3
  25. package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
  26. package/interpretador/estruturas/descritor-tipo-classe.js +9 -3
  27. package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
  28. package/interpretador/interpretador-base.d.ts.map +1 -1
  29. package/interpretador/interpretador-base.js +3 -2
  30. package/interpretador/interpretador-base.js.map +1 -1
  31. package/lexador/palavras-reservadas.d.ts +1 -0
  32. package/lexador/palavras-reservadas.d.ts.map +1 -1
  33. package/lexador/palavras-reservadas.js +1 -0
  34. package/lexador/palavras-reservadas.js.map +1 -1
  35. package/package.json +1 -1
  36. package/tipos-de-simbolos/delegua.d.ts +1 -0
  37. package/tipos-de-simbolos/delegua.d.ts.map +1 -1
  38. package/tipos-de-simbolos/delegua.js +1 -0
  39. package/tipos-de-simbolos/delegua.js.map +1 -1
  40. package/tradutores/tradutor-elixir.d.ts +1 -0
  41. package/tradutores/tradutor-elixir.d.ts.map +1 -1
  42. package/tradutores/tradutor-elixir.js +31 -9
  43. package/tradutores/tradutor-elixir.js.map +1 -1
  44. package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
  45. package/tradutores/tradutor-mermaidjs.js +3 -2
  46. package/tradutores/tradutor-mermaidjs.js.map +1 -1
  47. package/umd/delegua.js +151 -66
package/umd/delegua.js CHANGED
@@ -5,16 +5,25 @@ exports.AnalisadorSemanticoBase = void 0;
5
5
  const construtos_1 = require("../construtos");
6
6
  const declaracoes_1 = require("../declaracoes");
7
7
  const interfaces_1 = require("../interfaces");
8
+ const quebras_1 = require("../quebras");
9
+ const gerenciador_escopos_1 = require("./gerenciador-escopos");
8
10
  /**
9
11
  * Essa classe só existe para eliminar redundância entre todos os analisadores
10
12
  * semânticos. Por padrão, quando um método não é implementado, ao invés de dar erro,
11
13
  * simplesmente passa por ele (`return Promise.resolve()`).
12
14
  */
13
15
  class AnalisadorSemanticoBase {
16
+ constructor() {
17
+ this.gerenciadorEscopos = new gerenciador_escopos_1.GerenciadorEscopos();
18
+ this.diagnosticos = [];
19
+ }
14
20
  diagnosticoJaExiste(simbolo, mensagem) {
15
- return this.diagnosticos.some((d) => d.linha === simbolo.linha &&
16
- d.mensagem === mensagem &&
17
- d.simbolo.lexema === simbolo.lexema);
21
+ return this.diagnosticos.some((d) => {
22
+ var _a;
23
+ return d.linha === simbolo.linha &&
24
+ d.mensagem === mensagem &&
25
+ ((_a = d.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) === simbolo.lexema;
26
+ });
18
27
  }
19
28
  erro(simbolo, mensagem) {
20
29
  if (this.diagnosticoJaExiste(simbolo, mensagem)) {
@@ -156,6 +165,10 @@ class AnalisadorSemanticoBase {
156
165
  * Marca as variáveis usadas em uma expressão.
157
166
  */
158
167
  marcarVariaveisUsadasEmExpressao(expressao) {
168
+ if (expressao instanceof declaracoes_1.Expressao) {
169
+ this.marcarVariaveisUsadasEmExpressao(expressao.expressao);
170
+ return;
171
+ }
159
172
  if (expressao instanceof construtos_1.Variavel) {
160
173
  this.gerenciadorEscopos.marcarComoUsada(expressao.simbolo.lexema);
161
174
  return;
@@ -202,8 +215,18 @@ class AnalisadorSemanticoBase {
202
215
  }
203
216
  return;
204
217
  }
218
+ if (expressao instanceof construtos_1.Literal && typeof expressao.valor === 'string') {
219
+ this.verificarInterpolacaoTexto(expressao.valor, expressao);
220
+ return;
221
+ }
205
222
  // TODO: Adicionar outros tipos de expressões conforme necessário.
206
223
  }
224
+ /**
225
+ * Stub para ser sobrescrito por subclasses que implementam análise de interpolações.
226
+ */
227
+ verificarInterpolacaoTexto(_texto, _literal) {
228
+ // implementado nas subclasses
229
+ }
207
230
  /**
208
231
  * Analisa se todos os caminhos retornam
209
232
  * @returns true se todos os caminhos retornam, false caso contrário
@@ -390,7 +413,7 @@ class AnalisadorSemanticoBase {
390
413
  return Promise.resolve();
391
414
  }
392
415
  visitarExpressaoContinua(declaracao) {
393
- return null;
416
+ return new quebras_1.ContinuarQuebra();
394
417
  }
395
418
  visitarExpressaoDeChamada(expressao) {
396
419
  return Promise.resolve();
@@ -408,7 +431,7 @@ class AnalisadorSemanticoBase {
408
431
  return Promise.resolve();
409
432
  }
410
433
  visitarExpressaoExpressaoRegular(expressao) {
411
- return;
434
+ return Promise.resolve(new RegExp(''));
412
435
  }
413
436
  visitarDeclaracaoEscrevaMesmaLinha(declaracao) {
414
437
  return Promise.resolve();
@@ -435,13 +458,13 @@ class AnalisadorSemanticoBase {
435
458
  return Promise.resolve();
436
459
  }
437
460
  visitarExpressaoRetornar(declaracao) {
438
- return;
461
+ return Promise.resolve(new quebras_1.RetornoQuebra(null));
439
462
  }
440
463
  visitarExpressaoSuper(expressao) {
441
464
  return Promise.resolve();
442
465
  }
443
466
  visitarExpressaoSustar(declaracao) {
444
- return null;
467
+ return new quebras_1.SustarQuebra();
445
468
  }
446
469
  visitarExpressaoTupla(expressao) {
447
470
  return Promise.resolve();
@@ -458,7 +481,7 @@ class AnalisadorSemanticoBase {
458
481
  }
459
482
  exports.AnalisadorSemanticoBase = AnalisadorSemanticoBase;
460
483
 
461
- },{"../construtos":62,"../declaracoes":110,"../interfaces":149}],2:[function(require,module,exports){
484
+ },{"../construtos":62,"../declaracoes":110,"../interfaces":149,"../quebras":216,"./gerenciador-escopos":5}],2:[function(require,module,exports){
462
485
  "use strict";
463
486
  Object.defineProperty(exports, "__esModule", { value: true });
464
487
  exports.AnalisadorSemantico = void 0;
@@ -466,6 +489,8 @@ const construtos_1 = require("../construtos");
466
489
  const declaracoes_1 = require("../declaracoes");
467
490
  const erros_1 = require("../interfaces/erros");
468
491
  const comum_1 = require("../avaliador-sintatico/comum");
492
+ const micro_avaliador_sintatico_1 = require("../avaliador-sintatico/micro-avaliador-sintatico");
493
+ const micro_lexador_1 = require("../lexador/micro-lexador");
469
494
  const analisador_semantico_base_1 = require("./analisador-semantico-base");
470
495
  const gerenciador_escopos_1 = require("./gerenciador-escopos");
471
496
  const pilha_variaveis_1 = require("./pilha-variaveis");
@@ -475,6 +500,8 @@ const pilha_variaveis_1 = require("./pilha-variaveis");
475
500
  class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemanticoBase {
476
501
  constructor() {
477
502
  super();
503
+ this.microLexador = new micro_lexador_1.MicroLexador();
504
+ this.microAvaliadorSintatico = new micro_avaliador_sintatico_1.MicroAvaliadorSintatico();
478
505
  this.pilhaVariaveis = new pilha_variaveis_1.PilhaVariaveis();
479
506
  this.gerenciadorEscopos = new gerenciador_escopos_1.GerenciadorEscopos();
480
507
  this.funcoes = {};
@@ -1194,40 +1221,24 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1194
1221
  }
1195
1222
  }
1196
1223
  /**
1197
- * Verifica interpolações de texto e marca variáveis como usadas
1224
+ * Verifica interpolações de texto e marca variáveis como usadas,
1225
+ * compreendendo cada expressão interpolada com MicroLexador e MicroAvaliadorSintatico.
1198
1226
  */
1199
1227
  verificarInterpolacaoTexto(texto, literal) {
1200
- // Regex para encontrar ${identificador}
1201
- const regexInterpolacao = /\$\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
1228
+ const regexInterpolacao = /\$\{(.*?)\}/g;
1202
1229
  let match;
1203
1230
  while ((match = regexInterpolacao.exec(texto)) !== null) {
1204
- const nomeVariavel = match[1];
1205
- // Verifica se a variável existe
1206
- const variavel = this.gerenciadorEscopos.buscar(nomeVariavel);
1207
- const funcao = this.funcoes[nomeVariavel];
1208
- if (!variavel && !funcao) {
1209
- this.erro({
1210
- lexema: nomeVariavel,
1211
- tipo: 'IDENTIFICADOR',
1212
- linha: literal.linha,
1213
- hashArquivo: literal.hashArquivo,
1214
- literal: null,
1215
- }, `Variável ou função '${nomeVariavel}' usada em interpolação não existe.`);
1216
- }
1217
- else if (variavel) {
1218
- // Marca como usada
1219
- this.gerenciadorEscopos.marcarComoUsada(nomeVariavel);
1220
- // Verifica se foi inicializada
1221
- if (!variavel.inicializada) {
1222
- this.aviso({
1223
- lexema: nomeVariavel,
1224
- tipo: 'IDENTIFICADOR',
1225
- linha: literal.linha,
1226
- hashArquivo: literal.hashArquivo,
1227
- literal: null,
1228
- }, `Variável '${nomeVariavel}' usada em interpolação pode não ter sido inicializada.`);
1231
+ const expressaoInterpolacao = match[1].trim();
1232
+ try {
1233
+ const retornoMicroLexador = this.microLexador.mapear(expressaoInterpolacao);
1234
+ const retornoMicro = this.microAvaliadorSintatico.analisar(retornoMicroLexador, literal.linha);
1235
+ for (const construto of retornoMicro.declaracoes) {
1236
+ this.marcarVariaveisUsadasEmExpressao(construto);
1229
1237
  }
1230
1238
  }
1239
+ catch (_) {
1240
+ // Erros de sintaxe na interpolação são tratados em tempo de execução
1241
+ }
1231
1242
  }
1232
1243
  }
1233
1244
  async visitarDeclaracaoEscreva(declaracao) {
@@ -1485,12 +1496,18 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1485
1496
  }
1486
1497
  this.classesDeclaradas.add(declaracao.simbolo.lexema);
1487
1498
  this.classesRegistradas.set(declaracao.simbolo.lexema, declaracao);
1488
- // Visita corpos dos métodos com contexto de classe ativo
1499
+ // Visita corpos dos métodos com contexto de classe ativo.
1500
+ // Métodos abstratos implícitos e métodos de classes estrangeiras têm corpo vazio —
1501
+ // não há declarações para visitar.
1489
1502
  const classeAnterior = this.classeAtualEmAnalise;
1490
1503
  this.classeAtualEmAnalise = declaracao;
1491
- for (const metodo of declaracao.metodos) {
1492
- for (const stmt of metodo.funcao.corpo) {
1493
- await stmt.aceitar(this);
1504
+ if (!declaracao.estrangeira) {
1505
+ for (const metodo of declaracao.metodos) {
1506
+ if (metodo.abstrato)
1507
+ continue;
1508
+ for (const stmt of metodo.funcao.corpo) {
1509
+ await stmt.aceitar(this);
1510
+ }
1494
1511
  }
1495
1512
  }
1496
1513
  this.classeAtualEmAnalise = classeAnterior;
@@ -1623,7 +1640,7 @@ class AnalisadorSemantico extends analisador_semantico_base_1.AnalisadorSemantic
1623
1640
  }
1624
1641
  exports.AnalisadorSemantico = AnalisadorSemantico;
1625
1642
 
1626
- },{"../avaliador-sintatico/comum":11,"../construtos":62,"../declaracoes":110,"../interfaces/erros":146,"./analisador-semantico-base":1,"./gerenciador-escopos":5,"./pilha-variaveis":7}],3:[function(require,module,exports){
1643
+ },{"../avaliador-sintatico/comum":11,"../avaliador-sintatico/micro-avaliador-sintatico":24,"../construtos":62,"../declaracoes":110,"../interfaces/erros":146,"../lexador/micro-lexador":213,"./analisador-semantico-base":1,"./gerenciador-escopos":5,"./pilha-variaveis":7}],3:[function(require,module,exports){
1627
1644
  "use strict";
1628
1645
  Object.defineProperty(exports, "__esModule", { value: true });
1629
1646
 
@@ -4058,12 +4075,15 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4058
4075
  }
4059
4076
  async declaracaoDeClasse() {
4060
4077
  var _a;
4061
- // Modificadores opcionais no nível da classe: `abstrata` e/ou `estática`.
4062
- // Sintaxe: `classe abstrata NomeDaClasse` ou `classe estática NomeDaClasse`.
4078
+ // Modificadores opcionais no nível da classe: `abstrata`, `estrangeira` e/ou `estática`.
4079
+ // Sintaxe: `classe abstrata NomeDaClasse`, `classe estrangeira NomeDaClasse`, etc.
4063
4080
  let ehAbstrata = false;
4081
+ let ehEstrangeira = false;
4064
4082
  let ehEstatica = false;
4065
4083
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ABSTRATO))
4066
4084
  ehAbstrata = true;
4085
+ if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ESTRANGEIRA))
4086
+ ehEstrangeira = true;
4067
4087
  if (this.verificarSeSimboloAtualEIgualA(delegua_2.default.ESTATICO))
4068
4088
  ehEstatica = true;
4069
4089
  // Também permite a ordem invertida: `classe estática abstrata`
@@ -4206,7 +4226,6 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4206
4226
  params = await this.logicaComumParametros();
4207
4227
  }
4208
4228
  this.consumir(delegua_2.default.PARENTESE_DIREITO, "Esperado ')' após parâmetros do método.");
4209
- const ehAbstrato = ehAbstratoPadrao;
4210
4229
  // Tipo de retorno opcional (igual a corpoDaFuncao())
4211
4230
  let tipoRetorno = 'qualquer';
4212
4231
  let definicaoExplicitaDeTipo = false;
@@ -4215,10 +4234,21 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4215
4234
  this.avancarEDevolverAnterior();
4216
4235
  definicaoExplicitaDeTipo = true;
4217
4236
  }
4237
+ // Método de classe estrangeira não pode ter corpo.
4238
+ if (ehEstrangeira &&
4239
+ this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA)) {
4240
+ throw this.erro(this.simbolos[this.atual], "Métodos de classe estrangeira não podem ter corpo.");
4241
+ }
4242
+ // Método é abstrato quando: (a) está dentro de um bloco `abstrato {}`,
4243
+ // ou (b) a classe é abstrata/estrangeira e o próximo token não é `{`.
4244
+ const ehAbstrato = ehAbstratoPadrao ||
4245
+ ehEstrangeira ||
4246
+ (ehAbstrata &&
4247
+ !this.verificarTipoSimboloAtual(delegua_2.default.CHAVE_ESQUERDA));
4218
4248
  if (ehAbstrato) {
4219
- // Método abstrato: sem corpo
4249
+ // Método abstrato/estrangeiro: sem corpo
4220
4250
  this.verificarSeSimboloAtualEIgualA(delegua_2.default.PONTO_E_VIRGULA);
4221
- const corpoVazio = new construtos_1.FuncaoConstruto(this.hashArquivo, nomeMetodo.linha, params, [], tipoRetorno);
4251
+ const corpoVazio = new construtos_1.FuncaoConstruto(this.hashArquivo, nomeMetodo.linha, params, [], tipoRetorno, definicaoExplicitaDeTipo);
4222
4252
  const metodoAbstrato = new declaracoes_1.FuncaoDeclaracao(nomeMetodo, corpoVazio, tipoRetorno);
4223
4253
  metodoAbstrato.estatico = ehEstatico;
4224
4254
  metodoAbstrato.abstrato = true;
@@ -4416,7 +4446,7 @@ class AvaliadorSintatico extends avaliador_sintatico_base_1.AvaliadorSintaticoBa
4416
4446
  }
4417
4447
  }
4418
4448
  }
4419
- const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasses, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstatica, implementaInterfaces, mesclas);
4449
+ const definicaoClasse = new declaracoes_1.Classe(simbolo, superClasses, metodos, propriedades, pilhaDecoradoresClasse, ehAbstrata, ehEstrangeira, ehEstatica, implementaInterfaces, mesclas);
4420
4450
  this.tiposDefinidosEmCodigo[definicaoClasse.simbolo.lexema] = definicaoClasse;
4421
4451
  this.superclasseAtual = undefined;
4422
4452
  return definicaoClasse;
@@ -14335,7 +14365,7 @@ class Classe extends declaracao_1.Declaracao {
14335
14365
  var _a;
14336
14366
  return (_a = this.superClasses[0]) !== null && _a !== void 0 ? _a : null;
14337
14367
  }
14338
- constructor(simbolo, superClasses = [], metodos, propriedades = [], decoradores = [], abstrata = false, classeEstatica = false, implementa = [], mesclas = []) {
14368
+ constructor(simbolo, superClasses = [], metodos, propriedades = [], decoradores = [], abstrata = false, estrangeira = false, classeEstatica = false, implementa = [], mesclas = []) {
14339
14369
  super(Number(simbolo.linha), simbolo.hashArquivo);
14340
14370
  this.simbolo = simbolo;
14341
14371
  this.superClasses = superClasses;
@@ -14344,6 +14374,7 @@ class Classe extends declaracao_1.Declaracao {
14344
14374
  this.propriedades = propriedades;
14345
14375
  this.decoradores = decoradores;
14346
14376
  this.abstrata = abstrata;
14377
+ this.estrangeira = estrangeira;
14347
14378
  this.classeEstatica = classeEstatica;
14348
14379
  this.implementa = implementa;
14349
14380
  }
@@ -16002,7 +16033,12 @@ class FormatadorDelegua {
16002
16033
  return '';
16003
16034
  }
16004
16035
  visitarDeclaracaoClasse(declaracao) {
16005
- this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}classe ${declaracao.simbolo.lexema} {${this.quebraLinha}`;
16036
+ const modificador = declaracao.estrangeira
16037
+ ? 'estrangeira '
16038
+ : declaracao.abstrata
16039
+ ? 'abstrata '
16040
+ : '';
16041
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}classe ${modificador}${declaracao.simbolo.lexema} {${this.quebraLinha}`;
16006
16042
  this.indentacaoAtual += this.tamanhoIndentacao;
16007
16043
  for (let propriedade of declaracao.propriedades) {
16008
16044
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}${propriedade.nome.lexema}: ${propriedade.tipo || 'qualquer'}${this.quebraLinha}`;
@@ -16010,7 +16046,24 @@ class FormatadorDelegua {
16010
16046
  this.codigoFormatado += `${this.quebraLinha}`;
16011
16047
  for (let metodo of declaracao.metodos) {
16012
16048
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}${metodo.simbolo.lexema}`;
16013
- this.visitarExpressaoFuncaoConstruto(metodo.funcao);
16049
+ if (declaracao.estrangeira) {
16050
+ // Métodos estrangeiros: emitir apenas a assinatura, sem corpo.
16051
+ this.codigoFormatado += `(`;
16052
+ for (let argumento of metodo.funcao.parametros) {
16053
+ this.codigoFormatado += `${argumento.nome.lexema}: ${argumento.tipoDado || 'qualquer'}, `;
16054
+ }
16055
+ if (metodo.funcao.parametros.length > 0) {
16056
+ this.codigoFormatado = this.codigoFormatado.slice(0, -2);
16057
+ }
16058
+ this.codigoFormatado += `)`;
16059
+ if (metodo.funcao.tipoExplicito && metodo.funcao.tipo) {
16060
+ this.codigoFormatado += `: ${metodo.funcao.tipo}`;
16061
+ }
16062
+ this.codigoFormatado += this.quebraLinha;
16063
+ }
16064
+ else {
16065
+ this.visitarExpressaoFuncaoConstruto(metodo.funcao);
16066
+ }
16014
16067
  }
16015
16068
  this.indentacaoAtual -= this.tamanhoIndentacao;
16016
16069
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
@@ -18483,6 +18536,7 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
18483
18536
  }
18484
18537
  constructor(simboloOriginal, superClasses, metodos, propriedades) {
18485
18538
  super();
18539
+ this.dialetoRequerExpansaoPropriedadesEspacoMemoria = false;
18486
18540
  this.simboloOriginal = simboloOriginal;
18487
18541
  if (Array.isArray(superClasses)) {
18488
18542
  this.superClasses = superClasses;
@@ -18504,6 +18558,7 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
18504
18558
  this.propriedades = propriedades || [];
18505
18559
  this.dialetoRequerDeclaracaoPropriedades = false;
18506
18560
  this.abstrata = false;
18561
+ this.estrangeira = false;
18507
18562
  this.classeEstatica = false;
18508
18563
  this.metodosAbstratos = [];
18509
18564
  this.acessoMetodos = {};
@@ -18526,7 +18581,7 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
18526
18581
  }
18527
18582
  }
18528
18583
  if (candidato === null) {
18529
- throw new excecoes_1.ErroEmTempoDeExecucao(null, 'Hierarquia de classes inconsistente: não foi possível calcular o OReM (C3).');
18584
+ throw new excecoes_1.ErroEmTempoDeExecucao(undefined, 'Hierarquia de classes inconsistente: não foi possível calcular o OReM (C3).');
18530
18585
  }
18531
18586
  resultado.push(candidato);
18532
18587
  for (const lista of listas) {
@@ -18674,6 +18729,7 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
18674
18729
  return new metodo_polimorfico_1.MetodoPolimorfico(nome, todasSobrecargas);
18675
18730
  }
18676
18731
  encontrarPropriedade(nome) {
18732
+ var _a;
18677
18733
  if (nome in this.propriedades) {
18678
18734
  return this.propriedades[nome];
18679
18735
  }
@@ -18683,7 +18739,7 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
18683
18739
  }
18684
18740
  }
18685
18741
  if (this.dialetoRequerDeclaracaoPropriedades) {
18686
- throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Propriedade "${nome}" não declarada na classe ${this.simboloOriginal.lexema}.`);
18742
+ throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Propriedade "${nome}" não declarada na classe ${(_a = this.simboloOriginal) === null || _a === void 0 ? void 0 : _a.lexema}.`);
18687
18743
  }
18688
18744
  return undefined;
18689
18745
  }
@@ -18714,13 +18770,16 @@ class DescritorTipoClasse extends chamavel_1.Chamavel {
18714
18770
  return inicializador ? inicializador.aridade() : 0;
18715
18771
  }
18716
18772
  async chamar(visitante, argumentos) {
18717
- var _a, _b;
18773
+ var _a, _b, _c;
18718
18774
  if (this.classeEstatica) {
18719
18775
  throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Não é possível instanciar a classe estática '${(_a = this.simboloOriginal) === null || _a === void 0 ? void 0 : _a.lexema}'.`);
18720
18776
  }
18721
18777
  if (this.abstrata) {
18722
18778
  throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Não é possível instanciar a classe abstrata '${(_b = this.simboloOriginal) === null || _b === void 0 ? void 0 : _b.lexema}'.`);
18723
18779
  }
18780
+ if (this.estrangeira) {
18781
+ throw new excecoes_1.ErroEmTempoDeExecucao(this.simboloOriginal, `Não é possível instanciar a classe estrangeira '${(_c = this.simboloOriginal) === null || _c === void 0 ? void 0 : _c.lexema}' diretamente.`);
18782
+ }
18724
18783
  const instancia = new objeto_delegua_classe_1.ObjetoDeleguaClasse(this);
18725
18784
  const inicializador = this.encontrarMetodo('construtor');
18726
18785
  if (inicializador) {
@@ -21101,6 +21160,7 @@ class InterpretadorBase {
21101
21160
  descritorTipoClasse.obtenedoresEstaticos = obtenedoresEstaticos;
21102
21161
  descritorTipoClasse.definidoresEstaticos = definidoresEstaticos;
21103
21162
  descritorTipoClasse.abstrata = declaracao.abstrata;
21163
+ descritorTipoClasse.estrangeira = declaracao.estrangeira;
21104
21164
  descritorTipoClasse.classeEstatica = declaracao.classeEstatica;
21105
21165
  descritorTipoClasse.metodosAbstratos = metodosAbstratos;
21106
21166
  descritorTipoClasse.acessoMetodos = acessoMetodos;
@@ -21141,9 +21201,9 @@ class InterpretadorBase {
21141
21201
  }
21142
21202
  // Verifica se a subclasse concreta implementa todos os métodos abstratos
21143
21203
  // da(s) superclasse(s) abstrata(s).
21144
- if (!declaracao.abstrata) {
21204
+ if (!declaracao.abstrata && !declaracao.estrangeira) {
21145
21205
  for (const superClasse of superClassesResolvidas) {
21146
- if (superClasse.abstrata) {
21206
+ if (superClasse.abstrata || superClasse.estrangeira) {
21147
21207
  superClasse.verificarImplementacaoAbstrata(descritorTipoClasse);
21148
21208
  }
21149
21209
  }
@@ -27579,6 +27639,7 @@ exports.palavrasReservadasDelegua = {
27579
27639
  enquanto: delegua_1.default.ENQUANTO,
27580
27640
  extensao: delegua_1.default.EXTENSAO,
27581
27641
  extensão: delegua_1.default.EXTENSAO,
27642
+ estrangeira: delegua_1.default.ESTRANGEIRA,
27582
27643
  estatica: delegua_1.default.ESTATICO,
27583
27644
  estática: delegua_1.default.ESTATICO,
27584
27645
  estatico: delegua_1.default.ESTATICO,
@@ -27912,6 +27973,7 @@ exports.default = {
27912
27973
  DOIS_PONTOS: 'DOIS_PONTOS',
27913
27974
  E: 'E',
27914
27975
  ELVIS: 'ELVIS',
27976
+ ESTRANGEIRA: 'ESTRANGEIRA',
27915
27977
  EXTENSAO: 'EXTENSAO',
27916
27978
  EM: 'EM',
27917
27979
  ENQUANTO: 'ENQUANTO',
@@ -44620,6 +44682,17 @@ class TradutorElixir {
44620
44682
  converterNomeModulo(nome) {
44621
44683
  return nome.charAt(0).toUpperCase() + nome.slice(1);
44622
44684
  }
44685
+ mapearTipoParaTypespec(tipo) {
44686
+ switch (tipo) {
44687
+ case 'texto': return 'String.t()';
44688
+ case 'numero':
44689
+ case 'inteiro': return 'integer()';
44690
+ case 'real': return 'float()';
44691
+ case 'logico': return 'boolean()';
44692
+ case 'vazio': return 'no_return()';
44693
+ default: return 'term()';
44694
+ }
44695
+ }
44623
44696
  /**
44624
44697
  * Gera nome único para variável temporária
44625
44698
  */
@@ -44704,16 +44777,27 @@ class TradutorElixir {
44704
44777
  this.aumentarIndentacao();
44705
44778
  const moduloAnterior = this.moduloAtual;
44706
44779
  this.moduloAtual = nomeModulo;
44707
- // Extrair campos do struct do construtor
44708
- const camposStruct = await this.extrairCamposStruct(declaracao);
44709
- if (camposStruct.length > 0) {
44710
- resultado += this.adicionarIndentacao();
44711
- resultado += `defstruct [${camposStruct.join(', ')}]\n\n`;
44780
+ if (declaracao.estrangeira) {
44781
+ // Classe estrangeira: emitir @callback para cada método, definindo a interface esperada do módulo.
44782
+ resultado += this.adicionarIndentacao() + `@moduledoc "Classe estrangeira — implementação externa."\n`;
44783
+ for (const metodo of declaracao.metodos) {
44784
+ const params = metodo.funcao.parametros.map(() => 'term()').join(', ');
44785
+ const retorno = this.mapearTipoParaTypespec(metodo.funcao.tipo);
44786
+ resultado += this.adicionarIndentacao() + `@callback ${metodo.simbolo.lexema}(${params}) :: ${retorno}\n`;
44787
+ }
44712
44788
  }
44713
- // Traduzir métodos
44714
- for (const metodo of declaracao.metodos) {
44715
- const traducaoMetodo = await this.traduzirMetodoClasse(metodo, nomeModulo);
44716
- resultado += traducaoMetodo + '\n\n';
44789
+ else {
44790
+ // Extrair campos do struct do construtor
44791
+ const camposStruct = await this.extrairCamposStruct(declaracao);
44792
+ if (camposStruct.length > 0) {
44793
+ resultado += this.adicionarIndentacao();
44794
+ resultado += `defstruct [${camposStruct.join(', ')}]\n\n`;
44795
+ }
44796
+ // Traduzir métodos
44797
+ for (const metodo of declaracao.metodos) {
44798
+ const traducaoMetodo = await this.traduzirMetodoClasse(metodo, nomeModulo);
44799
+ resultado += traducaoMetodo + '\n\n';
44800
+ }
44717
44801
  }
44718
44802
  this.diminuirIndentacao();
44719
44803
  resultado += this.adicionarIndentacao() + 'end';
@@ -46315,9 +46399,10 @@ class TradutorMermaidJs {
46315
46399
  : undefined;
46316
46400
  const linha = declaracao.linha;
46317
46401
  // Cria arestas de entrada e saída para a classe
46318
- const textoInicio = `Classe${nomeClasse}Inicio[Início: Classe ${nomeClasse}]`;
46402
+ const rotulo = declaracao.estrangeira ? 'Classe Estrangeira' : 'Classe';
46403
+ const textoInicio = `Classe${nomeClasse}Inicio[Início: ${rotulo} ${nomeClasse}]`;
46319
46404
  const arestaInicial = new mermaid_1.ArestaFluxograma(declaracao, textoInicio);
46320
- const textoFim = `Classe${nomeClasse}Fim[Fim: Classe ${nomeClasse}]`;
46405
+ const textoFim = `Classe${nomeClasse}Fim[Fim: ${rotulo} ${nomeClasse}]`;
46321
46406
  const arestaFinal = new mermaid_1.ArestaFluxograma(declaracao, textoFim);
46322
46407
  // Cria o subgrafo da classe
46323
46408
  const subgrafo = new mermaid_1.SubgrafoClasse(nomeClasse, linha, arestaInicial, arestaFinal, superClasse);