@semacode/cli 1.2.12 → 1.3.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 (128) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +76 -25
  3. package/dist/projeto.js +4 -1
  4. package/package.json +17 -34
  5. package/src/cpp-symbols.ts +82 -0
  6. package/src/dotnet-http.ts +355 -0
  7. package/src/drift.ts +2455 -0
  8. package/src/go-http.ts +118 -0
  9. package/src/importador.ts +3448 -0
  10. package/src/index.ts +4470 -0
  11. package/src/java-http.ts +247 -0
  12. package/src/projeto.ts +810 -0
  13. package/src/python-http.ts +258 -0
  14. package/src/rust-http.ts +125 -0
  15. package/src/tipos.ts +22 -0
  16. package/src/typescript-http.ts +1076 -0
  17. package/tsconfig.json +20 -0
  18. package/AGENTS.md +0 -50
  19. package/LICENSE +0 -22
  20. package/SEMA_BRIEF.curto.txt +0 -9
  21. package/SEMA_BRIEF.md +0 -49
  22. package/SEMA_BRIEF.micro.txt +0 -7
  23. package/SEMA_INDEX.json +0 -501
  24. package/dist/cpp-symbols.d.ts +0 -10
  25. package/dist/cpp-symbols.js.map +0 -1
  26. package/dist/dotnet-http.d.ts +0 -23
  27. package/dist/dotnet-http.js.map +0 -1
  28. package/dist/drift.d.ts +0 -118
  29. package/dist/drift.js.map +0 -1
  30. package/dist/go-http.d.ts +0 -23
  31. package/dist/go-http.js.map +0 -1
  32. package/dist/importador.d.ts +0 -29
  33. package/dist/importador.js.map +0 -1
  34. package/dist/index.d.ts +0 -2
  35. package/dist/index.js.map +0 -1
  36. package/dist/java-http.d.ts +0 -23
  37. package/dist/java-http.js.map +0 -1
  38. package/dist/lua-symbols.d.ts +0 -8
  39. package/dist/lua-symbols.js.map +0 -1
  40. package/dist/projeto.d.ts +0 -48
  41. package/dist/projeto.js.map +0 -1
  42. package/dist/python-http.d.ts +0 -23
  43. package/dist/python-http.js.map +0 -1
  44. package/dist/rust-http.d.ts +0 -23
  45. package/dist/rust-http.js.map +0 -1
  46. package/dist/tipos.d.ts +0 -3
  47. package/dist/tipos.js.map +0 -1
  48. package/dist/typescript-http.d.ts +0 -35
  49. package/dist/typescript-http.js.map +0 -1
  50. package/docs/AGENT_STARTER.md +0 -102
  51. package/docs/como-ensinar-a-sema-para-ia.md +0 -149
  52. package/docs/fluxo-pratico-ia-sema.md +0 -177
  53. package/docs/instalacao-e-primeiro-uso.md +0 -196
  54. package/docs/integracao-com-ia.md +0 -228
  55. package/docs/pagamento-ponta-a-ponta.md +0 -155
  56. package/docs/prompt-base-ia-sema.md +0 -101
  57. package/docs/sintaxe.md +0 -361
  58. package/exemplos/automacao.sema +0 -107
  59. package/exemplos/cadastro_usuario.sema +0 -54
  60. package/exemplos/calculadora.sema +0 -78
  61. package/exemplos/crud_simples.sema +0 -89
  62. package/exemplos/operacao_estrategia.sema +0 -402
  63. package/exemplos/pagamento.sema +0 -222
  64. package/exemplos/pagamento_dominio.sema +0 -35
  65. package/exemplos/testes_embutidos.sema +0 -45
  66. package/exemplos/tratamento_erro.sema +0 -157
  67. package/llms-full.txt +0 -34
  68. package/llms.txt +0 -17
  69. package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
  70. package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
  71. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  72. package/node_modules/@sema/gerador-dart/package.json +0 -7
  73. package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
  74. package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
  75. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  76. package/node_modules/@sema/gerador-lua/package.json +0 -7
  77. package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
  78. package/node_modules/@sema/gerador-python/dist/index.js +0 -628
  79. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  80. package/node_modules/@sema/gerador-python/package.json +0 -7
  81. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
  82. package/node_modules/@sema/gerador-typescript/dist/index.js +0 -656
  83. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  84. package/node_modules/@sema/gerador-typescript/package.json +0 -7
  85. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -122
  86. package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
  87. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  88. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
  89. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
  90. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  91. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
  92. package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -445
  93. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  94. package/node_modules/@sema/nucleo/dist/index.d.ts +0 -34
  95. package/node_modules/@sema/nucleo/dist/index.js +0 -95
  96. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  97. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
  98. package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -781
  99. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  100. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -285
  101. package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
  102. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  103. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
  104. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
  105. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  106. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
  107. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -46
  108. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  109. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
  110. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -656
  111. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  112. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -57
  113. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1497
  114. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  115. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
  116. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
  117. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  118. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
  119. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
  120. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  121. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
  122. package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
  123. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  124. package/node_modules/@sema/nucleo/package.json +0 -7
  125. package/node_modules/@sema/padroes/dist/index.d.ts +0 -21
  126. package/node_modules/@sema/padroes/dist/index.js +0 -159
  127. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
  128. package/node_modules/@sema/padroes/package.json +0 -7
package/README.md CHANGED
@@ -36,7 +36,7 @@ sema --help
36
36
  ## Instalacao via tarball da release
37
37
 
38
38
  ```bash
39
- npm install -g ./sema-cli-1.2.12.tgz
39
+ npm install -g ./{{TGZ_ARQUIVO}}
40
40
  ```
41
41
 
42
42
  Ou direto da GitHub Release:
@@ -55,7 +55,7 @@ npx sema --help
55
55
  Ou, se voce estiver testando um tarball local:
56
56
 
57
57
  ```bash
58
- npm install ./sema-cli-1.2.12.tgz
58
+ npm install ./{{TGZ_ARQUIVO}}
59
59
  npx sema --help
60
60
  ```
61
61
 
package/dist/index.js CHANGED
@@ -10,6 +10,9 @@ import { gerarDart } from "@sema/gerador-dart";
10
10
  import { gerarLua } from "@sema/gerador-lua";
11
11
  import { gerarPython } from "@sema/gerador-python";
12
12
  import { gerarTypeScript } from "@sema/gerador-typescript";
13
+ import { gerarJavaScript } from "@sema/gerador-javascript";
14
+ import { gerarHtml } from "@sema/gerador-html";
15
+ import { gerarCss } from "@sema/gerador-css";
13
16
  import { carregarConfiguracaoProjeto, carregarProjeto, resolverAlvoPadrao, resolverAlvosVerificacao, resolverEstruturaSaidaPadrao, resolverFrameworkPadrao, resolverSaidaPadrao, } from "./projeto.js";
14
17
  import { importarProjetoLegado, resumoImportacao } from "./importador.js";
15
18
  import { analisarDriftLegado } from "./drift.js";
@@ -97,21 +100,24 @@ Superficies que a IA deve enxergar como first-class:
97
100
 
98
101
  Nao improvise quando faltar contexto.
99
102
  `;
100
- const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
101
-
102
- Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
103
-
104
- Fontes de verdade, em ordem:
105
- 1. README do projeto
106
- 2. gramatica e documentacao de sintaxe da Sema
107
- 3. especificacao semantica da linguagem
108
- 4. exemplos oficiais, com prioridade para o vertical de pagamento
109
- 5. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
110
- 6. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
111
-
112
- Regras de operacao:
113
- - preserve o significado semantico
114
- - use o formatador oficial da Sema como fonte unica de estilo
103
+ const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
104
+
105
+ Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
106
+
107
+ Fontes de verdade, em ordem:
108
+ 1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
109
+ 2. \`SEMA_BRIEF.md\`
110
+ 3. \`SEMA_INDEX.json\`
111
+ 4. README do projeto
112
+ 5. gramatica e documentacao de sintaxe da Sema
113
+ 6. especificacao semantica da linguagem
114
+ 7. exemplos oficiais, com prioridade para o vertical de pagamento
115
+ 8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
116
+ 9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
117
+
118
+ Regras de operacao:
119
+ - preserve o significado semantico
120
+ - use o formatador oficial da Sema como fonte unica de estilo
115
121
  - use diagnosticos estruturados como contrato de correcao
116
122
  - use a IR como fonte de verdade semantica quando houver duvida
117
123
  - nao conclua uma alteracao sem validar e verificar o modulo
@@ -515,7 +521,7 @@ function validarCompatibilidadeFramework(alvo, framework) {
515
521
  if (framework === "fastapi" && alvo !== "python") {
516
522
  return `Framework "${framework}" so pode ser usado com o alvo python.`;
517
523
  }
518
- if (alvo === "dart" || alvo === "lua") {
524
+ if (alvo === "dart" || alvo === "lua" || alvo === "javascript" || alvo === "html" || alvo === "css") {
519
525
  return `Framework "${framework}" nao e suportado para o alvo ${alvo}.`;
520
526
  }
521
527
  return undefined;
@@ -624,6 +630,15 @@ function gerarArquivosPorAlvo(ir, alvo, framework) {
624
630
  if (alvo === "lua") {
625
631
  return gerarLua(ir);
626
632
  }
633
+ if (alvo === "javascript") {
634
+ return gerarJavaScript(ir);
635
+ }
636
+ if (alvo === "html") {
637
+ return gerarHtml(ir);
638
+ }
639
+ if (alvo === "css") {
640
+ return gerarCss(ir);
641
+ }
627
642
  return gerarTypeScript(ir, { framework });
628
643
  }
629
644
  function aplicarEstruturaSaida(arquivos, ir, estrutura) {
@@ -662,6 +677,19 @@ function aplicarEstruturaSaida(arquivos, ir, estrutura) {
662
677
  novoBasename = `test_${nomeArquivo}.lua`;
663
678
  conteudo = conteudo.replace(`${nomeBaseAntigo}.lua`, `${nomeArquivo}.lua`);
664
679
  }
680
+ else if (basename === `${nomeBaseAntigo}.js`) {
681
+ novoBasename = `${nomeArquivo}.js`;
682
+ }
683
+ else if (basename === `${nomeBaseAntigo}.test.js`) {
684
+ novoBasename = `${nomeArquivo}.test.js`;
685
+ conteudo = conteudo.replace(`./${nomeBaseAntigo}.js`, `./${nomeArquivo}.js`);
686
+ }
687
+ else if (basename === `${nomeBaseAntigo}.html`) {
688
+ novoBasename = `${nomeArquivo}.html`;
689
+ }
690
+ else if (basename === `${nomeBaseAntigo}.css`) {
691
+ novoBasename = `${nomeArquivo}.css`;
692
+ }
665
693
  return {
666
694
  caminhoRelativo: pastaModulo ? path.join(pastaModulo, novoBasename) : novoBasename,
667
695
  conteudo,
@@ -669,7 +697,7 @@ function aplicarEstruturaSaida(arquivos, ir, estrutura) {
669
697
  });
670
698
  }
671
699
  function contarCasosDeTesteGerados(alvo, arquivos) {
672
- if (alvo === "dart") {
700
+ if (alvo === "dart" || alvo === "html" || alvo === "css") {
673
701
  return 0;
674
702
  }
675
703
  if (alvo === "lua") {
@@ -686,6 +714,13 @@ function contarCasosDeTesteGerados(alvo, arquivos) {
686
714
  }
687
715
  return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
688
716
  }
717
+ if (alvo === "javascript") {
718
+ const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"));
719
+ if (!arquivoTeste) {
720
+ return 0;
721
+ }
722
+ return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
723
+ }
689
724
  const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"));
690
725
  if (!arquivoTeste) {
691
726
  return 0;
@@ -696,17 +731,14 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
696
731
  const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
697
732
  if (quantidadeTestes === 0) {
698
733
  if (!silencioso) {
699
- const nomeAlvo = alvo === "typescript"
700
- ? "TypeScript"
701
- : alvo === "python"
702
- ? "Python"
703
- : alvo === "lua"
704
- ? "Lua"
705
- : "Dart";
706
- console.log(`Nenhum teste ${nomeAlvo} foi gerado.`);
734
+ const nomesAlvo = { typescript: "TypeScript", python: "Python", lua: "Lua", dart: "Dart", javascript: "JavaScript", html: "HTML", css: "CSS" };
735
+ console.log(`Nenhum teste ${nomesAlvo[alvo] ?? alvo} foi gerado.`);
707
736
  }
708
737
  return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
709
738
  }
739
+ if (alvo === "html" || alvo === "css") {
740
+ return { codigoSaida: 0, quantidadeTestes: 0, saidaPadrao: "", saidaErro: "" };
741
+ }
710
742
  if (alvo === "typescript") {
711
743
  const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.ts"))?.caminhoRelativo;
712
744
  if (!arquivoTeste) {
@@ -726,6 +758,25 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
726
758
  saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
727
759
  };
728
760
  }
761
+ if (alvo === "javascript") {
762
+ const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"))?.caminhoRelativo;
763
+ if (!arquivoTeste) {
764
+ if (!silencioso) {
765
+ console.log("Nenhum teste JavaScript foi gerado.");
766
+ }
767
+ return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
768
+ }
769
+ const execucao = spawnSync("node", ["--test", path.join(baseSaida, arquivoTeste)], {
770
+ stdio: silencioso ? "pipe" : "inherit",
771
+ encoding: silencioso ? "utf8" : undefined,
772
+ });
773
+ return {
774
+ codigoSaida: execucao.status ?? 1,
775
+ quantidadeTestes,
776
+ saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
777
+ saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
778
+ };
779
+ }
729
780
  if (alvo === "lua") {
730
781
  const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"))?.caminhoRelativo;
731
782
  if (!arquivoTeste) {
package/dist/projeto.js CHANGED
@@ -59,9 +59,12 @@ export function normalizarFrameworkGeracao(valor) {
59
59
  return "base";
60
60
  }
61
61
  function normalizarAlvo(valor) {
62
- if (valor === "typescript" || valor === "python" || valor === "dart" || valor === "lua") {
62
+ if (valor === "typescript" || valor === "python" || valor === "dart" || valor === "lua" || valor === "javascript" || valor === "html" || valor === "css") {
63
63
  return valor;
64
64
  }
65
+ if (valor === "js") {
66
+ return "javascript";
67
+ }
65
68
  return undefined;
66
69
  }
67
70
  function resolverEntradaPadrao(cwd, configCarregada) {
package/package.json CHANGED
@@ -1,9 +1,8 @@
1
1
  {
2
2
  "name": "@semacode/cli",
3
- "version": "1.2.12",
4
- "description": "CLI da Sema para validar contratos, medir drift e governar a navegacao operacional de agentes sobre software vivo em backend e front consumer.",
3
+ "version": "1.3.0",
5
4
  "type": "module",
6
- "icon": "logo.png",
5
+ "description": "CLI da Sema para validar contratos, medir drift e governar a navegacao operacional de agentes sobre software vivo em backend e front consumer.",
7
6
  "license": "MIT",
8
7
  "repository": {
9
8
  "type": "git",
@@ -28,41 +27,25 @@
28
27
  "publishConfig": {
29
28
  "access": "public"
30
29
  },
30
+ "icon": "logo.png",
31
31
  "bin": {
32
32
  "sema": "dist/index.js"
33
33
  },
34
34
  "main": "dist/index.js",
35
35
  "types": "dist/index.d.ts",
36
- "files": [
37
- "dist",
38
- "docs",
39
- "exemplos",
40
- "AGENTS.md",
41
- "llms.txt",
42
- "llms-full.txt",
43
- "SEMA_BRIEF.md",
44
- "SEMA_BRIEF.micro.txt",
45
- "SEMA_BRIEF.curto.txt",
46
- "SEMA_INDEX.json",
47
- "logo.png",
48
- "README.md",
49
- "LICENSE"
50
- ],
36
+ "scripts": {
37
+ "build": "tsc -p tsconfig.json"
38
+ },
51
39
  "dependencies": {
52
- "@sema/nucleo": "1.2.12",
53
- "@sema/gerador-dart": "1.2.12",
54
- "@sema/gerador-lua": "1.2.12",
55
- "@sema/gerador-python": "1.2.12",
56
- "@sema/gerador-typescript": "1.2.12",
57
- "@sema/padroes": "1.2.12",
40
+ "@sema/nucleo": "file:../nucleo",
41
+ "@sema/gerador-dart": "file:../gerador-dart",
42
+ "@sema/gerador-lua": "file:../gerador-lua",
43
+ "@sema/gerador-python": "file:../gerador-python",
44
+ "@sema/gerador-typescript": "file:../gerador-typescript",
45
+ "@sema/gerador-javascript": "file:../gerador-javascript",
46
+ "@sema/gerador-html": "file:../gerador-html",
47
+ "@sema/gerador-css": "file:../gerador-css",
48
+ "@sema/padroes": "file:../padroes",
58
49
  "typescript": "^5.8.3"
59
- },
60
- "bundledDependencies": [
61
- "@sema/nucleo",
62
- "@sema/gerador-dart",
63
- "@sema/gerador-lua",
64
- "@sema/gerador-python",
65
- "@sema/gerador-typescript",
66
- "@sema/padroes"
67
- ]
68
- }
50
+ }
51
+ }
@@ -0,0 +1,82 @@
1
+ export interface SimboloCppExtraido {
2
+ simbolo: string;
3
+ retorno?: string;
4
+ parametros: Array<{ nome: string; tipoTexto?: string; obrigatorio: boolean }>;
5
+ }
6
+
7
+ function extrairParametrosCpp(assinatura: string): Array<{ nome: string; tipoTexto?: string; obrigatorio: boolean }> {
8
+ return assinatura.split(",").map((parametroBruto) => {
9
+ const parametro = parametroBruto.trim();
10
+ if (!parametro || parametro === "void") {
11
+ return undefined;
12
+ }
13
+ const semPadrao = parametro.split("=")[0]?.trim() ?? parametro;
14
+ const partes = semPadrao.split(/\s+/).filter(Boolean);
15
+ if (partes.length < 2) {
16
+ return undefined;
17
+ }
18
+ const nome = partes.at(-1)!.replace(/[&*]+$/, "");
19
+ const tipoTexto = partes.slice(0, -1).join(" ");
20
+ return {
21
+ nome,
22
+ tipoTexto,
23
+ obrigatorio: !parametro.includes("="),
24
+ };
25
+ }).filter((item): item is NonNullable<typeof item> => Boolean(item));
26
+ }
27
+
28
+ export function extrairSimbolosCpp(codigo: string): SimboloCppExtraido[] {
29
+ const simbolos = new Map<string, SimboloCppExtraido>();
30
+
31
+ for (const match of codigo.matchAll(/(?:^|\n)\s*(?:inline\s+|static\s+|virtual\s+|constexpr\s+|friend\s+|extern\s+|template\s*<[^>]+>\s*)*(?:[\w:<>~*&]+\s+)+([A-Za-z_]\w*)::([A-Za-z_]\w*)\s*\(([^)]*)\)\s*(?:const)?\s*(?:\{|;)/g)) {
32
+ const simbolo = `${match[1]!}.${match[2]!}`;
33
+ simbolos.set(simbolo, {
34
+ simbolo,
35
+ parametros: extrairParametrosCpp(match[3] ?? ""),
36
+ });
37
+ }
38
+
39
+ for (const match of codigo.matchAll(/(?:^|\n)\s*(?:inline\s+|static\s+|virtual\s+|constexpr\s+|friend\s+|extern\s+)*(?:[\w:<>~*&]+\s+)+([A-Za-z_]\w*)\s*\(([^)]*)\)\s*(?:const)?\s*(?:\{|;)/g)) {
40
+ const nome = match[1]!;
41
+ if (["if", "for", "while", "switch", "return"].includes(nome)) {
42
+ continue;
43
+ }
44
+ if (!simbolos.has(nome)) {
45
+ simbolos.set(nome, {
46
+ simbolo: nome,
47
+ parametros: extrairParametrosCpp(match[2] ?? ""),
48
+ });
49
+ }
50
+ }
51
+
52
+ const pilhaClasses: string[] = [];
53
+ for (const linha of codigo.split(/\r?\n/)) {
54
+ const trim = linha.trim();
55
+ const classe = trim.match(/^(?:class|struct)\s+([A-Za-z_]\w*)/);
56
+ if (classe) {
57
+ pilhaClasses.push(classe[1]!);
58
+ continue;
59
+ }
60
+ if (trim.startsWith("};") || trim === "}" || trim === "};") {
61
+ pilhaClasses.pop();
62
+ continue;
63
+ }
64
+
65
+ const metodoClasse = trim.match(/^(?:inline\s+|static\s+|virtual\s+|constexpr\s+)*(?:[\w:<>~*&]+\s+)+([A-Za-z_]\w*)\s*\(([^)]*)\)\s*(?:const)?\s*\{/);
66
+ if (metodoClasse && pilhaClasses.length > 0) {
67
+ const nomeClasse = pilhaClasses[pilhaClasses.length - 1]!;
68
+ const nomeMetodo = metodoClasse[1]!;
69
+ if (!["if", "for", "while", "switch"].includes(nomeMetodo)) {
70
+ const simbolo = `${nomeClasse}.${nomeMetodo}`;
71
+ if (!simbolos.has(simbolo)) {
72
+ simbolos.set(simbolo, {
73
+ simbolo,
74
+ parametros: extrairParametrosCpp(metodoClasse[2] ?? ""),
75
+ });
76
+ }
77
+ }
78
+ }
79
+ }
80
+
81
+ return [...simbolos.values()];
82
+ }