@open-rap/compiler 0.0.0-stage → 0.1.1

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 (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -2
  3. package/dist/agent/server.d.ts +35 -0
  4. package/dist/agent/server.js +408 -0
  5. package/dist/agent/server.js.map +1 -0
  6. package/dist/authoring/abapgit.d.ts +38 -0
  7. package/dist/authoring/abapgit.js +242 -0
  8. package/dist/authoring/abapgit.js.map +1 -0
  9. package/dist/authoring/catalog.d.ts +48 -0
  10. package/dist/authoring/catalog.js +117 -0
  11. package/dist/authoring/catalog.js.map +1 -0
  12. package/dist/authoring/floorplan.d.ts +28 -0
  13. package/dist/authoring/floorplan.js +31 -0
  14. package/dist/authoring/floorplan.js.map +1 -0
  15. package/dist/authoring/generate.d.ts +57 -0
  16. package/dist/authoring/generate.js +630 -0
  17. package/dist/authoring/generate.js.map +1 -0
  18. package/dist/authoring/mcp.d.ts +15 -0
  19. package/dist/authoring/mcp.js +52 -0
  20. package/dist/authoring/mcp.js.map +1 -0
  21. package/dist/authoring/new.d.ts +35 -0
  22. package/dist/authoring/new.js +389 -0
  23. package/dist/authoring/new.js.map +1 -0
  24. package/dist/bdef/ast.d.ts +249 -0
  25. package/dist/bdef/ast.js +3 -0
  26. package/dist/bdef/ast.js.map +1 -0
  27. package/dist/bdef/lexer.d.ts +105 -0
  28. package/dist/bdef/lexer.js +148 -0
  29. package/dist/bdef/lexer.js.map +1 -0
  30. package/dist/bdef/parser.d.ts +22 -0
  31. package/dist/bdef/parser.js +1012 -0
  32. package/dist/bdef/parser.js.map +1 -0
  33. package/dist/build.d.ts +26 -0
  34. package/dist/build.js +62 -0
  35. package/dist/build.js.map +1 -0
  36. package/dist/cds/adapter.d.ts +91 -0
  37. package/dist/cds/adapter.js +381 -0
  38. package/dist/cds/adapter.js.map +1 -0
  39. package/dist/cds/expression-ast.d.ts +65 -0
  40. package/dist/cds/expression-ast.js +330 -0
  41. package/dist/cds/expression-ast.js.map +1 -0
  42. package/dist/cli.d.ts +9 -0
  43. package/dist/cli.js +485 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/dcl/parser.d.ts +59 -0
  46. package/dist/dcl/parser.js +338 -0
  47. package/dist/dcl/parser.js.map +1 -0
  48. package/dist/ddic/catalog.d.ts +17 -0
  49. package/dist/ddic/catalog.js +211 -0
  50. package/dist/ddic/catalog.js.map +1 -0
  51. package/dist/ddic/cds-types.d.ts +47 -0
  52. package/dist/ddic/cds-types.js +131 -0
  53. package/dist/ddic/cds-types.js.map +1 -0
  54. package/dist/ddic/table-source.d.ts +70 -0
  55. package/dist/ddic/table-source.js +500 -0
  56. package/dist/ddic/table-source.js.map +1 -0
  57. package/dist/ddic/xml.d.ts +65 -0
  58. package/dist/ddic/xml.js +201 -0
  59. package/dist/ddic/xml.js.map +1 -0
  60. package/dist/dev.d.ts +128 -0
  61. package/dist/dev.js +434 -0
  62. package/dist/dev.js.map +1 -0
  63. package/dist/diagnostics.d.ts +33 -0
  64. package/dist/diagnostics.js +53 -0
  65. package/dist/diagnostics.js.map +1 -0
  66. package/dist/gen/abap/derived-types.d.ts +26 -0
  67. package/dist/gen/abap/derived-types.js +323 -0
  68. package/dist/gen/abap/derived-types.js.map +1 -0
  69. package/dist/gen/abap/eml.d.ts +118 -0
  70. package/dist/gen/abap/eml.js +362 -0
  71. package/dist/gen/abap/eml.js.map +1 -0
  72. package/dist/gen/abap/enums.d.ts +13 -0
  73. package/dist/gen/abap/enums.js +74 -0
  74. package/dist/gen/abap/enums.js.map +1 -0
  75. package/dist/gen/abap/framework-http.d.ts +14 -0
  76. package/dist/gen/abap/framework-http.js +1049 -0
  77. package/dist/gen/abap/framework-http.js.map +1 -0
  78. package/dist/gen/abap/framework-query.d.ts +14 -0
  79. package/dist/gen/abap/framework-query.js +225 -0
  80. package/dist/gen/abap/framework-query.js.map +1 -0
  81. package/dist/gen/abap/framework-utils.d.ts +29 -0
  82. package/dist/gen/abap/framework-utils.js +3707 -0
  83. package/dist/gen/abap/framework-utils.js.map +1 -0
  84. package/dist/gen/abap/framework.d.ts +12 -0
  85. package/dist/gen/abap/framework.js +480 -0
  86. package/dist/gen/abap/framework.js.map +1 -0
  87. package/dist/gen/abap/generate.d.ts +40 -0
  88. package/dist/gen/abap/generate.js +238 -0
  89. package/dist/gen/abap/generate.js.map +1 -0
  90. package/dist/gen/abap/rewrite.d.ts +82 -0
  91. package/dist/gen/abap/rewrite.js +957 -0
  92. package/dist/gen/abap/rewrite.js.map +1 -0
  93. package/dist/gen/abap/shadow.d.ts +25 -0
  94. package/dist/gen/abap/shadow.js +175 -0
  95. package/dist/gen/abap/shadow.js.map +1 -0
  96. package/dist/gen/abap/tokens.d.ts +33 -0
  97. package/dist/gen/abap/tokens.js +87 -0
  98. package/dist/gen/abap/tokens.js.map +1 -0
  99. package/dist/gen/app/index.d.ts +25 -0
  100. package/dist/gen/app/index.js +322 -0
  101. package/dist/gen/app/index.js.map +1 -0
  102. package/dist/gen/csdl.d.ts +11 -0
  103. package/dist/gen/csdl.js +562 -0
  104. package/dist/gen/csdl.js.map +1 -0
  105. package/dist/gen/deploy.d.ts +12 -0
  106. package/dist/gen/deploy.js +53 -0
  107. package/dist/gen/deploy.js.map +1 -0
  108. package/dist/gen/docs/index.d.ts +35 -0
  109. package/dist/gen/docs/index.js +267 -0
  110. package/dist/gen/docs/index.js.map +1 -0
  111. package/dist/gen/docs/markdown.d.ts +23 -0
  112. package/dist/gen/docs/markdown.js +187 -0
  113. package/dist/gen/docs/markdown.js.map +1 -0
  114. package/dist/gen/docs/site.d.ts +17 -0
  115. package/dist/gen/docs/site.js +106 -0
  116. package/dist/gen/docs/site.js.map +1 -0
  117. package/dist/gen/keycloak.d.ts +21 -0
  118. package/dist/gen/keycloak.js +90 -0
  119. package/dist/gen/keycloak.js.map +1 -0
  120. package/dist/gen/launchpad/index.d.ts +48 -0
  121. package/dist/gen/launchpad/index.js +302 -0
  122. package/dist/gen/launchpad/index.js.map +1 -0
  123. package/dist/gen/launchpad/ui.d.ts +14 -0
  124. package/dist/gen/launchpad/ui.js +350 -0
  125. package/dist/gen/launchpad/ui.js.map +1 -0
  126. package/dist/gen/mcp.d.ts +23 -0
  127. package/dist/gen/mcp.js +244 -0
  128. package/dist/gen/mcp.js.map +1 -0
  129. package/dist/gen/sql-expressions.d.ts +12 -0
  130. package/dist/gen/sql-expressions.js +136 -0
  131. package/dist/gen/sql-expressions.js.map +1 -0
  132. package/dist/gen/sql.d.ts +38 -0
  133. package/dist/gen/sql.js +612 -0
  134. package/dist/gen/sql.js.map +1 -0
  135. package/dist/gen/ui/index.d.ts +7 -0
  136. package/dist/gen/ui/index.js +27 -0
  137. package/dist/gen/ui/index.js.map +1 -0
  138. package/dist/gen/ui/layout.d.ts +230 -0
  139. package/dist/gen/ui/layout.js +511 -0
  140. package/dist/gen/ui/layout.js.map +1 -0
  141. package/dist/gen/ui/static.d.ts +55 -0
  142. package/dist/gen/ui/static.js +2901 -0
  143. package/dist/gen/ui/static.js.map +1 -0
  144. package/dist/gen/ui/views.d.ts +10 -0
  145. package/dist/gen/ui/views.js +511 -0
  146. package/dist/gen/ui/views.js.map +1 -0
  147. package/dist/gen/vendor.d.ts +23 -0
  148. package/dist/gen/vendor.js +68 -0
  149. package/dist/gen/vendor.js.map +1 -0
  150. package/dist/gen/xml.d.ts +9 -0
  151. package/dist/gen/xml.js +42 -0
  152. package/dist/gen/xml.js.map +1 -0
  153. package/dist/index.d.ts +20 -0
  154. package/dist/index.js +20 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/input/project.d.ts +50 -0
  157. package/dist/input/project.js +128 -0
  158. package/dist/input/project.js.map +1 -0
  159. package/dist/ir/access-controls.d.ts +11 -0
  160. package/dist/ir/access-controls.js +148 -0
  161. package/dist/ir/access-controls.js.map +1 -0
  162. package/dist/ir/authorizations.d.ts +25 -0
  163. package/dist/ir/authorizations.js +178 -0
  164. package/dist/ir/authorizations.js.map +1 -0
  165. package/dist/ir/behaviors.d.ts +16 -0
  166. package/dist/ir/behaviors.js +548 -0
  167. package/dist/ir/behaviors.js.map +1 -0
  168. package/dist/ir/builder.d.ts +20 -0
  169. package/dist/ir/builder.js +505 -0
  170. package/dist/ir/builder.js.map +1 -0
  171. package/dist/ir/config.d.ts +25 -0
  172. package/dist/ir/config.js +130 -0
  173. package/dist/ir/config.js.map +1 -0
  174. package/dist/ir/dictionary.d.ts +54 -0
  175. package/dist/ir/dictionary.js +328 -0
  176. package/dist/ir/dictionary.js.map +1 -0
  177. package/dist/ir/entities.d.ts +58 -0
  178. package/dist/ir/entities.js +676 -0
  179. package/dist/ir/entities.js.map +1 -0
  180. package/dist/ir/expressions.d.ts +33 -0
  181. package/dist/ir/expressions.js +327 -0
  182. package/dist/ir/expressions.js.map +1 -0
  183. package/dist/ir/handlers.d.ts +63 -0
  184. package/dist/ir/handlers.js +398 -0
  185. package/dist/ir/handlers.js.map +1 -0
  186. package/dist/ir/number-ranges.d.ts +24 -0
  187. package/dist/ir/number-ranges.js +74 -0
  188. package/dist/ir/number-ranges.js.map +1 -0
  189. package/dist/ir/seed.d.ts +23 -0
  190. package/dist/ir/seed.js +78 -0
  191. package/dist/ir/seed.js.map +1 -0
  192. package/dist/ir/service.d.ts +21 -0
  193. package/dist/ir/service.js +96 -0
  194. package/dist/ir/service.js.map +1 -0
  195. package/dist/launchpad/config.d.ts +47 -0
  196. package/dist/launchpad/config.js +321 -0
  197. package/dist/launchpad/config.js.map +1 -0
  198. package/dist/launchpad/workspace.d.ts +48 -0
  199. package/dist/launchpad/workspace.js +166 -0
  200. package/dist/launchpad/workspace.js.map +1 -0
  201. package/dist/srvd/parser.d.ts +36 -0
  202. package/dist/srvd/parser.js +193 -0
  203. package/dist/srvd/parser.js.map +1 -0
  204. package/dist/standard/data.d.ts +18 -0
  205. package/dist/standard/data.js +534 -0
  206. package/dist/standard/data.js.map +1 -0
  207. package/dist/standard/index.d.ts +36 -0
  208. package/dist/standard/index.js +507 -0
  209. package/dist/standard/index.js.map +1 -0
  210. package/dist/version.d.ts +2 -0
  211. package/dist/version.js +4 -0
  212. package/dist/version.js.map +1 -0
  213. package/docs/AGENTS.md +79 -0
  214. package/docs/ANNOTATIONS.md +76 -0
  215. package/docs/DECISIONS.md +1554 -0
  216. package/docs/DEPLOYMENT.md +113 -0
  217. package/docs/DIAGNOSTICS.md +116 -0
  218. package/docs/FEATURES.md +287 -0
  219. package/docs/GUIDE.md +560 -0
  220. package/docs/KNOWN_GAPS.md +216 -0
  221. package/docs/MCP.md +84 -0
  222. package/docs/PLAN.md +690 -0
  223. package/docs/README.md +148 -0
  224. package/docs/REMOTE_APIS.md +121 -0
  225. package/docs/ROADMAP.md +35 -0
  226. package/docs/UTILITIES.md +95 -0
  227. package/package.json +49 -3
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Generation of the JavaScript of the behavior pools: rewrite pass (D2), check with the
3
+ * transpiler's own abaplint configuration, then @abaplint/transpiler.
4
+ *
5
+ * The registry given to the transpiler holds only standard ABAP: the clean-room framework, the
6
+ * derived types interfaces, the shadow tables (D19) and the rewritten classes.
7
+ */
8
+ import * as abaplint from "@abaplint/core";
9
+ import { config as transpilerConfig, Transpiler, UnknownTypesEnum } from "@abaplint/transpiler";
10
+ import { derivedTypesInterfaceName } from "@open-rap/model";
11
+ import { Diagnostics } from "../../diagnostics.js";
12
+ import { Dictionary } from "../../ir/dictionary.js";
13
+ import { abaplintRegistry } from "../../ir/handlers.js";
14
+ import { generateDerivedTypes } from "./derived-types.js";
15
+ import { FRAMEWORK_SOURCES } from "./framework.js";
16
+ import { QUERY_FRAMEWORK_SOURCES } from "./framework-query.js";
17
+ import { frameworkClosure, frameworkObjectName } from "./framework-utils.js";
18
+ import { BdefCatalog, findModelProviders, findSaverClasses, poolBdefOf, rewriteAbapFile } from "./rewrite.js";
19
+ import { frameworkDictionary, shadowDataElement, shadowEntity, shadowTable } from "./shadow.js";
20
+ import { replaceEnumConstants } from "./enums.js";
21
+ /** Objects copied as they are into the transpiler's registry. */
22
+ const DDIC_TYPES = new Set(["DTEL", "DOMA", "TTYP", "MSAG"]);
23
+ /** Behavior pools of the model and the classes and interfaces of the project they use. */
24
+ function objectsToRewrite(project, model, registry) {
25
+ const candidates = new Map();
26
+ for (const file of project.files.filter((f) => f.type === "CLAS" || f.type === "INTF")) {
27
+ const key = `${file.type}:${file.name}`;
28
+ candidates.set(key, [...(candidates.get(key) ?? []), file]);
29
+ }
30
+ const names = new Map();
31
+ for (const key of candidates.keys()) {
32
+ names.set(key.slice(5).toLowerCase(), key);
33
+ }
34
+ const pools = [
35
+ ...model.behaviors.flatMap((b) => [b.implementationClass, ...b.entities.map((e) => e.implementationClass)]),
36
+ // the query classes of the custom entities (D43)
37
+ ...model.entities.map((e) => e.queryClass),
38
+ ].filter((c) => c !== undefined);
39
+ const wanted = new Set(pools.map((p) => `CLAS:${p.toUpperCase()}`).filter((k) => candidates.has(k)));
40
+ const queue = [...wanted];
41
+ while (queue.length > 0) {
42
+ const key = queue.shift();
43
+ const object = registry.getObject(key.slice(0, 4), key.slice(5));
44
+ if (!(object instanceof abaplint.ABAPObject)) {
45
+ continue;
46
+ }
47
+ for (const file of object.getABAPFiles()) {
48
+ for (const token of file.getTokens()) {
49
+ const used = names.get(token.getStr().toLowerCase());
50
+ if (used !== undefined && !wanted.has(used)) {
51
+ wanted.add(used);
52
+ queue.push(used);
53
+ }
54
+ }
55
+ }
56
+ }
57
+ return wanted;
58
+ }
59
+ function transpilerRegistry(sources) {
60
+ const registry = new abaplint.Registry(new abaplint.Config(JSON.stringify(transpilerConfig)));
61
+ for (const source of sources) {
62
+ registry.addFile(new abaplint.MemoryFile(source.fileName, source.content));
63
+ }
64
+ registry.parse();
65
+ return registry;
66
+ }
67
+ /** Rewrites the behavior pools and lists the ABAP given to the transpiler. */
68
+ export function abapSources(project, model, diagnostics) {
69
+ const catalog = new BdefCatalog(model);
70
+ const registry = abaplintRegistry(project);
71
+ const sources = FRAMEWORK_SOURCES.map((f) => ({ fileName: f.fileName, content: f.source }));
72
+ for (const bdef of catalog.bdefs) {
73
+ const { interfaceName, source } = generateDerivedTypes(model, bdef.behavior);
74
+ sources.push({ fileName: `${interfaceName.toLowerCase()}.intf.abap`, content: source });
75
+ }
76
+ for (const table of model.tables) {
77
+ const shadow = shadowTable(table);
78
+ sources.push({ fileName: shadow.fileName, content: shadow.content });
79
+ }
80
+ const projectObjects = new Set(project.files.map((f) => `${f.type}:${f.name}`));
81
+ for (const table of model.tables) {
82
+ projectObjects.add(`TABL:${table.name.toUpperCase()}`);
83
+ }
84
+ if (model.entities.some((e) => e.kind === "custom")) {
85
+ for (const source of QUERY_FRAMEWORK_SOURCES) {
86
+ sources.push({ fileName: source.fileName, content: source.source });
87
+ }
88
+ }
89
+ for (const entity of model.entities.filter((e) => (e.sqlView !== undefined || e.kind === "abstract" || e.kind === "custom") && !projectObjects.has(`TABL:${e.name.toUpperCase()}`))) {
90
+ const shadow = shadowEntity(entity);
91
+ sources.push({ fileName: shadow.fileName, content: shadow.content });
92
+ projectObjects.add(`TABL:${entity.name.toUpperCase()}`);
93
+ }
94
+ // CDS simple and enumerated types (D55): data elements of their base types for the transpiler
95
+ for (const { name, info } of new Dictionary(project, new Diagnostics()).cdsTypeEntries()) {
96
+ if (!projectObjects.has(`DTEL:${name.toUpperCase()}`)) {
97
+ const shadow = shadowDataElement(name, { ...info.type, dataElement: name.toUpperCase() }, info.label ?? name);
98
+ sources.push({ fileName: shadow.fileName, content: shadow.content });
99
+ projectObjects.add(`DTEL:${name.toUpperCase()}`);
100
+ }
101
+ }
102
+ for (const file of frameworkDictionary(projectObjects)) {
103
+ sources.push({ fileName: file.fileName, content: file.content });
104
+ }
105
+ for (const file of project.files.filter((f) => DDIC_TYPES.has(f.type) && f.extension === "xml")) {
106
+ sources.push({ fileName: file.fileName, content: file.content, original: file.path });
107
+ }
108
+ for (const key of objectsToRewrite(project, model, registry)) {
109
+ const [type = "", name = ""] = [key.slice(0, 4), key.slice(5)];
110
+ const object = registry.getObject(type, name);
111
+ if (!(object instanceof abaplint.ABAPObject)) {
112
+ continue;
113
+ }
114
+ const files = object.getABAPFiles();
115
+ const main = files.find((f) => /\.(clas|intf)\.abap$/.test(f.getFilename()));
116
+ const pool = poolBdefOf(catalog, name, main);
117
+ const saverClasses = findSaverClasses(files);
118
+ const modelProviders = findModelProviders(files);
119
+ for (const file of files) {
120
+ if (/\.testclasses\.abap$/.test(file.getFilename())) {
121
+ continue;
122
+ }
123
+ const original = project.files.find((f) => f.fileName === file.getFilename());
124
+ const rewritten = rewriteAbapFile(file, { catalog, diagnostics, file: original?.path ?? file.getFilename(), saverClasses, modelProviders, ...(pool === undefined ? {} : { pool }) });
125
+ const content = replaceEnumConstants(rewritten, model.enumTypes ?? []);
126
+ sources.push({ fileName: file.getFilename(), content, ...(original === undefined ? {} : { original: original.path }) });
127
+ }
128
+ for (const xml of project.files.filter((f) => f.type === type && f.name === name && f.extension === "xml")) {
129
+ sources.push({ fileName: xml.fileName, content: xml.content, original: xml.path });
130
+ }
131
+ }
132
+ // the utilities of ABAP Cloud the project uses (D40), unless it has objects of the same name
133
+ for (const util of frameworkClosure(sources.filter((s) => s.original !== undefined))) {
134
+ const type = (util.fileName.split(".")[1] ?? "").toUpperCase();
135
+ if (!projectObjects.has(`${type}:${frameworkObjectName(util.fileName).toUpperCase()}`)) {
136
+ sources.push({ fileName: util.fileName, content: util.source });
137
+ }
138
+ }
139
+ return sources;
140
+ }
141
+ /**
142
+ * Checks the rewritten ABAP with the configuration of the transpiler and reports the issues on
143
+ * the original files (the rewrite pass keeps the line numbers). Issues in generated sources are
144
+ * internal errors.
145
+ */
146
+ export function checkAbap(sources, diagnostics) {
147
+ const registry = transpilerRegistry(sources);
148
+ const byFile = new Map(sources.map((s) => [s.fileName, s]));
149
+ const seen = new Set();
150
+ for (const issue of registry.findIssues()) {
151
+ const source = byFile.get(issue.getFilename());
152
+ const line = issue.getStart().getRow();
153
+ const message = issue.getMessage();
154
+ const key = `${issue.getFilename()}:${line}:${message}`;
155
+ if (seen.has(key)) {
156
+ continue;
157
+ }
158
+ seen.add(key);
159
+ if (source?.original !== undefined) {
160
+ diagnostics.error("ABP004", `ABAP check error (${issue.getKey()}): ${message}`, { file: source.original, line, column: issue.getStart().getCol() });
161
+ }
162
+ else {
163
+ diagnostics.error("ABP008", `internal error in the generated ABAP ${issue.getFilename()}:${line}: ${message} (${issue.getKey()})`);
164
+ }
165
+ }
166
+ if (!diagnostics.hasErrors()) {
167
+ untypedSelectTargets(registry, byFile, diagnostics);
168
+ }
169
+ return registry;
170
+ }
171
+ /** abaplint types the result of some SELECTs as void ("SELECT_todo…"), alone or as table rows. */
172
+ function isUntypedSelectResult(type) {
173
+ const t = type instanceof abaplint.BasicTypes.TableType ? type.getRowType() : type;
174
+ return t instanceof abaplint.BasicTypes.VoidType && (t.getVoided() ?? "").startsWith("SELECT_todo");
175
+ }
176
+ /**
177
+ * Inline declarations of SELECT results that abaplint cannot type (a literal, an aggregate other
178
+ * than COUNT(*), an expression in the field list): the transpiled method would throw when it
179
+ * starts. Reported on the original line, the target has to be declared.
180
+ */
181
+ function untypedSelectTargets(registry, byFile, diagnostics) {
182
+ const seen = new Set();
183
+ for (const object of registry.getObjects()) {
184
+ if (!(object instanceof abaplint.ABAPObject) || !object.getABAPFiles().some((f) => byFile.get(f.getFilename())?.original !== undefined)) {
185
+ continue;
186
+ }
187
+ const { spaghetti } = new abaplint.SyntaxLogic(registry, object).run();
188
+ const visit = (node) => {
189
+ for (const id of Object.values(node.getData().vars)) {
190
+ const source = byFile.get(id.getFilename());
191
+ const key = `${id.getFilename()}:${id.getStart().getRow()}:${id.getName()}`;
192
+ if (source?.original === undefined || seen.has(key) || !isUntypedSelectResult(id.getType())) {
193
+ continue;
194
+ }
195
+ seen.add(key);
196
+ diagnostics.error("ABP009", `abaplint cannot type the inline declaration ${id.getName()} of this SELECT (literal, aggregate or expression in the field list): declare the target with DATA … TYPE …`, { file: source.original, line: id.getStart().getRow(), column: id.getStart().getCol() });
197
+ }
198
+ node.getChildren().forEach(visit);
199
+ };
200
+ visit(spaghetti.getTop());
201
+ }
202
+ }
203
+ /** Namespaced objects (/DMO/…) give module names with `#`, imported as `%23`: plain names are safer. */
204
+ function safeModulePath(file) {
205
+ return file.replace(/#/g, "_");
206
+ }
207
+ function safeImports(code) {
208
+ return code.replace(/(["'])(\.\/[^"'\n]*%23[^"'\n]*)\1/g, (_m, quote, specifier) => `${quote}${specifier.replace(/%23/g, "_")}${quote}`);
209
+ }
210
+ /** Rewrite, check and transpile. Returns undefined when there are errors (in `diagnostics`). */
211
+ export async function generateAbap(project, model, diagnostics, options = {}) {
212
+ const sources = abapSources(project, model, diagnostics);
213
+ if (diagnostics.hasErrors()) {
214
+ return undefined;
215
+ }
216
+ const registry = checkAbap(sources, diagnostics);
217
+ if (diagnostics.hasErrors()) {
218
+ return undefined;
219
+ }
220
+ model.abap = {
221
+ modules: ["init.mjs"],
222
+ derivedTypes: Object.fromEntries(model.behaviors.filter((b) => b.implementationType === "managed").map((b) => [b.name, derivedTypesInterfaceName(b.name)])),
223
+ };
224
+ if (options.transpile === false) {
225
+ return { sources, modules: [], entry: "init.mjs" };
226
+ }
227
+ try {
228
+ const output = await new Transpiler({ unknownTypes: UnknownTypesEnum.compileError, ignoreSourceMap: true, addCommonJS: true }).run(registry);
229
+ const modules = output.objects.map((o) => ({ path: safeModulePath(o.filename), content: safeImports(o.chunk.getCode()) }));
230
+ modules.push({ path: "init.mjs", content: safeImports(output.initializationScript) });
231
+ return { sources, modules, entry: "init.mjs" };
232
+ }
233
+ catch (error) {
234
+ diagnostics.error("ABP008", `transpiler: ${error.message}`);
235
+ return undefined;
236
+ }
237
+ }
238
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/gen/abap/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * The ABAP rewrite pass (decision D2): turns the behavior pools into standard ABAP that abaplint
3
+ * types completely and the transpiler accepts, without changing their meaning.
4
+ *
5
+ * - `FOR BEHAVIOR OF` is removed from the global class;
6
+ * - the RAP handler definitions (`METHODS x FOR VALIDATE ON SAVE …`) become plain methods whose
7
+ * parameters are typed with the derived types of the BDEF;
8
+ * - `TYPE TABLE|STRUCTURE|RESPONSE FOR …` become references to the derived types interface;
9
+ * - every EML statement becomes a sequence of calls to the kernel class ZRAP_EML, with the `#`
10
+ * of its operands made explicit and its inline declarations (`RESULT DATA(x)`) hoisted.
11
+ *
12
+ * Every replacement keeps the line count of the text it replaces, so that diagnostics on the
13
+ * rewritten sources point to the original lines.
14
+ */
15
+ import type * as abaplint from "@abaplint/core";
16
+ import { type ActionModel, type BehaviorModel, type EntityBehaviorModel, type EntityModel, type Model } from "@open-rap/model";
17
+ import type { Diagnostics } from "../../diagnostics.js";
18
+ export interface EntityInfo {
19
+ bdef: BdefInfo;
20
+ behavior: EntityBehaviorModel;
21
+ cds: EntityModel;
22
+ /** 1-based index of the entity in the BDEF (the `eN` of the derived type names). */
23
+ index: number;
24
+ }
25
+ export interface BdefInfo {
26
+ behavior: BehaviorModel;
27
+ /** Name of the derived types interface, lower case. */
28
+ iface: string;
29
+ entities: EntityInfo[];
30
+ }
31
+ export interface AssociationInfo {
32
+ name: string;
33
+ /** 1-based index among the associations of the source entity (the `bN`). */
34
+ index: number;
35
+ target: EntityInfo;
36
+ }
37
+ export declare class BdefCatalog {
38
+ readonly model: Model;
39
+ readonly bdefs: BdefInfo[];
40
+ constructor(model: Model);
41
+ bdef(name: string): BdefInfo | undefined;
42
+ isProjection(name: string): boolean;
43
+ entityOf(bdef: BdefInfo, name: string): EntityInfo | undefined;
44
+ /** An entity by its CDS name, in any managed BDEF. */
45
+ entityByName(name: string): EntityInfo | undefined;
46
+ associations(entity: EntityInfo): AssociationInfo[];
47
+ association(entity: EntityInfo, name: string): AssociationInfo | undefined;
48
+ action(entity: EntityInfo, name: string): {
49
+ action: ActionModel;
50
+ index: number;
51
+ } | undefined;
52
+ }
53
+ export interface RewriteContext {
54
+ catalog: BdefCatalog;
55
+ diagnostics: Diagnostics;
56
+ /** Path of the original file, for the diagnostics. */
57
+ file: string;
58
+ /** The BDEF the behavior pool implements, for the paths written with an alias only. */
59
+ pool?: BdefInfo;
60
+ /** Saver classes of the object (upper case) and whether they inherit from cl_abap_behavior_saver_failed. */
61
+ saverClasses?: Map<string, boolean>;
62
+ /** The class whose definition or implementation is being rewritten. */
63
+ current?: {
64
+ name: string;
65
+ part: "definition" | "implementation";
66
+ } | undefined;
67
+ /** Consumption model classes of a service consumption model (SCM2), upper case. */
68
+ modelProviders?: Set<string>;
69
+ }
70
+ /**
71
+ * Consumption model classes generated by a service consumption model (SCM2): `INHERITING FROM
72
+ * /iwbep/cl_v4_abs_pm_model_prov`. Their model definition uses the /iwbep/if_v4_pm_* interfaces of
73
+ * the SAP Gateway; the client proxy of the application reads the $metadata of the remote service
74
+ * instead, so the rewrite keeps the types and constants of these classes only (D31).
75
+ */
76
+ export declare function findModelProviders(files: readonly abaplint.ABAPFile[]): Set<string>;
77
+ /** Local saver classes of an object: `INHERITING FROM cl_abap_behavior_saver[_failed]`. */
78
+ export declare function findSaverClasses(files: readonly abaplint.ABAPFile[]): Map<string, boolean>;
79
+ /** Rewrites one ABAP file of a class or interface; returns the new source. */
80
+ export declare function rewriteAbapFile(file: abaplint.ABAPFile, context: RewriteContext): string;
81
+ /** The BDEF a class implements: `FOR BEHAVIOR OF x` in its definition, or the model. */
82
+ export declare function poolBdefOf(catalog: BdefCatalog, className: string, mainFile: abaplint.ABAPFile | undefined): BdefInfo | undefined;