@designliquido/portugol-studio 0.9.18 → 0.10.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.
@@ -8,6 +8,7 @@ const declaracoes_1 = require("@designliquido/delegua/declaracoes");
8
8
  const construtos_1 = require("@designliquido/delegua/construtos");
9
9
  const matriz_1 = require("../construtos/matriz");
10
10
  const limpa_1 = require("../construtos/limpa");
11
+ const quebras_1 = require("@designliquido/delegua/quebras");
11
12
  const lexico_regular_1 = __importDefault(require("../tipos-de-simbolos/lexico-regular"));
12
13
  class FormatadorPortugolStudio {
13
14
  constructor(quebraLinha, tamanhoIndentacao = 4) {
@@ -19,41 +20,93 @@ class FormatadorPortugolStudio {
19
20
  this.deveIndentar = true;
20
21
  this.ultimaLinhaFormatada = -1;
21
22
  }
22
- /* istanbul ignore next */
23
23
  visitarExpressaoTuplaN(expressao) {
24
- throw new Error('Método não implementado.');
24
+ var _a;
25
+ const valores = (_a = expressao === null || expressao === void 0 ? void 0 : expressao.valores) !== null && _a !== void 0 ? _a : [];
26
+ this.codigoFormatado += '(';
27
+ for (let i = 0; i < valores.length; i++) {
28
+ this.formatarDeclaracaoOuConstruto(valores[i]);
29
+ if (i < valores.length - 1) {
30
+ this.codigoFormatado += ', ';
31
+ }
32
+ }
33
+ this.codigoFormatado += ')';
25
34
  }
26
- /* istanbul ignore next */
27
35
  visitarExpressaoAcessoIntervaloVariavel(expressao) {
28
- throw new Error('Método não implementado.');
36
+ var _a, _b, _c, _d;
37
+ const entidade = (_a = expressao.entidadeChamada) !== null && _a !== void 0 ? _a : expressao.objeto;
38
+ const indiceInicial = (_b = expressao.indiceInicial) !== null && _b !== void 0 ? _b : expressao.inicio;
39
+ const indiceFinal = (_c = expressao.indiceFinal) !== null && _c !== void 0 ? _c : expressao.fim;
40
+ if (entidade) {
41
+ if (((_d = entidade === null || entidade === void 0 ? void 0 : entidade.simbolo) === null || _d === void 0 ? void 0 : _d.lexema) && entidade.constructor === Object) {
42
+ this.codigoFormatado += entidade.simbolo.lexema;
43
+ }
44
+ else {
45
+ this.formatarDeclaracaoOuConstruto(entidade);
46
+ }
47
+ }
48
+ this.codigoFormatado += '[';
49
+ if (indiceInicial) {
50
+ this.formatarDeclaracaoOuConstruto(indiceInicial);
51
+ }
52
+ this.codigoFormatado += '..';
53
+ if (indiceFinal) {
54
+ this.formatarDeclaracaoOuConstruto(indiceFinal);
55
+ }
56
+ this.codigoFormatado += ']';
29
57
  }
30
- /* istanbul ignore next */
31
58
  visitarDeclaracaoTextoDocumentacao(declaracao) {
32
- throw new Error('Método não implementado.');
59
+ var _a;
60
+ const conteudo = (_a = declaracao === null || declaracao === void 0 ? void 0 : declaracao.texto) !== null && _a !== void 0 ? _a : declaracao === null || declaracao === void 0 ? void 0 : declaracao.conteudo;
61
+ if (!conteudo) {
62
+ return;
63
+ }
64
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}// ${String(conteudo).replace(/\s+/g, ' ')}${this.quebraLinha}`;
33
65
  }
34
- /* istanbul ignore next */
35
66
  visitarExpressaoComentario(expressao) {
36
- throw new Error('Método não implementado.');
67
+ const conteudo = expressao === null || expressao === void 0 ? void 0 : expressao.conteudo;
68
+ if (conteudo) {
69
+ this.codigoFormatado += `/* ${String(conteudo).replace(/\s+/g, ' ')} */`;
70
+ }
37
71
  }
38
- /* istanbul ignore next */
39
72
  visitarExpressaoSeparador(expressao) {
40
- throw new Error('Método não implementado.');
73
+ const valor = expressao === null || expressao === void 0 ? void 0 : expressao.valor;
74
+ this.codigoFormatado += typeof valor === 'string' ? valor : ', ';
41
75
  }
42
- /* istanbul ignore next */
43
76
  visitarExpressaoArgumentoReferenciaFuncao(expressao) {
44
- throw new Error('Método não implementado.');
77
+ var _a, _b;
78
+ const argumento = (_b = (_a = expressao === null || expressao === void 0 ? void 0 : expressao.valor) !== null && _a !== void 0 ? _a : expressao === null || expressao === void 0 ? void 0 : expressao.argumento) !== null && _b !== void 0 ? _b : expressao;
79
+ if (argumento && argumento !== expressao) {
80
+ this.formatarDeclaracaoOuConstruto(argumento);
81
+ }
45
82
  }
46
- /* istanbul ignore next */
47
83
  visitarExpressaoReferenciaFuncao(expressao) {
48
- throw new Error('Método não implementado.');
84
+ const simbolo = expressao === null || expressao === void 0 ? void 0 : expressao.simbolo;
85
+ const nome = expressao === null || expressao === void 0 ? void 0 : expressao.nome;
86
+ if (simbolo === null || simbolo === void 0 ? void 0 : simbolo.lexema) {
87
+ this.codigoFormatado += simbolo.lexema;
88
+ return;
89
+ }
90
+ if (typeof nome === 'string') {
91
+ this.codigoFormatado += nome;
92
+ }
49
93
  }
50
- /* istanbul ignore next */
51
94
  visitarExpressaoAcessoMetodoOuPropriedade(expressao) {
52
- throw new Error('Método não implementado.');
95
+ this.visitarExpressaoAcessoMetodo(expressao);
53
96
  }
54
- /* istanbul ignore next */
55
97
  visitarExpressaoAcessoPropriedade(expressao) {
56
- throw new Error('Método não implementado.');
98
+ const objeto = expressao.objeto || expressao.entidadeChamada;
99
+ const simbolo = expressao.simbolo || expressao.nome;
100
+ if (objeto) {
101
+ this.formatarDeclaracaoOuConstruto(objeto);
102
+ }
103
+ if (simbolo === null || simbolo === void 0 ? void 0 : simbolo.lexema) {
104
+ this.codigoFormatado += `.${simbolo.lexema}`;
105
+ return;
106
+ }
107
+ if (typeof simbolo === 'string') {
108
+ this.codigoFormatado += `.${simbolo}`;
109
+ }
57
110
  }
58
111
  visitarDeclaracaoComentario(declaracao) {
59
112
  if (declaracao.multilinha) {
@@ -83,25 +136,52 @@ class FormatadorPortugolStudio {
83
136
  }
84
137
  }
85
138
  }
86
- /* istanbul ignore next */
87
139
  visitarDeclaracaoTendoComo(declaracao) {
88
- throw new Error('Método não implementado.');
140
+ const inicializacao = declaracao === null || declaracao === void 0 ? void 0 : declaracao.inicializacao;
141
+ const corpo = declaracao === null || declaracao === void 0 ? void 0 : declaracao.corpo;
142
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}tendo`;
143
+ if (inicializacao) {
144
+ this.codigoFormatado += ' (';
145
+ this.formatarDeclaracaoOuConstruto(inicializacao);
146
+ this.codigoFormatado += ')';
147
+ }
148
+ this.codigoFormatado += ` {${this.quebraLinha}`;
149
+ if (corpo === null || corpo === void 0 ? void 0 : corpo.declaracoes) {
150
+ this.formatarBlocoOuVetorDeclaracoes(corpo.declaracoes);
151
+ }
152
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
89
153
  }
90
- /* istanbul ignore next */
91
154
  visitarDeclaracaoInicioAlgoritmo(declaracao) {
92
- throw new Error('Método não implementado.');
155
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}inicio_algoritmo${this.quebraLinha}`;
156
+ return Promise.resolve();
93
157
  }
94
- /* istanbul ignore next */
95
158
  visitarDeclaracaoCabecalhoPrograma(declaracao) {
96
- throw new Error('Método não implementado.');
159
+ return Promise.resolve();
97
160
  }
98
- /* istanbul ignore next */
99
161
  visitarExpressaoTupla(expressao) {
100
- throw new Error('Método não implementado');
162
+ var _a;
163
+ const valores = (_a = expressao === null || expressao === void 0 ? void 0 : expressao.valores) !== null && _a !== void 0 ? _a : [];
164
+ this.codigoFormatado += '(';
165
+ for (let i = 0; i < valores.length; i++) {
166
+ this.formatarDeclaracaoOuConstruto(valores[i]);
167
+ if (i < valores.length - 1) {
168
+ this.codigoFormatado += ', ';
169
+ }
170
+ }
171
+ this.codigoFormatado += ')';
172
+ return Promise.resolve();
101
173
  }
102
- /* istanbul ignore next */
103
174
  visitarDeclaracaoClasse(declaracao) {
104
- throw new Error('Método não implementado');
175
+ var _a, _b, _c;
176
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}classe ${(_b = (_a = declaracao.simbolo) === null || _a === void 0 ? void 0 : _a.lexema) !== null && _b !== void 0 ? _b : ''}${this.quebraLinha}`;
177
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}{${this.quebraLinha}`;
178
+ const metodos = (_c = declaracao.metodos) !== null && _c !== void 0 ? _c : [];
179
+ this.indentacaoAtual += this.tamanhoIndentacao;
180
+ for (const metodo of metodos) {
181
+ this.formatarDeclaracaoOuConstruto(metodo);
182
+ }
183
+ this.indentacaoAtual -= this.tamanhoIndentacao;
184
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
105
185
  }
106
186
  visitarDeclaracaoConst(declaracao) {
107
187
  if (declaracao.inicializador) {
@@ -124,9 +204,20 @@ class FormatadorPortugolStudio {
124
204
  this.codigoFormatado += this.quebraLinha;
125
205
  }
126
206
  }
127
- /* istanbul ignore next */
128
207
  visitarDeclaracaoConstMultiplo(declaracao) {
129
- throw new Error('Método não implementado');
208
+ var _a, _b, _c, _d, _e;
209
+ const inicializadores = (_a = declaracao.inicializadores) !== null && _a !== void 0 ? _a : [];
210
+ const simbolos = (_b = declaracao.simbolos) !== null && _b !== void 0 ? _b : [];
211
+ const tipo = (_c = declaracao.tipo) !== null && _c !== void 0 ? _c : '';
212
+ for (let i = 0; i < simbolos.length; i++) {
213
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}const ${tipo} ${(_e = (_d = simbolos[i]) === null || _d === void 0 ? void 0 : _d.lexema) !== null && _e !== void 0 ? _e : simbolos[i]}`;
214
+ if (inicializadores[i] !== undefined) {
215
+ this.codigoFormatado += ' = ';
216
+ this.formatarDeclaracaoOuConstruto(inicializadores[i]);
217
+ }
218
+ this.codigoFormatado += this.quebraLinha;
219
+ }
220
+ return Promise.resolve();
130
221
  }
131
222
  visitarExpressaoDeAtribuicao(expressao) {
132
223
  if (expressao.valor instanceof construtos_1.Binario &&
@@ -154,7 +245,24 @@ class FormatadorPortugolStudio {
154
245
  this.formatarDeclaracaoOuConstruto(declaracao.expressao);
155
246
  }
156
247
  visitarDeclaracaoDefinicaoFuncao(declaracao) {
157
- this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}funcao ${declaracao.simbolo.lexema}()${this.quebraLinha}`;
248
+ var _a;
249
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}funcao `;
250
+ if (declaracao.tipo && declaracao.tipo !== 'qualquer') {
251
+ this.codigoFormatado += `${declaracao.tipo} `;
252
+ }
253
+ this.codigoFormatado += `${declaracao.simbolo.lexema}(`;
254
+ const parametros = (_a = declaracao.funcao.parametros) !== null && _a !== void 0 ? _a : [];
255
+ for (let i = 0; i < parametros.length; i++) {
256
+ const param = parametros[i];
257
+ if (param.tipoDado) {
258
+ this.codigoFormatado += `${param.tipoDado} `;
259
+ }
260
+ this.codigoFormatado += param.nome.lexema;
261
+ if (i < parametros.length - 1) {
262
+ this.codigoFormatado += ', ';
263
+ }
264
+ }
265
+ this.codigoFormatado += `)${this.quebraLinha}`;
158
266
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}{${this.quebraLinha}`;
159
267
  this.visitarExpressaoFuncaoConstruto(declaracao.funcao);
160
268
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
@@ -168,6 +276,7 @@ class FormatadorPortugolStudio {
168
276
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
169
277
  }
170
278
  visitarDeclaracaoEscolha(declaracao) {
279
+ var _a, _b;
171
280
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}escolha `;
172
281
  this.formatarDeclaracaoOuConstruto(declaracao.identificadorOuLiteral);
173
282
  this.codigoFormatado += ` {${this.quebraLinha}`;
@@ -184,11 +293,12 @@ class FormatadorPortugolStudio {
184
293
  this.formatarDeclaracaoOuConstruto(declaracoes);
185
294
  }
186
295
  }
187
- for (let padrao of declaracao.caminhoPadrao.declaracoes) {
188
- this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}caso contrario:`;
189
- this.codigoFormatado += this.quebraLinha;
190
- this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}`;
191
- this.formatarDeclaracaoOuConstruto(padrao);
296
+ if ((_b = (_a = declaracao.caminhoPadrao) === null || _a === void 0 ? void 0 : _a.declaracoes) === null || _b === void 0 ? void 0 : _b.length) {
297
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}caso contrario:${this.quebraLinha}`;
298
+ for (let padrao of declaracao.caminhoPadrao.declaracoes) {
299
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}`;
300
+ this.formatarDeclaracaoOuConstruto(padrao);
301
+ }
192
302
  }
193
303
  this.indentacaoAtual -= this.tamanhoIndentacao;
194
304
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
@@ -281,9 +391,8 @@ class FormatadorPortugolStudio {
281
391
  this.indentacaoAtual -= this.tamanhoIndentacao;
282
392
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
283
393
  }
284
- /* istanbul ignore next */
285
394
  visitarDeclaracaoParaCada(declaracao) {
286
- throw new Error('Método não implementado');
395
+ throw new Error("Construto 'para cada' não é suportado no dialeto Portugol Studio.");
287
396
  }
288
397
  visitarDeclaracaoSe(declaracao) {
289
398
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}se (`;
@@ -300,9 +409,8 @@ class FormatadorPortugolStudio {
300
409
  }
301
410
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}}${this.quebraLinha}`;
302
411
  }
303
- /* istanbul ignore next */
304
412
  visitarDeclaracaoTente(declaracao) {
305
- throw new Error('Método não implementado');
413
+ throw new Error("Construto 'tente/pegue/finalmente' não é suportado no dialeto Portugol Studio.");
306
414
  }
307
415
  visitarDeclaracaoVar(declaracao) {
308
416
  if (declaracao.tipo) {
@@ -356,9 +464,20 @@ class FormatadorPortugolStudio {
356
464
  this.formatarDeclaracaoOuConstruto(declaracao.inicializador);
357
465
  }
358
466
  }
359
- /* istanbul ignore next */
360
467
  visitarDeclaracaoVarMultiplo(declaracao) {
361
- throw new Error('Método não implementado');
468
+ var _a, _b, _c, _d, _e;
469
+ const inicializadores = (_a = declaracao.inicializadores) !== null && _a !== void 0 ? _a : [];
470
+ const simbolos = (_b = declaracao.simbolos) !== null && _b !== void 0 ? _b : [];
471
+ const tipo = (_c = declaracao.tipo) !== null && _c !== void 0 ? _c : '';
472
+ for (let i = 0; i < simbolos.length; i++) {
473
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}${tipo} ${(_e = (_d = simbolos[i]) === null || _d === void 0 ? void 0 : _d.lexema) !== null && _e !== void 0 ? _e : simbolos[i]}`;
474
+ if (inicializadores[i] !== undefined) {
475
+ this.codigoFormatado += ' = ';
476
+ this.formatarDeclaracaoOuConstruto(inicializadores[i]);
477
+ }
478
+ this.codigoFormatado += this.quebraLinha;
479
+ }
480
+ return Promise.resolve();
362
481
  }
363
482
  visitarExpressaoAcessoIndiceVariavel(expressao) {
364
483
  this.formatarDeclaracaoOuConstruto(expressao.entidadeChamada);
@@ -368,7 +487,22 @@ class FormatadorPortugolStudio {
368
487
  }
369
488
  /* istanbul ignore next */
370
489
  visitarExpressaoAcessoElementoMatriz(expressao) {
371
- throw new Error('Método não implementado');
490
+ var _a, _b, _c;
491
+ const entidade = (_a = expressao === null || expressao === void 0 ? void 0 : expressao.entidadeChamada) !== null && _a !== void 0 ? _a : expressao === null || expressao === void 0 ? void 0 : expressao.objeto;
492
+ const indices = (_b = expressao === null || expressao === void 0 ? void 0 : expressao.indices) !== null && _b !== void 0 ? _b : [expressao === null || expressao === void 0 ? void 0 : expressao.indicePrimario, expressao === null || expressao === void 0 ? void 0 : expressao.indiceSecundario].filter(Boolean);
493
+ if (entidade) {
494
+ if (((_c = entidade === null || entidade === void 0 ? void 0 : entidade.simbolo) === null || _c === void 0 ? void 0 : _c.lexema) && entidade.constructor === Object) {
495
+ this.codigoFormatado += entidade.simbolo.lexema;
496
+ }
497
+ else {
498
+ this.formatarDeclaracaoOuConstruto(entidade);
499
+ }
500
+ }
501
+ for (const indice of indices) {
502
+ this.codigoFormatado += '[';
503
+ this.formatarDeclaracaoOuConstruto(indice);
504
+ this.codigoFormatado += ']';
505
+ }
372
506
  }
373
507
  visitarExpressaoAcessoMetodo(expressao) {
374
508
  this.formatarDeclaracaoOuConstruto(expressao.objeto);
@@ -387,21 +521,31 @@ class FormatadorPortugolStudio {
387
521
  this.formatarDeclaracaoOuConstruto(expressao.valor);
388
522
  this.codigoFormatado += this.quebraLinha;
389
523
  }
390
- /* istanbul ignore next */
391
524
  visitarExpressaoAtribuicaoPorIndicesMatriz(expressao) {
392
- throw new Error('Método não implementado');
525
+ this.visitarExpressaoAcessoElementoMatriz(expressao);
526
+ this.codigoFormatado += ' = ';
527
+ this.formatarDeclaracaoOuConstruto(expressao === null || expressao === void 0 ? void 0 : expressao.valor);
528
+ this.codigoFormatado += this.quebraLinha;
529
+ return Promise.resolve();
393
530
  }
394
531
  visitarExpressaoBinaria(expressao) {
532
+ var _a;
395
533
  this.formatarDeclaracaoOuConstruto(expressao.esquerda);
396
534
  switch (expressao.operador.tipo) {
397
535
  case lexico_regular_1.default.ADICAO:
398
536
  this.codigoFormatado += ' + ';
399
537
  break;
538
+ case lexico_regular_1.default.DIFERENTE:
539
+ this.codigoFormatado += ' != ';
540
+ break;
400
541
  case lexico_regular_1.default.DIVISAO:
401
542
  this.codigoFormatado += ' / ';
402
543
  break;
544
+ case lexico_regular_1.default.DIVISAO_IGUAL:
545
+ this.codigoFormatado += ' /= ';
546
+ break;
403
547
  case lexico_regular_1.default.DIVISAO_INTEIRA:
404
- this.codigoFormatado += ' ';
548
+ this.codigoFormatado += ' \\ ';
405
549
  break;
406
550
  case lexico_regular_1.default.IGUAL:
407
551
  this.codigoFormatado += ' = ';
@@ -415,23 +559,32 @@ class FormatadorPortugolStudio {
415
559
  case lexico_regular_1.default.MAIOR_IGUAL:
416
560
  this.codigoFormatado += ' >= ';
417
561
  break;
562
+ case lexico_regular_1.default.MAIS_IGUAL:
563
+ this.codigoFormatado += ' += ';
564
+ break;
418
565
  case lexico_regular_1.default.MENOR:
419
566
  this.codigoFormatado += ' < ';
420
567
  break;
421
568
  case lexico_regular_1.default.MENOR_IGUAL:
422
569
  this.codigoFormatado += ' <= ';
423
570
  break;
424
- case lexico_regular_1.default.SUBTRACAO:
425
- this.codigoFormatado += ` - `;
571
+ case lexico_regular_1.default.MENOS_IGUAL:
572
+ this.codigoFormatado += ' -= ';
426
573
  break;
427
574
  case lexico_regular_1.default.MULTIPLICACAO:
428
575
  this.codigoFormatado += ` * `;
429
576
  break;
577
+ case lexico_regular_1.default.MULTIPLICACAO_IGUAL:
578
+ this.codigoFormatado += ' *= ';
579
+ break;
430
580
  case lexico_regular_1.default.MODULO:
431
581
  this.codigoFormatado += ` % `;
432
582
  break;
583
+ case lexico_regular_1.default.SUBTRACAO:
584
+ this.codigoFormatado += ` - `;
585
+ break;
433
586
  default:
434
- console.log(expressao.operador.tipo);
587
+ this.codigoFormatado += ` ${(_a = expressao.operador.lexema) !== null && _a !== void 0 ? _a : ''} `;
435
588
  break;
436
589
  }
437
590
  this.formatarDeclaracaoOuConstruto(expressao.direita);
@@ -441,7 +594,11 @@ class FormatadorPortugolStudio {
441
594
  }
442
595
  /* istanbul ignore next */
443
596
  visitarExpressaoContinua(declaracao) {
444
- throw new Error('Método não implementado');
597
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}continue`;
598
+ if (this.devePularLinha) {
599
+ this.codigoFormatado += this.quebraLinha;
600
+ }
601
+ return new quebras_1.ContinuarQuebra();
445
602
  }
446
603
  visitarExpressaoDeChamada(expressao) {
447
604
  this.formatarDeclaracaoOuConstruto(expressao.entidadeChamada);
@@ -454,36 +611,72 @@ class FormatadorPortugolStudio {
454
611
  }
455
612
  this.codigoFormatado += ')';
456
613
  }
457
- /* istanbul ignore next */
458
614
  visitarExpressaoDefinirValor(expressao) {
459
- throw new Error('Método não implementado');
615
+ var _a, _b, _c;
616
+ const objeto = (_a = expressao === null || expressao === void 0 ? void 0 : expressao.objeto) !== null && _a !== void 0 ? _a : expressao === null || expressao === void 0 ? void 0 : expressao.entidadeChamada;
617
+ const nomePropriedade = (_c = (_b = expressao === null || expressao === void 0 ? void 0 : expressao.nome) !== null && _b !== void 0 ? _b : expressao === null || expressao === void 0 ? void 0 : expressao.simbolo) !== null && _c !== void 0 ? _c : expressao === null || expressao === void 0 ? void 0 : expressao.propriedade;
618
+ const valor = expressao === null || expressao === void 0 ? void 0 : expressao.valor;
619
+ if (objeto) {
620
+ this.formatarDeclaracaoOuConstruto(objeto);
621
+ }
622
+ if (nomePropriedade === null || nomePropriedade === void 0 ? void 0 : nomePropriedade.lexema) {
623
+ this.codigoFormatado += `.${nomePropriedade.lexema}`;
624
+ }
625
+ else if (typeof nomePropriedade === 'string') {
626
+ this.codigoFormatado += `.${nomePropriedade}`;
627
+ }
628
+ this.codigoFormatado += ' = ';
629
+ this.formatarDeclaracaoOuConstruto(valor);
630
+ if (this.devePularLinha) {
631
+ this.codigoFormatado += this.quebraLinha;
632
+ }
460
633
  }
461
- /* istanbul ignore next */
462
634
  visitarExpressaoDeleguaFuncao(expressao) {
463
- throw new Error('Método não implementado');
635
+ const simbolo = expressao === null || expressao === void 0 ? void 0 : expressao.simbolo;
636
+ if (simbolo === null || simbolo === void 0 ? void 0 : simbolo.lexema) {
637
+ this.codigoFormatado += simbolo.lexema;
638
+ return;
639
+ }
640
+ this.codigoFormatado += 'funcao';
464
641
  }
465
642
  visitarExpressaoDeVariavel(expressao) {
466
643
  this.codigoFormatado += `${expressao.simbolo.lexema}`;
467
644
  }
468
- /* istanbul ignore next */
469
645
  visitarExpressaoDicionario(expressao) {
470
- throw new Error('Método não implementado');
646
+ var _a, _b;
647
+ const chaves = (_a = expressao === null || expressao === void 0 ? void 0 : expressao.chaves) !== null && _a !== void 0 ? _a : [];
648
+ const valores = (_b = expressao === null || expressao === void 0 ? void 0 : expressao.valores) !== null && _b !== void 0 ? _b : [];
649
+ this.codigoFormatado += '{';
650
+ for (let i = 0; i < chaves.length; i++) {
651
+ this.formatarDeclaracaoOuConstruto(chaves[i]);
652
+ this.codigoFormatado += ': ';
653
+ this.formatarDeclaracaoOuConstruto(valores[i]);
654
+ if (i < chaves.length - 1) {
655
+ this.codigoFormatado += ', ';
656
+ }
657
+ }
658
+ this.codigoFormatado += '}';
471
659
  }
472
- /* istanbul ignore next */
473
660
  visitarExpressaoExpressaoRegular(expressao) {
474
- throw new Error('Método não implementado');
661
+ throw new Error("Construto de expressão regular não é suportado no dialeto Portugol Studio.");
475
662
  }
476
- /* istanbul ignore next */
477
663
  visitarExpressaoFalhar(expressao) {
478
- throw new Error('Método não implementado');
664
+ throw new Error("Construto 'falhar' não é suportado no dialeto Portugol Studio.");
479
665
  }
480
666
  /* istanbul ignore next */
481
667
  visitarExpressaoFimPara(declaracao) {
482
- throw new Error('Método não implementado');
668
+ return;
483
669
  }
484
- /* istanbul ignore next */
485
670
  visitarExpressaoFormatacaoEscrita(declaracao) {
486
- throw new Error('Método não implementado');
671
+ var _a, _b;
672
+ const expressao = (_b = (_a = declaracao.expressao) !== null && _a !== void 0 ? _a : declaracao.valor) !== null && _b !== void 0 ? _b : declaracao;
673
+ if (expressao && expressao !== declaracao) {
674
+ this.formatarDeclaracaoOuConstruto(expressao);
675
+ return;
676
+ }
677
+ if (declaracao.hasOwnProperty('casasDecimais')) {
678
+ this.codigoFormatado += `${declaracao.casasDecimais}`;
679
+ }
487
680
  }
488
681
  visitarExpressaoFuncaoConstruto(expressao) {
489
682
  this.indentacaoAtual += this.tamanhoIndentacao;
@@ -498,7 +691,7 @@ class FormatadorPortugolStudio {
498
691
  }
499
692
  /* istanbul ignore next */
500
693
  visitarExpressaoIsto(expressao) {
501
- throw new Error('Método não implementado');
694
+ this.codigoFormatado += 'isto';
502
695
  }
503
696
  visitarExpressaoLeia(expressao) {
504
697
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}leia(`;
@@ -537,9 +730,21 @@ class FormatadorPortugolStudio {
537
730
  }
538
731
  this.codigoFormatado += `${expressao.valor}`;
539
732
  }
540
- /* istanbul ignore next */
541
733
  visitarExpressaoLogica(expressao) {
542
- throw new Error('Método não implementado');
734
+ var _a;
735
+ this.formatarDeclaracaoOuConstruto(expressao.esquerda);
736
+ switch (expressao.operador.tipo) {
737
+ case lexico_regular_1.default.E:
738
+ this.codigoFormatado += ' e ';
739
+ break;
740
+ case lexico_regular_1.default.OU:
741
+ this.codigoFormatado += ' ou ';
742
+ break;
743
+ default:
744
+ this.codigoFormatado += ` ${(_a = expressao.operador.lexema) !== null && _a !== void 0 ? _a : ''} `;
745
+ break;
746
+ }
747
+ this.formatarDeclaracaoOuConstruto(expressao.direita);
543
748
  }
544
749
  visitarExpressaoRetornar(declaracao) {
545
750
  this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}retorne`;
@@ -551,17 +756,28 @@ class FormatadorPortugolStudio {
551
756
  }
552
757
  /* istanbul ignore next */
553
758
  visitarExpressaoSuper(expressao) {
554
- throw new Error('Método não implementado');
759
+ this.codigoFormatado += 'super';
555
760
  }
556
761
  /* istanbul ignore next */
557
762
  visitarExpressaoSustar(declaracao) {
558
- throw new Error('Método não implementado');
763
+ this.codigoFormatado += `${' '.repeat(this.indentacaoAtual)}pare`;
764
+ if (this.devePularLinha) {
765
+ this.codigoFormatado += this.quebraLinha;
766
+ }
767
+ return new quebras_1.SustarQuebra();
559
768
  }
560
769
  /* istanbul ignore next */
561
770
  visitarExpressaoTipoDe(expressao) {
562
- throw new Error('Método não implementado');
771
+ this.codigoFormatado += 'tipo';
772
+ if (expressao === null || expressao === void 0 ? void 0 : expressao.valor) {
773
+ this.codigoFormatado += '(';
774
+ this.formatarDeclaracaoOuConstruto(expressao.valor);
775
+ this.codigoFormatado += ')';
776
+ }
777
+ return Promise.resolve();
563
778
  }
564
779
  visitarExpressaoUnaria(expressao) {
780
+ var _a;
565
781
  let operador;
566
782
  switch (expressao.operador.tipo) {
567
783
  case lexico_regular_1.default.INCREMENTAR:
@@ -573,8 +789,11 @@ class FormatadorPortugolStudio {
573
789
  case lexico_regular_1.default.NEGACAO:
574
790
  operador = 'nao ';
575
791
  break;
792
+ case lexico_regular_1.default.SUBTRACAO:
793
+ operador = '-';
794
+ break;
576
795
  default:
577
- console.log(expressao.operador.tipo);
796
+ operador = (_a = expressao.operador.lexema) !== null && _a !== void 0 ? _a : '';
578
797
  break;
579
798
  }
580
799
  switch (expressao.incidenciaOperador) {
@@ -607,12 +826,24 @@ class FormatadorPortugolStudio {
607
826
  case construtos_1.AcessoIndiceVariavel:
608
827
  this.visitarExpressaoAcessoIndiceVariavel(declaracaoOuConstruto);
609
828
  break;
829
+ /* istanbul ignore next */
830
+ case construtos_1.AcessoIntervaloVariavel:
831
+ this.visitarExpressaoAcessoIntervaloVariavel(declaracaoOuConstruto);
832
+ break;
610
833
  case construtos_1.AcessoMetodoOuPropriedade:
611
- this.visitarExpressaoAcessoMetodo(declaracaoOuConstruto);
834
+ this.visitarExpressaoAcessoMetodoOuPropriedade(declaracaoOuConstruto);
835
+ break;
836
+ /* istanbul ignore next */
837
+ case construtos_1.AcessoPropriedade:
838
+ this.visitarExpressaoAcessoPropriedade(declaracaoOuConstruto);
612
839
  break;
613
840
  case construtos_1.Agrupamento:
614
841
  this.visitarExpressaoAgrupamento(declaracaoOuConstruto);
615
842
  break;
843
+ /* istanbul ignore next */
844
+ case construtos_1.ArgumentoReferenciaFuncao:
845
+ this.visitarExpressaoArgumentoReferenciaFuncao(declaracaoOuConstruto);
846
+ break;
616
847
  case construtos_1.AtribuicaoPorIndice:
617
848
  this.visitarExpressaoAtribuicaoPorIndice(declaracaoOuConstruto);
618
849
  break;
@@ -628,12 +859,18 @@ class FormatadorPortugolStudio {
628
859
  case construtos_1.Chamada:
629
860
  this.visitarExpressaoDeChamada(declaracaoOuConstruto);
630
861
  break;
862
+ /* istanbul ignore next */
631
863
  case declaracoes_1.Classe:
632
864
  this.visitarDeclaracaoClasse(declaracaoOuConstruto);
633
865
  break;
634
866
  case declaracoes_1.Comentario:
635
867
  this.visitarDeclaracaoComentario(declaracaoOuConstruto);
636
868
  break;
869
+ /* istanbul ignore next */
870
+ case construtos_1.ComentarioComoConstruto:
871
+ this.visitarExpressaoComentario(declaracaoOuConstruto);
872
+ break;
873
+ /* istanbul ignore next */
637
874
  case declaracoes_1.Continua:
638
875
  this.visitarExpressaoContinua(declaracaoOuConstruto);
639
876
  break;
@@ -649,6 +886,7 @@ class FormatadorPortugolStudio {
649
886
  case declaracoes_1.Enquanto:
650
887
  this.visitarDeclaracaoEnquanto(declaracaoOuConstruto);
651
888
  break;
889
+ /* istanbul ignore next */
652
890
  case declaracoes_1.Escreva:
653
891
  this.visitarDeclaracaoEscreva(declaracaoOuConstruto);
654
892
  break;
@@ -658,15 +896,18 @@ class FormatadorPortugolStudio {
658
896
  case declaracoes_1.Expressao:
659
897
  this.visitarDeclaracaoDeExpressao(declaracaoOuConstruto);
660
898
  break;
899
+ /* istanbul ignore next */
661
900
  case construtos_1.ExpressaoRegular:
662
901
  this.visitarExpressaoExpressaoRegular(declaracaoOuConstruto);
663
902
  break;
903
+ /* istanbul ignore next */
664
904
  case declaracoes_1.Falhar:
665
905
  this.visitarExpressaoFalhar(declaracaoOuConstruto);
666
906
  break;
667
907
  case declaracoes_1.Fazer:
668
908
  this.visitarDeclaracaoFazer(declaracaoOuConstruto);
669
909
  break;
910
+ /* istanbul ignore next */
670
911
  case construtos_1.FuncaoConstruto:
671
912
  this.visitarExpressaoFuncaoConstruto(declaracaoOuConstruto);
672
913
  break;
@@ -676,9 +917,11 @@ class FormatadorPortugolStudio {
676
917
  case declaracoes_1.Importar:
677
918
  this.visitarDeclaracaoImportar(declaracaoOuConstruto);
678
919
  break;
920
+ /* istanbul ignore next */
679
921
  case construtos_1.ImportarComoConstruto:
680
922
  this.visitarExpressaoImportarComoConstruto(declaracaoOuConstruto);
681
923
  break;
924
+ /* istanbul ignore next */
682
925
  case construtos_1.Isto:
683
926
  this.visitarExpressaoIsto(declaracaoOuConstruto);
684
927
  break;
@@ -700,6 +943,7 @@ class FormatadorPortugolStudio {
700
943
  case declaracoes_1.Para:
701
944
  this.visitarDeclaracaoPara(declaracaoOuConstruto);
702
945
  break;
946
+ /* istanbul ignore next */
703
947
  case declaracoes_1.ParaCada:
704
948
  this.visitarDeclaracaoParaCada(declaracaoOuConstruto);
705
949
  break;
@@ -709,15 +953,19 @@ class FormatadorPortugolStudio {
709
953
  case declaracoes_1.Se:
710
954
  this.visitarDeclaracaoSe(declaracaoOuConstruto);
711
955
  break;
956
+ /* istanbul ignore next */
712
957
  case construtos_1.Super:
713
958
  this.visitarExpressaoSuper(declaracaoOuConstruto);
714
959
  break;
960
+ /* istanbul ignore next */
715
961
  case declaracoes_1.Sustar:
716
962
  this.visitarExpressaoSustar(declaracaoOuConstruto);
717
963
  break;
964
+ /* istanbul ignore next */
718
965
  case declaracoes_1.Tente:
719
966
  this.visitarDeclaracaoTente(declaracaoOuConstruto);
720
967
  break;
968
+ /* istanbul ignore next */
721
969
  case construtos_1.TipoDe:
722
970
  this.visitarExpressaoTipoDe(declaracaoOuConstruto);
723
971
  break;
@@ -727,15 +975,47 @@ class FormatadorPortugolStudio {
727
975
  case declaracoes_1.Const:
728
976
  this.visitarDeclaracaoConst(declaracaoOuConstruto);
729
977
  break;
978
+ /* istanbul ignore next */
979
+ case declaracoes_1.ConstMultiplo:
980
+ this.visitarDeclaracaoConstMultiplo(declaracaoOuConstruto);
981
+ break;
982
+ case construtos_1.FimPara:
983
+ this.visitarExpressaoFimPara(declaracaoOuConstruto);
984
+ break;
730
985
  case declaracoes_1.Var:
731
986
  this.visitarDeclaracaoVar(declaracaoOuConstruto);
732
987
  break;
988
+ /* istanbul ignore next */
989
+ case declaracoes_1.VarMultiplo:
990
+ this.visitarDeclaracaoVarMultiplo(declaracaoOuConstruto);
991
+ break;
733
992
  case construtos_1.Variavel:
734
993
  this.visitarExpressaoDeVariavel(declaracaoOuConstruto);
735
994
  break;
995
+ /* istanbul ignore next */
996
+ case construtos_1.ReferenciaFuncao:
997
+ this.visitarExpressaoReferenciaFuncao(declaracaoOuConstruto);
998
+ break;
999
+ /* istanbul ignore next */
1000
+ case construtos_1.Separador:
1001
+ this.visitarExpressaoSeparador(declaracaoOuConstruto);
1002
+ break;
1003
+ /* istanbul ignore next */
1004
+ case declaracoes_1.TextoDocumentacao:
1005
+ this.visitarDeclaracaoTextoDocumentacao(declaracaoOuConstruto);
1006
+ break;
1007
+ /* istanbul ignore next */
1008
+ case construtos_1.Tupla:
1009
+ this.visitarExpressaoTupla(declaracaoOuConstruto);
1010
+ break;
1011
+ /* istanbul ignore next */
1012
+ case construtos_1.TuplaN:
1013
+ this.visitarExpressaoTuplaN(declaracaoOuConstruto);
1014
+ break;
736
1015
  case construtos_1.Vetor:
737
1016
  this.visitarExpressaoVetor(declaracaoOuConstruto);
738
1017
  break;
1018
+ /* istanbul ignore next */
739
1019
  default:
740
1020
  console.log(declaracaoOuConstruto.constructor.name);
741
1021
  break;
@@ -756,20 +1036,22 @@ class FormatadorPortugolStudio {
756
1036
  this.indentacaoAtual = 0;
757
1037
  this.codigoFormatado = '';
758
1038
  this.ultimaLinhaFormatada = -1;
1039
+ // Trabalha em uma cópia para não mutar o array original.
1040
+ const copia = declaracoes.slice();
759
1041
  // Comentários podem vir antes da declaração do programa.
760
- while (declaracoes[0] instanceof declaracoes_1.Comentario) {
761
- const comentario = declaracoes.shift();
1042
+ while (copia[0] instanceof declaracoes_1.Comentario) {
1043
+ const comentario = copia.shift();
762
1044
  this.visitarDeclaracaoComentario(comentario);
763
1045
  }
764
1046
  // O avaliador sintático devolve uma última declaração `Expressao`
765
1047
  // que é simplemente uma chamada à função `inicio()`, mas que é
766
1048
  // irrelevante aqui, então simplesmente a descartamos.
767
- declaracoes.pop();
1049
+ copia.pop();
768
1050
  this.codigoFormatado += `programa ${this.quebraLinha}{${this.quebraLinha}`;
769
1051
  this.devePularLinha = true;
770
1052
  this.deveIndentar = true;
771
1053
  this.indentacaoAtual += this.tamanhoIndentacao;
772
- for (let declaracao of declaracoes) {
1054
+ for (let declaracao of copia) {
773
1055
  this.formatarDeclaracaoOuConstruto(declaracao);
774
1056
  // Track line number at the top-level declaration only
775
1057
  if (declaracao.linha !== undefined && !(declaracao instanceof declaracoes_1.Comentario)) {