@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.
- package/analisador-semantico/analisador-semantico-base.d.ts +6 -2
- package/analisador-semantico/analisador-semantico-base.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico-base.js +30 -7
- package/analisador-semantico/analisador-semantico-base.js.map +1 -1
- package/analisador-semantico/analisador-semantico.d.ts +6 -1
- package/analisador-semantico/analisador-semantico.d.ts.map +1 -1
- package/analisador-semantico/analisador-semantico.js +26 -32
- package/analisador-semantico/analisador-semantico.js.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts +6 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.d.ts.map +1 -1
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js +31 -35
- package/analisador-semantico/dialetos/analisador-semantico-pitugues.js.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.d.ts.map +1 -1
- package/avaliador-sintatico/avaliador-sintatico.js +19 -6
- package/avaliador-sintatico/avaliador-sintatico.js.map +1 -1
- package/bin/package.json +1 -1
- package/declaracoes/classe.d.ts +2 -1
- package/declaracoes/classe.d.ts.map +1 -1
- package/declaracoes/classe.js +2 -1
- package/declaracoes/classe.js.map +1 -1
- package/formatadores/formatador-delegua.d.ts.map +1 -1
- package/formatadores/formatador-delegua.js +24 -2
- package/formatadores/formatador-delegua.js.map +1 -1
- package/interpretador/estruturas/descritor-tipo-classe.d.ts +4 -3
- package/interpretador/estruturas/descritor-tipo-classe.d.ts.map +1 -1
- package/interpretador/estruturas/descritor-tipo-classe.js +9 -3
- package/interpretador/estruturas/descritor-tipo-classe.js.map +1 -1
- package/interpretador/interpretador-base.d.ts.map +1 -1
- package/interpretador/interpretador-base.js +3 -2
- package/interpretador/interpretador-base.js.map +1 -1
- package/lexador/palavras-reservadas.d.ts +1 -0
- package/lexador/palavras-reservadas.d.ts.map +1 -1
- package/lexador/palavras-reservadas.js +1 -0
- package/lexador/palavras-reservadas.js.map +1 -1
- package/package.json +1 -1
- package/tipos-de-simbolos/delegua.d.ts +1 -0
- package/tipos-de-simbolos/delegua.d.ts.map +1 -1
- package/tipos-de-simbolos/delegua.js +1 -0
- package/tipos-de-simbolos/delegua.js.map +1 -1
- package/tradutores/tradutor-elixir.d.ts +1 -0
- package/tradutores/tradutor-elixir.d.ts.map +1 -1
- package/tradutores/tradutor-elixir.js +31 -9
- package/tradutores/tradutor-elixir.js.map +1 -1
- package/tradutores/tradutor-mermaidjs.d.ts.map +1 -1
- package/tradutores/tradutor-mermaidjs.js +3 -2
- package/tradutores/tradutor-mermaidjs.js.map +1 -1
- 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) =>
|
|
16
|
-
|
|
17
|
-
d.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
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
|
-
|
|
1492
|
-
for (const
|
|
1493
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
44708
|
-
|
|
44709
|
-
|
|
44710
|
-
|
|
44711
|
-
|
|
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
|
-
|
|
44714
|
-
|
|
44715
|
-
const
|
|
44716
|
-
|
|
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
|
|
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:
|
|
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);
|