@yakuzaa/jade-compiler 0.1.2 → 0.1.3

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 (45) hide show
  1. package/dist/cli.js +201 -23
  2. package/dist/cli.js.map +1 -1
  3. package/dist/codegen/ir_generator.d.ts +13 -0
  4. package/dist/codegen/ir_generator.d.ts.map +1 -1
  5. package/dist/codegen/ir_generator.js +167 -6
  6. package/dist/codegen/ir_generator.js.map +1 -1
  7. package/dist/codegen/ir_nodes.d.ts +19 -0
  8. package/dist/codegen/ir_nodes.d.ts.map +1 -1
  9. package/dist/codegen/wasm_generator.d.ts.map +1 -1
  10. package/dist/codegen/wasm_generator.js +0 -1
  11. package/dist/codegen/wasm_generator.js.map +1 -1
  12. package/dist/formatter/formatter.d.ts +48 -0
  13. package/dist/formatter/formatter.d.ts.map +1 -0
  14. package/dist/formatter/formatter.js +280 -0
  15. package/dist/formatter/formatter.js.map +1 -0
  16. package/dist/index.d.ts +14 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +16 -2
  19. package/dist/index.js.map +1 -1
  20. package/dist/lexer/lexer.d.ts.map +1 -1
  21. package/dist/lexer/lexer.js +15 -7
  22. package/dist/lexer/lexer.js.map +1 -1
  23. package/dist/lexer/token_type.d.ts +3 -1
  24. package/dist/lexer/token_type.d.ts.map +1 -1
  25. package/dist/lexer/token_type.js +2 -0
  26. package/dist/lexer/token_type.js.map +1 -1
  27. package/dist/linter/linter.d.ts +46 -0
  28. package/dist/linter/linter.d.ts.map +1 -0
  29. package/dist/linter/linter.js +166 -0
  30. package/dist/linter/linter.js.map +1 -0
  31. package/dist/parser/parse_result.d.ts +2 -0
  32. package/dist/parser/parse_result.d.ts.map +1 -1
  33. package/dist/parser/parser.d.ts.map +1 -1
  34. package/dist/parser/parser.js +117 -21
  35. package/dist/parser/parser.js.map +1 -1
  36. package/dist/semantic/symbol_table.d.ts +1 -0
  37. package/dist/semantic/symbol_table.d.ts.map +1 -1
  38. package/dist/semantic/symbol_table.js +11 -0
  39. package/dist/semantic/symbol_table.js.map +1 -1
  40. package/dist/semantic/type_checker.d.ts +7 -0
  41. package/dist/semantic/type_checker.d.ts.map +1 -1
  42. package/dist/semantic/type_checker.js +187 -72
  43. package/dist/semantic/type_checker.js.map +1 -1
  44. package/dist/tsconfig.tsbuildinfo +1 -0
  45. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -10,10 +10,14 @@
10
10
  * jadec --version → exibe versão
11
11
  * jadec --help → exibe ajuda
12
12
  */
13
- import { writeFileSync } from 'fs';
13
+ import { readFileSync, writeFileSync } from 'fs';
14
14
  import { resolve, basename, dirname, join } from 'path';
15
15
  import { compileFile } from './index.js';
16
- const VERSION = '0.1.0';
16
+ import { Lexer } from './lexer/lexer.js';
17
+ import { Parser } from './parser/parser.js';
18
+ import { Formatter } from './formatter/formatter.js';
19
+ import { Linter } from './linter/linter.js';
20
+ const VERSION = '0.1.2';
17
21
  const HELP = `
18
22
  jadec ${VERSION} — Compilador JADE
19
23
 
@@ -24,6 +28,10 @@ Opções:
24
28
  -o <prefixo> Define prefixo dos arquivos de saída (padrão: mesmo nome do fonte)
25
29
  --wat-only Gera apenas WAT (WebAssembly Text Format), sem binário .wasm
26
30
  --check Verifica erros sem gerar arquivos de saída
31
+ --format Formata o arquivo .jd e exibe na saída (não compila)
32
+ --format-write Formata e sobrescreve o arquivo .jd
33
+ --lint Analisa o arquivo e reporta avisos de qualidade
34
+ --no-color Desativa cores na saída
27
35
  --version Exibe a versão do compilador
28
36
  --help Exibe esta ajuda
29
37
 
@@ -31,7 +39,64 @@ Exemplos:
31
39
  jadec estoque.jd
32
40
  jadec estoque.jd -o dist/estoque
33
41
  jadec estoque.jd --check
42
+ jadec estoque.jd --format
43
+ jadec estoque.jd --format-write
34
44
  `;
45
+ // ── Cores ANSI ────────────────────────────────────────────────────────────────
46
+ const useColor = process.stderr.isTTY && !process.env.NO_COLOR && !process.argv.includes('--no-color');
47
+ const c = {
48
+ bold: (s) => useColor ? `\x1b[1m${s}\x1b[0m` : s,
49
+ red: (s) => useColor ? `\x1b[1;31m${s}\x1b[0m` : s,
50
+ yellow: (s) => useColor ? `\x1b[1;33m${s}\x1b[0m` : s,
51
+ blue: (s) => useColor ? `\x1b[34m${s}\x1b[0m` : s,
52
+ cyan: (s) => useColor ? `\x1b[36m${s}\x1b[0m` : s,
53
+ dim: (s) => useColor ? `\x1b[2m${s}\x1b[0m` : s,
54
+ green: (s) => useColor ? `\x1b[1;32m${s}\x1b[0m` : s,
55
+ };
56
+ const e = (s) => process.stderr.write(s + '\n');
57
+ // ── Renderização de erro estilo Rust ──────────────────────────────────────────
58
+ function renderError(err, sourceLines, inputFile) {
59
+ const fase = err.phase === 'parse' ? 'sintaxe'
60
+ : err.phase === 'semantic' ? 'semântica'
61
+ : 'codegen';
62
+ // Cabeçalho: erro[sintaxe]: mensagem
63
+ e(c.red(`erro[${fase}]`) + c.bold(`: ${err.message}`));
64
+ if (err.line > 0) {
65
+ const lineIdx = err.line - 1;
66
+ const col = Math.max(0, (err.column ?? 1) - 1);
67
+ const lineNumStr = String(err.line);
68
+ const pad = lineNumStr.length;
69
+ const bar = c.blue('|');
70
+ const linePrefix = c.blue(lineNumStr.padStart(pad) + ' |');
71
+ const emptyPrefix = c.blue(' '.repeat(pad) + ' |');
72
+ // --> arquivo:linha:coluna
73
+ e(c.blue(`${''.padStart(pad)} --> `) + `${inputFile}:${err.line}:${err.column}`);
74
+ e(emptyPrefix);
75
+ if (lineIdx >= 0 && lineIdx < sourceLines.length) {
76
+ const sourceLine = sourceLines[lineIdx];
77
+ // Determina comprimento do token sublinhado: até o próximo espaço/paren/EOF
78
+ const rest = sourceLine.slice(col);
79
+ const tokenLen = Math.max(1, rest.match(/^[\w\u00C0-\u024F"']+/)?.[0].length ?? 1);
80
+ const underline = c.red('^'.repeat(tokenLen));
81
+ const spaces = ' '.repeat(col);
82
+ // Linha de código
83
+ e(`${linePrefix} ${sourceLine}`);
84
+ // Seta apontando para o token
85
+ e(`${emptyPrefix} ${spaces}${underline}`);
86
+ }
87
+ e(emptyPrefix);
88
+ }
89
+ else {
90
+ // Sem posição — só referência ao arquivo
91
+ e(c.blue(` --> `) + inputFile);
92
+ }
93
+ // Dica
94
+ if (err.hint) {
95
+ e(c.blue(' = ') + c.yellow('dica') + `: ${err.hint}`);
96
+ }
97
+ e('');
98
+ }
99
+ // ── Main ──────────────────────────────────────────────────────────────────────
35
100
  async function main() {
36
101
  const args = process.argv.slice(2);
37
102
  if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
@@ -45,55 +110,168 @@ async function main() {
45
110
  // Encontrar arquivo de entrada (primeiro arg que não é flag)
46
111
  const inputFile = args.find(a => !a.startsWith('-'));
47
112
  if (!inputFile) {
48
- console.error('Erro: Nenhum arquivo de entrada especificado.\n');
49
- console.error('Use: jadec --help para ver as opções disponíveis.');
113
+ e(c.red('erro') + ': nenhum arquivo de entrada especificado.');
114
+ e(c.dim('dica: jadec --help para ver as opções disponíveis.'));
50
115
  process.exit(1);
51
116
  }
52
117
  const watOnly = args.includes('--wat-only');
53
118
  const checkOnly = args.includes('--check');
54
- // Prefixo de saída
119
+ const formatPrint = args.includes('--format');
120
+ const formatWrite = args.includes('--format-write');
121
+ const lintOnly = args.includes('--lint');
122
+ // ── Modo format ──────────────────────────────────────────────────────────
123
+ if (formatPrint || formatWrite) {
124
+ let source;
125
+ try {
126
+ source = readFileSync(resolve(inputFile), 'utf-8');
127
+ }
128
+ catch {
129
+ e(c.red('erro') + `: não foi possível ler '${inputFile}'.`);
130
+ process.exit(1);
131
+ }
132
+ const tokens = new Lexer(source).tokenize();
133
+ const parseResult = new Parser(tokens).parse();
134
+ if (!parseResult.success || !parseResult.program) {
135
+ e('');
136
+ for (const err of parseResult.errors) {
137
+ renderError({ phase: 'parse', message: err.message, hint: err.dica, line: err.line, column: err.column }, source.split('\n'), inputFile);
138
+ }
139
+ process.exit(1);
140
+ }
141
+ const formatted = new Formatter().format(parseResult.program);
142
+ if (formatWrite) {
143
+ writeFileSync(resolve(inputFile), formatted, 'utf-8');
144
+ console.log(c.green('ok') + ` — ${inputFile} formatado.`);
145
+ }
146
+ else {
147
+ process.stdout.write(formatted);
148
+ }
149
+ process.exit(0);
150
+ }
151
+ // ── Modo lint ────────────────────────────────────────────────────────────
152
+ if (lintOnly) {
153
+ let source;
154
+ try {
155
+ source = readFileSync(resolve(inputFile), 'utf-8');
156
+ }
157
+ catch {
158
+ e(c.red('erro') + `: não foi possível ler '${inputFile}'.`);
159
+ process.exit(1);
160
+ }
161
+ const tokens = new Lexer(source).tokenize();
162
+ const parseResult = new Parser(tokens).parse();
163
+ if (!parseResult.success || !parseResult.program) {
164
+ e('');
165
+ for (const err of parseResult.errors) {
166
+ renderError({ phase: 'parse', message: err.message, hint: err.dica, line: err.line, column: err.column }, source.split('\n'), inputFile);
167
+ }
168
+ process.exit(1);
169
+ }
170
+ const avisos = new Linter().lint(parseResult.program);
171
+ if (avisos.length === 0) {
172
+ console.log(c.green('ok') + ` — nenhum aviso encontrado em ${inputFile}.`);
173
+ process.exit(0);
174
+ }
175
+ const sourceLines = source.split('\n');
176
+ for (const aviso of avisos) {
177
+ const icon = aviso.severity === 'error' ? c.red('erro') : c.yellow('aviso');
178
+ e(`${icon}[${aviso.code}]` + c.bold(`: ${aviso.message}`));
179
+ if (aviso.line > 0) {
180
+ const lineIdx = aviso.line - 1;
181
+ const pad = String(aviso.line).length;
182
+ const bar = c.blue('|');
183
+ e(c.blue(`${''.padStart(pad)} --> `) + `${inputFile}:${aviso.line}:${aviso.column}`);
184
+ e(c.blue(' '.repeat(pad) + ' |'));
185
+ if (lineIdx < sourceLines.length) {
186
+ e(c.blue(String(aviso.line).padStart(pad) + ' |') + ` ${sourceLines[lineIdx]}`);
187
+ e(c.blue(' '.repeat(pad) + ' |'));
188
+ }
189
+ }
190
+ e('');
191
+ }
192
+ const erros = avisos.filter(a => a.severity === 'error').length;
193
+ const warnings = avisos.filter(a => a.severity === 'warning').length;
194
+ const resumo = [
195
+ warnings > 0 ? c.yellow(`${warnings} aviso${warnings > 1 ? 's' : ''}`) : '',
196
+ erros > 0 ? c.red(`${erros} erro${erros > 1 ? 's' : ''}`) : ''
197
+ ].filter(Boolean).join(', ');
198
+ e(resumo);
199
+ process.exit(erros > 0 ? 1 : 0);
200
+ }
201
+ // Prefixo de saída — com proteção contra path traversal
55
202
  const oIdx = args.indexOf('-o');
56
- const outputPrefix = oIdx !== -1 && args[oIdx + 1]
57
- ? args[oIdx + 1]
58
- : join(dirname(resolve(inputFile)), basename(inputFile, '.jd'));
59
- console.log(`jadec ${VERSION} Compilando ${inputFile}...\n`);
203
+ let outputPrefix;
204
+ if (oIdx !== -1 && args[oIdx + 1]) {
205
+ const raw = args[oIdx + 1];
206
+ const resolved = resolve(raw);
207
+ // Bloquear escrita em diretórios críticos do sistema
208
+ const sensivel = ['/etc', '/usr', '/bin', '/sbin', '/root', '/sys', '/proc', '/boot'];
209
+ if (sensivel.some(d => resolved === d || resolved.startsWith(d + '/'))) {
210
+ e(c.red('erro') + `: caminho de saída '${raw}' aponta para diretório do sistema`);
211
+ process.exit(1);
212
+ }
213
+ outputPrefix = resolved;
214
+ }
215
+ else {
216
+ outputPrefix = join(dirname(resolve(inputFile)), basename(inputFile, '.jd'));
217
+ }
218
+ // Lê o fonte para exibir trechos nos erros
219
+ let sourceLines = [];
220
+ try {
221
+ sourceLines = readFileSync(resolve(inputFile), 'utf-8').split('\n');
222
+ }
223
+ catch {
224
+ // Se não conseguir ler, erros serão exibidos sem snippet
225
+ }
226
+ process.stderr.write(c.dim(`jadec ${VERSION} — compilando ${inputFile}...\n\n`));
60
227
  const result = await compileFile(resolve(inputFile), basename(inputFile, '.jd'));
61
228
  if (!result.success) {
62
- console.error('Erros encontrados:\n');
229
+ e('');
63
230
  for (const err of result.errors) {
64
- const fase = err.phase === 'parse' ? 'Sintaxe'
65
- : err.phase === 'semantic' ? 'Semântica'
66
- : 'CodeGen';
67
- const pos = err.line > 0 ? ` [linha ${err.line}, col ${err.column}]` : '';
68
- console.error(` [${fase}]${pos} ${err.message}`);
231
+ renderError(err, sourceLines, inputFile);
69
232
  }
70
- console.error(`\n${result.errors.length} erro(s) encontrado(s).`);
233
+ const n = result.errors.length;
234
+ e(c.red(`${n} erro${n > 1 ? 's' : ''} encontrado${n > 1 ? 's' : ''}`) + c.bold('. Compilação interrompida.'));
71
235
  process.exit(1);
72
236
  }
73
237
  if (checkOnly) {
74
- console.log('OK — nenhum erro encontrado.');
238
+ console.log(c.green('ok') + ' — nenhum erro encontrado.');
75
239
  process.exit(0);
76
240
  }
241
+ // Escrever descritores de tela (UI declarativa)
242
+ if (result.telas && result.telas.length > 0) {
243
+ const uiPath = `${outputPrefix}.jade-ui.json`;
244
+ writeFileSync(uiPath, JSON.stringify(result.telas, null, 2), 'utf-8');
245
+ console.log(` ${c.cyan('UI')} → ${uiPath} ${c.dim(`(${result.telas.length} tela${result.telas.length > 1 ? 's' : ''})`)}`);
246
+ }
77
247
  // Escrever WAT
78
248
  if (result.wat) {
79
249
  const watPath = `${outputPrefix}.wat`;
80
250
  writeFileSync(watPath, result.wat, 'utf-8');
81
- console.log(` WAT → ${watPath}`);
251
+ console.log(` ${c.cyan('WAT')} → ${watPath}`);
82
252
  }
83
253
  // Escrever WASM
84
254
  if (!watOnly && result.wasm) {
85
255
  const wasmPath = `${outputPrefix}.wasm`;
86
256
  writeFileSync(wasmPath, result.wasm);
87
- console.log(` WASM → ${wasmPath} (${result.wasm.byteLength} bytes)`);
257
+ console.log(` ${c.cyan('WASM')} → ${wasmPath} ${c.dim(`(${result.wasm.byteLength} bytes)`)}`);
88
258
  }
89
259
  else if (!watOnly && !result.wasm) {
90
- console.warn(' Aviso: binário WASM não gerado (wabt não disponível).');
91
- console.warn(' Instale com: npm install wabt');
260
+ if (result.errors.length > 0) {
261
+ for (const err of result.errors) {
262
+ e(c.red('erro') + `: ${err}`);
263
+ }
264
+ process.exit(1);
265
+ }
266
+ else {
267
+ e(c.yellow('aviso') + ': binário WASM não gerado (wabt não disponível).');
268
+ e(c.dim(' instale com: npm install wabt'));
269
+ }
92
270
  }
93
- console.log('\nCompilação concluída com sucesso.');
271
+ console.log('\n' + c.green('compilação concluída com sucesso.'));
94
272
  }
95
273
  main().catch(err => {
96
- console.error('Erro interno do compilador:', err);
274
+ e(c.red('erro interno do compilador') + `: ${err?.message ?? err}`);
97
275
  process.exit(2);
98
276
  });
99
277
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,18 @@ export declare class IRGenerator {
6
6
  private currentBlock;
7
7
  private tempCounter;
8
8
  private blockCounter;
9
+ /** Mapeia nome de variável local → nome do tipo JADE (entidade/classe) para resolução de campos */
10
+ private localEntityTypeMap;
9
11
  constructor(moduleName: string);
10
12
  generate(program: N.ProgramaNode): IR.IRModule;
13
+ private flattenDeclarations;
11
14
  private generateEntidade;
15
+ private generateEvento;
12
16
  private generateClasse;
13
17
  private generateFuncao;
18
+ private generateOuvinte;
19
+ private generateRegra;
20
+ private generateTela;
14
21
  private generateServico;
15
22
  private generateBloco;
16
23
  private generateInstrucao;
@@ -29,6 +36,12 @@ export declare class IRGenerator {
29
36
  private generateUnario;
30
37
  private generateChamadaFuncao;
31
38
  private generateAcessoMembro;
39
+ /**
40
+ * Resolve o IR type de um campo de acesso a membro.
41
+ * Usa localEntityTypeMap para encontrar o tipo da entidade e busca o campo
42
+ * nas typeDefinitions registradas.
43
+ */
44
+ private resolveFieldType;
32
45
  private newTemp;
33
46
  private newBlockLabel;
34
47
  private emit;
@@ -1 +1 @@
1
- {"version":3,"file":"ir_generator.d.ts","sourceRoot":"","sources":["../../codegen/ir_generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;gBAErB,UAAU,EAAE,MAAM;IAS9B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,QAAQ;IA0B9C,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,YAAY;IAgHpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,oBAAoB;IAwB5B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,WAAW;CAiBpB"}
1
+ {"version":3,"file":"ir_generator.d.ts","sourceRoot":"","sources":["../../codegen/ir_generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;IACjC,mGAAmG;IACnG,OAAO,CAAC,kBAAkB,CAAkC;gBAEhD,UAAU,EAAE,MAAM;IAW9B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,QAAQ;IA8B9C,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IA6CtB,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,aAAa;IAkDrB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,eAAe;IA8CvB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,YAAY;IAgHpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,oBAAoB;IAsB5B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,YAAY;IAyBpB,OAAO,CAAC,WAAW;CAiBpB"}
@@ -4,38 +4,61 @@ export class IRGenerator {
4
4
  currentBlock = null;
5
5
  tempCounter = 0;
6
6
  blockCounter = 0;
7
+ /** Mapeia nome de variável local → nome do tipo JADE (entidade/classe) para resolução de campos */
8
+ localEntityTypeMap = new Map();
7
9
  constructor(moduleName) {
8
10
  this.module = {
9
11
  name: moduleName,
10
12
  typeDefinitions: [],
11
13
  globals: [],
12
- functions: []
14
+ functions: [],
15
+ eventHandlers: [],
16
+ telas: []
13
17
  };
14
18
  }
15
19
  generate(program) {
16
- // Passo 1: registrar todos os tipos (entidades/classes)
17
- for (const declaracao of program.declaracoes) {
20
+ const allDecls = this.flattenDeclarations(program.declaracoes);
21
+ // Passo 1: registrar todos os tipos (entidades/classes/eventos)
22
+ for (const declaracao of allDecls) {
18
23
  if (declaracao.kind === 'Entidade') {
19
24
  this.generateEntidade(declaracao);
20
25
  }
21
26
  else if (declaracao.kind === 'Classe') {
22
27
  this.generateClasse(declaracao);
23
28
  }
29
+ else if (declaracao.kind === 'Evento') {
30
+ this.generateEvento(declaracao);
31
+ }
24
32
  }
25
33
  // Passo 2: gerar funções
26
- for (const declaracao of program.declaracoes) {
34
+ for (const declaracao of allDecls) {
27
35
  if (declaracao.kind === 'Funcao') {
28
36
  this.generateFuncao(declaracao);
29
37
  }
30
38
  else if (declaracao.kind === 'Servico') {
31
39
  this.generateServico(declaracao);
32
40
  }
41
+ else if (declaracao.kind === 'Regra') {
42
+ this.generateRegra(declaracao);
43
+ }
33
44
  else if (declaracao.kind === 'Tela') {
34
- // Telas são tratadas pelo UIEngine em runtime — sem geração de IR
45
+ this.generateTela(declaracao);
35
46
  }
36
47
  }
37
48
  return this.module;
38
49
  }
50
+ flattenDeclarations(decls) {
51
+ const result = [];
52
+ for (const decl of decls) {
53
+ if (decl.kind === 'Modulo') {
54
+ result.push(...this.flattenDeclarations(decl.declaracoes));
55
+ }
56
+ else {
57
+ result.push(decl);
58
+ }
59
+ }
60
+ return result;
61
+ }
39
62
  // ── Geradores de declaração ──────────────────────────────
40
63
  generateEntidade(node) {
41
64
  const fields = node.campos.map(campo => ({
@@ -47,6 +70,17 @@ export class IRGenerator {
47
70
  fields
48
71
  });
49
72
  }
73
+ generateEvento(node) {
74
+ // Eventos são tipos compostos (assim como entidades)
75
+ const fields = node.campos.map(campo => ({
76
+ name: campo.nome,
77
+ type: this.jadeTypeToIR(campo.tipo)
78
+ }));
79
+ this.module.typeDefinitions.push({
80
+ name: node.nome,
81
+ fields
82
+ });
83
+ }
50
84
  generateClasse(node) {
51
85
  const fields = node.campos.map(campo => ({
52
86
  name: campo.nome,
@@ -71,6 +105,16 @@ export class IRGenerator {
71
105
  locals: []
72
106
  };
73
107
  this.currentFunction = func;
108
+ this.localEntityTypeMap = new Map();
109
+ // Registrar parâmetros de tipo entidade para resolução de campos
110
+ for (const param of node.parametros) {
111
+ if (param.tipo.kind === 'TipoSimples') {
112
+ const nomeTipo = param.tipo.nome;
113
+ if (!['numero', 'decimal', 'moeda', 'booleano', 'texto', 'id', 'data', 'hora'].includes(nomeTipo)) {
114
+ this.localEntityTypeMap.set(param.nome, nomeTipo);
115
+ }
116
+ }
117
+ }
74
118
  this.module.functions.push(func);
75
119
  // Criar bloco entry
76
120
  const entryBlock = this.createBlock('entry');
@@ -84,7 +128,90 @@ export class IRGenerator {
84
128
  this.currentFunction = null;
85
129
  this.currentBlock = null;
86
130
  }
131
+ generateOuvinte(servicoNome, node) {
132
+ // Nome da função handler: '@NomeServico_on_NomeEvento'
133
+ const funcName = `@${servicoNome}_on_${node.evento}`;
134
+ const func = {
135
+ name: funcName,
136
+ parameters: [{ name: '%evento', type: 'ptr' }],
137
+ returnType: 'void',
138
+ blocks: [],
139
+ locals: []
140
+ };
141
+ this.currentFunction = func;
142
+ this.module.functions.push(func);
143
+ const entryBlock = this.createBlock('entry');
144
+ this.switchToBlock(entryBlock);
145
+ this.generateBloco(node.corpo);
146
+ if (this.currentBlock && !this.currentBlock.terminator) {
147
+ this.setTerminator({ kind: 'Return' });
148
+ }
149
+ this.currentFunction = null;
150
+ this.currentBlock = null;
151
+ // Registrar no metadata de event handlers
152
+ this.module.eventHandlers.push({
153
+ eventName: node.evento,
154
+ functionName: funcName
155
+ });
156
+ }
157
+ generateRegra(node) {
158
+ // Regra vira função WASM chamável: @regra_NomeRegra()
159
+ const func = {
160
+ name: '@regra_' + node.nome,
161
+ parameters: [],
162
+ returnType: 'void',
163
+ blocks: [],
164
+ locals: []
165
+ };
166
+ this.currentFunction = func;
167
+ this.module.functions.push(func);
168
+ const entryBlock = this.createBlock('entry');
169
+ this.switchToBlock(entryBlock);
170
+ // Gera condicional: se condicao → entao, senao → senao (se existir)
171
+ const thenBlock = this.createBlock(this.newBlockLabel('regra_entao'));
172
+ const elseBlock = node.senao ? this.createBlock(this.newBlockLabel('regra_senao')) : null;
173
+ const mergeBlock = this.createBlock(this.newBlockLabel('regra_fim'));
174
+ const condition = this.generateExpressao(node.condicao);
175
+ this.setTerminator({
176
+ kind: 'CondBranch',
177
+ condition,
178
+ trueBlock: thenBlock.label,
179
+ falseBlock: elseBlock ? elseBlock.label : mergeBlock.label
180
+ });
181
+ this.switchToBlock(thenBlock);
182
+ this.generateBloco(node.entao);
183
+ if (this.currentBlock && !this.currentBlock.terminator) {
184
+ this.setTerminator({ kind: 'Branch', target: mergeBlock.label });
185
+ }
186
+ if (elseBlock && node.senao) {
187
+ this.switchToBlock(elseBlock);
188
+ this.generateBloco(node.senao);
189
+ if (this.currentBlock && !this.currentBlock.terminator) {
190
+ this.setTerminator({ kind: 'Branch', target: mergeBlock.label });
191
+ }
192
+ }
193
+ this.switchToBlock(mergeBlock);
194
+ this.setTerminator({ kind: 'Return' });
195
+ this.currentFunction = null;
196
+ this.currentBlock = null;
197
+ }
198
+ generateTela(node) {
199
+ const descriptor = {
200
+ nome: node.nome,
201
+ titulo: node.titulo,
202
+ elementos: node.elementos.map(el => ({
203
+ tipo: el.tipo,
204
+ nome: el.nome,
205
+ propriedades: el.propriedades
206
+ }))
207
+ };
208
+ this.module.telas.push(descriptor);
209
+ }
87
210
  generateServico(node) {
211
+ // Gera cada ouvinte como função handler + registra no eventHandlers
212
+ for (const ouvinte of node.ouvintes) {
213
+ this.generateOuvinte(node.nome, ouvinte);
214
+ }
88
215
  // Gera cada método como função independente
89
216
  // Nome: '@NomeServico_nomeFuncao'
90
217
  for (const metodo of node.metodos) {
@@ -154,6 +281,13 @@ export class IRGenerator {
154
281
  }
155
282
  generateVariavel(node) {
156
283
  const type = node.tipo ? this.jadeTypeToIR(node.tipo) : 'void';
284
+ // Rastrear tipo de entidade para resolução de campos em AcessoMembro
285
+ if (node.tipo?.kind === 'TipoSimples') {
286
+ const nomeTipo = node.tipo.nome;
287
+ if (!['numero', 'decimal', 'moeda', 'booleano', 'texto', 'id', 'data', 'hora'].includes(nomeTipo)) {
288
+ this.localEntityTypeMap.set(node.nome, nomeTipo);
289
+ }
290
+ }
157
291
  if (node.inicializador) {
158
292
  const value = this.generateExpressao(node.inicializador);
159
293
  this.emit({
@@ -547,7 +681,7 @@ export class IRGenerator {
547
681
  const object = this.generateExpressao(node.objeto);
548
682
  // Emite GetField
549
683
  const result = this.newTemp();
550
- const type = 'void'; // TODO: Obter tipo do campo
684
+ const type = this.resolveFieldType(node.objeto, node.membro);
551
685
  this.emit({
552
686
  kind: 'GetField',
553
687
  result,
@@ -561,6 +695,32 @@ export class IRGenerator {
561
695
  type
562
696
  };
563
697
  }
698
+ /**
699
+ * Resolve o IR type de um campo de acesso a membro.
700
+ * Usa localEntityTypeMap para encontrar o tipo da entidade e busca o campo
701
+ * nas typeDefinitions registradas.
702
+ */
703
+ resolveFieldType(objeto, campo) {
704
+ let entityName;
705
+ if (objeto.kind === 'Identificador') {
706
+ entityName = this.localEntityTypeMap.get(objeto.nome);
707
+ }
708
+ if (entityName) {
709
+ const typeDef = this.module.typeDefinitions.find(t => t.name === entityName);
710
+ if (typeDef) {
711
+ const field = typeDef.fields.find(f => f.name === campo);
712
+ if (field)
713
+ return field.type;
714
+ }
715
+ }
716
+ // Fallback: tentar buscar o campo em todos os tipos conhecidos
717
+ for (const typeDef of this.module.typeDefinitions) {
718
+ const field = typeDef.fields.find(f => f.name === campo);
719
+ if (field)
720
+ return field.type;
721
+ }
722
+ return 'i32'; // fallback seguro — ponteiros e inteiros são i32
723
+ }
564
724
  // ── Utilitários ──────────────────────────────────────────
565
725
  newTemp() {
566
726
  return `%t${this.tempCounter++}`;
@@ -655,6 +815,7 @@ export class IRGenerator {
655
815
  switch (nome) {
656
816
  case 'numero': return 'i32';
657
817
  case 'decimal': return 'f64';
818
+ case 'moeda': return 'f64'; // moeda usa centavos internamente como f64
658
819
  case 'booleano': return 'i1';
659
820
  case 'texto': return 'ptr';
660
821
  case 'id': return 'ptr';