semantifold 0.3.0 → 0.5.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 (303) hide show
  1. package/README.md +61 -15
  2. package/build/index.d.ts +52 -2
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +60 -8
  5. package/build/src/artifact-path.d.ts +23 -1
  6. package/build/src/artifact-path.d.ts.map +1 -1
  7. package/build/src/artifact-path.js +45 -3
  8. package/build/src/artifacts.d.ts.map +1 -1
  9. package/build/src/artifacts.js +66 -1
  10. package/build/src/backends/android.d.ts +49 -0
  11. package/build/src/backends/android.d.ts.map +1 -0
  12. package/build/src/backends/android.js +1274 -0
  13. package/build/src/backends/c-validation.d.ts.map +1 -1
  14. package/build/src/backends/c-validation.js +7 -3
  15. package/build/src/backends/cpp-validation.d.ts.map +1 -1
  16. package/build/src/backends/cpp-validation.js +7 -3
  17. package/build/src/backends/csharp.js +7 -1
  18. package/build/src/backends/dart-runtime.d.ts +2 -0
  19. package/build/src/backends/dart-runtime.d.ts.map +1 -0
  20. package/build/src/backends/dart-runtime.js +41 -0
  21. package/build/src/backends/dart.d.ts +20 -0
  22. package/build/src/backends/dart.d.ts.map +1 -0
  23. package/build/src/backends/dart.js +321 -0
  24. package/build/src/backends/effects.d.ts +60 -0
  25. package/build/src/backends/effects.d.ts.map +1 -0
  26. package/build/src/backends/effects.js +746 -0
  27. package/build/src/backends/go.js +18 -4
  28. package/build/src/backends/identifiers.d.ts +36 -4
  29. package/build/src/backends/identifiers.d.ts.map +1 -1
  30. package/build/src/backends/identifiers.js +160 -10
  31. package/build/src/backends/index.d.ts.map +1 -1
  32. package/build/src/backends/index.js +27 -4
  33. package/build/src/backends/ios.d.ts +68 -0
  34. package/build/src/backends/ios.d.ts.map +1 -0
  35. package/build/src/backends/ios.js +1503 -0
  36. package/build/src/backends/java.d.ts.map +1 -1
  37. package/build/src/backends/java.js +429 -36
  38. package/build/src/backends/javascript.d.ts +6 -0
  39. package/build/src/backends/javascript.d.ts.map +1 -1
  40. package/build/src/backends/javascript.js +380 -24
  41. package/build/src/backends/kotlin-runtime.d.ts +3 -0
  42. package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
  43. package/build/src/backends/kotlin-runtime.js +29 -0
  44. package/build/src/backends/kotlin.d.ts +33 -0
  45. package/build/src/backends/kotlin.d.ts.map +1 -0
  46. package/build/src/backends/kotlin.js +138 -0
  47. package/build/src/backends/native-validation.d.ts +2 -2
  48. package/build/src/backends/native-validation.d.ts.map +1 -1
  49. package/build/src/backends/native-validation.js +2 -2
  50. package/build/src/backends/ordered-expressions.d.ts.map +1 -1
  51. package/build/src/backends/ordered-expressions.js +39 -7
  52. package/build/src/backends/php-stdlib-support.d.ts +19 -0
  53. package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
  54. package/build/src/backends/php-stdlib-support.js +227 -0
  55. package/build/src/backends/php.d.ts.map +1 -1
  56. package/build/src/backends/php.js +448 -33
  57. package/build/src/backends/program.d.ts +83 -0
  58. package/build/src/backends/program.d.ts.map +1 -0
  59. package/build/src/backends/program.js +1309 -0
  60. package/build/src/backends/python.js +7 -1
  61. package/build/src/backends/ruby.d.ts.map +1 -1
  62. package/build/src/backends/ruby.js +310 -24
  63. package/build/src/backends/rust-runtime.d.ts +7 -0
  64. package/build/src/backends/rust-runtime.d.ts.map +1 -0
  65. package/build/src/backends/rust-runtime.js +32 -0
  66. package/build/src/backends/rust-validation.d.ts +9 -0
  67. package/build/src/backends/rust-validation.d.ts.map +1 -0
  68. package/build/src/backends/rust-validation.js +78 -0
  69. package/build/src/backends/rust.d.ts +24 -0
  70. package/build/src/backends/rust.d.ts.map +1 -0
  71. package/build/src/backends/rust.js +344 -0
  72. package/build/src/backends/scalars.d.ts +14 -6
  73. package/build/src/backends/scalars.d.ts.map +1 -1
  74. package/build/src/backends/scalars.js +167 -17
  75. package/build/src/backends/shared.d.ts +23 -4
  76. package/build/src/backends/shared.d.ts.map +1 -1
  77. package/build/src/backends/shared.js +2174 -62
  78. package/build/src/backends/stdlib-support.d.ts +14 -0
  79. package/build/src/backends/stdlib-support.d.ts.map +1 -0
  80. package/build/src/backends/stdlib-support.js +237 -0
  81. package/build/src/backends/swift-runtime.d.ts +3 -0
  82. package/build/src/backends/swift-runtime.d.ts.map +1 -0
  83. package/build/src/backends/swift-runtime.js +14 -0
  84. package/build/src/backends/swift.d.ts +8 -0
  85. package/build/src/backends/swift.d.ts.map +1 -0
  86. package/build/src/backends/swift.js +127 -0
  87. package/build/src/backends/typescript.d.ts.map +1 -1
  88. package/build/src/backends/typescript.js +344 -24
  89. package/build/src/backends/wasm.d.ts +43 -0
  90. package/build/src/backends/wasm.d.ts.map +1 -0
  91. package/build/src/backends/wasm.js +2164 -0
  92. package/build/src/backends/writer.d.ts +255 -4
  93. package/build/src/backends/writer.d.ts.map +1 -1
  94. package/build/src/backends/writer.js +491 -3
  95. package/build/src/diagnostic.d.ts +4 -3
  96. package/build/src/diagnostic.d.ts.map +1 -1
  97. package/build/src/diagnostic.js +5 -3
  98. package/build/src/frontends/c.d.ts.map +1 -1
  99. package/build/src/frontends/c.js +5 -3
  100. package/build/src/frontends/cpp.d.ts.map +1 -1
  101. package/build/src/frontends/cpp.js +5 -3
  102. package/build/src/frontends/csharp.d.ts.map +1 -1
  103. package/build/src/frontends/csharp.js +7 -3
  104. package/build/src/frontends/dart.d.ts +10 -0
  105. package/build/src/frontends/dart.d.ts.map +1 -0
  106. package/build/src/frontends/dart.js +913 -0
  107. package/build/src/frontends/index.d.ts +3 -1
  108. package/build/src/frontends/index.d.ts.map +1 -1
  109. package/build/src/frontends/index.js +15 -5
  110. package/build/src/frontends/java.d.ts +110 -1
  111. package/build/src/frontends/java.d.ts.map +1 -1
  112. package/build/src/frontends/java.js +1725 -70
  113. package/build/src/frontends/javascript-typescript.d.ts +69 -1
  114. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  115. package/build/src/frontends/javascript-typescript.js +1825 -93
  116. package/build/src/frontends/kotlin.d.ts +10 -0
  117. package/build/src/frontends/kotlin.d.ts.map +1 -0
  118. package/build/src/frontends/kotlin.js +685 -0
  119. package/build/src/frontends/php.d.ts +118 -1
  120. package/build/src/frontends/php.d.ts.map +1 -1
  121. package/build/src/frontends/php.js +1583 -76
  122. package/build/src/frontends/program.d.ts +74 -0
  123. package/build/src/frontends/program.d.ts.map +1 -0
  124. package/build/src/frontends/program.js +989 -0
  125. package/build/src/frontends/ruby.d.ts +68 -1
  126. package/build/src/frontends/ruby.d.ts.map +1 -1
  127. package/build/src/frontends/ruby.js +1446 -101
  128. package/build/src/frontends/rust-parser.d.ts +11 -0
  129. package/build/src/frontends/rust-parser.d.ts.map +1 -0
  130. package/build/src/frontends/rust-parser.js +15 -0
  131. package/build/src/frontends/rust.d.ts +14 -0
  132. package/build/src/frontends/rust.d.ts.map +1 -0
  133. package/build/src/frontends/rust.js +715 -0
  134. package/build/src/frontends/scalars.d.ts +10 -0
  135. package/build/src/frontends/scalars.d.ts.map +1 -1
  136. package/build/src/frontends/scalars.js +28 -2
  137. package/build/src/frontends/swift.d.ts +10 -0
  138. package/build/src/frontends/swift.d.ts.map +1 -0
  139. package/build/src/frontends/swift.js +860 -0
  140. package/build/src/frontends/types.d.ts +186 -0
  141. package/build/src/frontends/types.d.ts.map +1 -0
  142. package/build/src/frontends/types.js +634 -0
  143. package/build/src/language-registry.d.ts +46 -4
  144. package/build/src/language-registry.d.ts.map +1 -1
  145. package/build/src/language-registry.js +177 -13
  146. package/build/src/mapping.d.ts +2 -2
  147. package/build/src/mapping.d.ts.map +1 -1
  148. package/build/src/mapping.js +31 -10
  149. package/build/src/semantic/capabilities.d.ts +66 -0
  150. package/build/src/semantic/capabilities.d.ts.map +1 -0
  151. package/build/src/semantic/capabilities.js +649 -0
  152. package/build/src/semantic/effects.d.ts +26 -0
  153. package/build/src/semantic/effects.d.ts.map +1 -0
  154. package/build/src/semantic/effects.js +764 -0
  155. package/build/src/semantic/generics.d.ts +23 -0
  156. package/build/src/semantic/generics.d.ts.map +1 -0
  157. package/build/src/semantic/generics.js +61 -0
  158. package/build/src/semantic/lifetime.d.ts +37 -0
  159. package/build/src/semantic/lifetime.d.ts.map +1 -0
  160. package/build/src/semantic/lifetime.js +527 -0
  161. package/build/src/semantic/provenance.d.ts +9 -2
  162. package/build/src/semantic/provenance.d.ts.map +1 -1
  163. package/build/src/semantic/provenance.js +462 -20
  164. package/build/src/semantic/scalars.d.ts +11 -0
  165. package/build/src/semantic/scalars.d.ts.map +1 -1
  166. package/build/src/semantic/scalars.js +16 -1
  167. package/build/src/semantic/stdlib.d.ts +254 -0
  168. package/build/src/semantic/stdlib.d.ts.map +1 -0
  169. package/build/src/semantic/stdlib.js +880 -0
  170. package/build/src/semantic/types.d.ts +3108 -178
  171. package/build/src/semantic/types.d.ts.map +1 -1
  172. package/build/src/semantic/types.js +730 -15
  173. package/build/src/semantic/validate.d.ts +85 -5
  174. package/build/src/semantic/validate.d.ts.map +1 -1
  175. package/build/src/semantic/validate.js +2576 -98
  176. package/build/src/stdlib-facades.d.ts +304 -0
  177. package/build/src/stdlib-facades.d.ts.map +1 -0
  178. package/build/src/stdlib-facades.js +1167 -0
  179. package/build/src/stdlib-negotiation.d.ts +69 -0
  180. package/build/src/stdlib-negotiation.d.ts.map +1 -0
  181. package/build/src/stdlib-negotiation.js +403 -0
  182. package/build/src/stdlib-providers.d.ts +72 -0
  183. package/build/src/stdlib-providers.d.ts.map +1 -0
  184. package/build/src/stdlib-providers.js +339 -0
  185. package/build/src/toolchains.d.ts +55 -1
  186. package/build/src/toolchains.d.ts.map +1 -1
  187. package/build/src/toolchains.js +15 -4
  188. package/docs/android.md +79 -0
  189. package/docs/architecture.md +47 -13
  190. package/docs/dart.md +60 -0
  191. package/docs/goals.md +3 -3
  192. package/docs/ios.md +121 -0
  193. package/docs/kotlin.md +42 -0
  194. package/docs/language-support.md +238 -26
  195. package/docs/multi-file-modules.md +52 -0
  196. package/docs/parser-qualification.md +121 -8
  197. package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
  198. package/docs/rust.md +88 -0
  199. package/docs/source-maps.md +17 -7
  200. package/docs/specification.md +5 -0
  201. package/docs/standard-library-portability.md +39 -8
  202. package/docs/swift.md +44 -0
  203. package/docs/testing.md +381 -4
  204. package/docs/webassembly.md +52 -0
  205. package/index.js +66 -8
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
  236. package/package.json +5 -2
  237. package/src/artifact-path.js +47 -2
  238. package/src/artifacts.js +67 -0
  239. package/src/backends/android.js +1370 -0
  240. package/src/backends/c-validation.js +6 -1
  241. package/src/backends/cpp-validation.js +6 -1
  242. package/src/backends/csharp.js +3 -0
  243. package/src/backends/dart-runtime.js +41 -0
  244. package/src/backends/dart.js +326 -0
  245. package/src/backends/effects.js +705 -0
  246. package/src/backends/go.js +14 -2
  247. package/src/backends/identifiers.js +166 -9
  248. package/src/backends/index.js +27 -2
  249. package/src/backends/ios.js +1612 -0
  250. package/src/backends/java.js +454 -36
  251. package/src/backends/javascript.js +389 -23
  252. package/src/backends/kotlin-runtime.js +29 -0
  253. package/src/backends/kotlin.js +144 -0
  254. package/src/backends/native-validation.js +1 -1
  255. package/src/backends/ordered-expressions.js +40 -6
  256. package/src/backends/php-stdlib-support.js +239 -0
  257. package/src/backends/php.js +469 -32
  258. package/src/backends/program.js +1408 -0
  259. package/src/backends/python.js +3 -0
  260. package/src/backends/ruby.js +326 -23
  261. package/src/backends/rust-runtime.js +34 -0
  262. package/src/backends/rust-validation.js +75 -0
  263. package/src/backends/rust.js +335 -0
  264. package/src/backends/scalars.js +141 -16
  265. package/src/backends/shared.js +2314 -115
  266. package/src/backends/stdlib-support.js +234 -0
  267. package/src/backends/swift-runtime.js +14 -0
  268. package/src/backends/swift.js +132 -0
  269. package/src/backends/typescript.js +349 -23
  270. package/src/backends/wasm.js +2208 -0
  271. package/src/backends/writer.js +545 -2
  272. package/src/diagnostic.js +4 -2
  273. package/src/frontends/c.js +4 -2
  274. package/src/frontends/cpp.js +4 -2
  275. package/src/frontends/csharp.js +4 -2
  276. package/src/frontends/dart.js +963 -0
  277. package/src/frontends/index.js +14 -4
  278. package/src/frontends/java.js +1977 -69
  279. package/src/frontends/javascript-typescript.js +2046 -102
  280. package/src/frontends/kotlin.js +713 -0
  281. package/src/frontends/php.js +1725 -79
  282. package/src/frontends/program.js +1062 -0
  283. package/src/frontends/ruby.js +1624 -98
  284. package/src/frontends/rust-parser.js +18 -0
  285. package/src/frontends/rust.js +714 -0
  286. package/src/frontends/scalars.js +31 -1
  287. package/src/frontends/swift.js +893 -0
  288. package/src/frontends/types.js +750 -0
  289. package/src/language-registry.js +182 -12
  290. package/src/mapping.js +33 -9
  291. package/src/semantic/capabilities.js +671 -0
  292. package/src/semantic/effects.js +737 -0
  293. package/src/semantic/generics.js +58 -0
  294. package/src/semantic/lifetime.js +517 -0
  295. package/src/semantic/provenance.js +412 -19
  296. package/src/semantic/scalars.js +17 -0
  297. package/src/semantic/stdlib.js +921 -0
  298. package/src/semantic/types.js +810 -14
  299. package/src/semantic/validate.js +2934 -209
  300. package/src/stdlib-facades.js +1211 -0
  301. package/src/stdlib-negotiation.js +446 -0
  302. package/src/stdlib-providers.js +377 -0
  303. package/src/toolchains.js +16 -3
@@ -0,0 +1,335 @@
1
+ // @ts-check
2
+
3
+ import {unsupportedCapability} from "../diagnostic.js"
4
+ import {finalizeMapping, toSourceMapV3} from "../mapping.js"
5
+ import {validateBackendModule} from "./shared.js"
6
+ import {validateNativeGraph} from "./native-validation.js"
7
+ import {maximumRustSourceLength, validateRustValues} from "./rust-validation.js"
8
+ import {rustLockfile, rustManifest, rustRuntime} from "./rust-runtime.js"
9
+ import {emitScalarType} from "./scalars.js"
10
+ import {SourceWriter} from "./writer.js"
11
+
12
+ /** @typedef {import("../semantic/types.js").SemanticModule} SemanticModule */
13
+ /** @typedef {import("../semantic/types.js").SemanticNode} SemanticNode */
14
+ /** @typedef {import("../semantic/types.js").Expression} Expression */
15
+ /** @typedef {import("../semantic/types.js").SemanticTypeName} Scalar */
16
+
17
+ const operators = new Map([
18
+ ["IntegerAdd", "semantifold_integer_add"], ["IntegerSubtract", "semantifold_integer_subtract"],
19
+ ["IntegerMultiply", "semantifold_integer_multiply"], ["IntegerEqual", "=="], ["IntegerNotEqual", "!="],
20
+ ["IntegerLessThan", "<"], ["IntegerLessThanOrEqual", "<="], ["IntegerGreaterThan", ">"], ["IntegerGreaterThanOrEqual", ">="],
21
+ ["BooleanEqual", "=="], ["BooleanNotEqual", "!="], ["BooleanAnd", "&&"], ["BooleanOr", "||"],
22
+ ["StringConcat", "+"], ["StringEqual", "=="], ["StringNotEqual", "!="]
23
+ ])
24
+
25
+ /**
26
+ * Produces a complete deterministic offline Cargo project after full validation and size preflight.
27
+ * @param {{filename?: string, mapDirective?: unknown, module: SemanticModule, sourceMapFilename?: unknown, sources?: {filename: string, content: string, language?: import("../semantic/types.js").SemanticLanguage}[]}} input - Artifact-set request.
28
+ * @returns {{artifacts: import("../semantic/types.js").GeneratedSetArtifact[], target: string}} Complete candidate set.
29
+ */
30
+ export function generateRustProject({filename, mapDirective, module, sourceMapFilename, sources}) {
31
+ validateNativeGraph(module, "rust")
32
+ validateBackendModule(module, "rust")
33
+ validateRustValues(module)
34
+ if (filename !== undefined && filename != "src/main.rs") unsupportedCapability("rust", "artifact filename other than src/main.rs", module.location)
35
+ if (mapDirective !== undefined || sourceMapFilename !== undefined) unsupportedCapability("rust", "source-map filename or directive option", module.location)
36
+ new RustEmitter(module).program(module)
37
+ const writer = new SourceWriter({filename: "src/main.rs", language: "rust", module, sources})
38
+
39
+ new RustEmitter(module, writer).program(module)
40
+ const mapping = finalizeMapping(writer.finish())
41
+ const root = mapping.nodes.find(node => node.path == "")
42
+
43
+ if (!root) throw new Error("Validated Rust module omitted root provenance.")
44
+ const origin = root.origin
45
+ const relatedOrigins = origin.kind == "source" ? [{location: origin.location, nodeId: root.id, role: "module", sourceId: origin.sourceId}] :
46
+ (origin.kind == "derived" ? origin.origins : origin.relatedOrigins).map(item => ({...item, nodeId: item.nodeId ?? root.id, role: item.role ?? "module"}))
47
+
48
+ return {target: "rust", artifacts: [{
49
+ path: "Cargo.toml", role: "manifest", ownership: "generated", contentKind: "text", mediaType: "text/plain", content: rustManifest,
50
+ provenance: {kind: "synthetic", reason: "Fixed dependency-free edition-2021 Cargo package, Rust 1.98.1 minimum and matching dev/release abort/overflow profiles.", relatedOrigins}
51
+ }, {
52
+ path: "Cargo.lock", role: "support", ownership: "generated", contentKind: "text", mediaType: "text/plain", content: rustLockfile,
53
+ provenance: {kind: "synthetic", reason: "Exact dependency-free format-4 lockfile generated and qualified with Cargo 1.98.1.", relatedOrigins}
54
+ }, {
55
+ path: "src/main.rs", role: "entry", ownership: "generated", contentKind: "text", mediaType: "text/x-rust", content: mapping.generated.content,
56
+ provenance: {kind: "text", mapping, sourceMap: toSourceMapV3(mapping)}
57
+ }]}
58
+ }
59
+
60
+ /** Emits native left-to-right expressions with explicit owned String copy boundaries. */
61
+ class RustEmitter {
62
+ /**
63
+ * Binds validated result types and an optional writer for the size-only preflight.
64
+ * @param {SemanticModule} module - Complete validated semantics.
65
+ * @param {SourceWriter} [writer] - Absent during size preflight.
66
+ */
67
+ constructor(module, writer) {
68
+ this.writer = writer
69
+ /** @type {Map<string, Scalar>} */
70
+ this.functions = new Map(module.functions.map(declaration => [declaration.name, rustScalarType(declaration.returnType, declaration.location)]))
71
+ this.length = 0
72
+ this.location = module.location
73
+ }
74
+
75
+ /**
76
+ * Bounds exact source length before any public artifact or writer is exposed.
77
+ * @param {string} text - Next text chunk.
78
+ * @param {SemanticNode} node - Related semantic origin.
79
+ * @returns {void}
80
+ */
81
+ checkSize(text, node) {
82
+ this.length += text.length
83
+ if (this.length > maximumRustSourceLength) unsupportedCapability("rust", "generated program exceeds the frozen Rust parser's 32767 UTF-16 input limit",
84
+ "location" in node ? node.location : this.location)
85
+ }
86
+
87
+ /**
88
+ * Emits target-owned syntax with explicit related semantic provenance.
89
+ * @param {string} text - Rust syntax.
90
+ * @param {SemanticNode} node - Related node.
91
+ * @param {string} path - Semantic occurrence.
92
+ * @param {string} [reason] - Synthetic syntax purpose.
93
+ * @returns {void}
94
+ */
95
+ synthetic(text, node, path, reason = "Rust declaration and expression syntax") {
96
+ this.checkSize(text, node)
97
+ this.writer?.synthetic(text, reason, [node], [path])
98
+ }
99
+
100
+ /**
101
+ * Emits an original semantic token or declaration anchor.
102
+ * @param {string} text - Target token.
103
+ * @param {SemanticNode} node - Original node.
104
+ * @param {string} path - Occurrence path.
105
+ * @param {string} [role] - Original parser role.
106
+ * @returns {void}
107
+ */
108
+ mapped(text, node, path, role) {
109
+ this.checkSize(text, node)
110
+ this.writer?.mapped(text, {mappingKind: role ? "exact" : "anchor", node, path, ...(role ? {role} : {})})
111
+ }
112
+
113
+ /**
114
+ * Resolves an already validated expression's native scalar representation.
115
+ * @param {Expression} expression - Validated expression.
116
+ * @param {Map<string, Scalar>} bindings - Lexical types.
117
+ * @returns {Scalar} Result scalar.
118
+ */
119
+ type(expression, bindings) {
120
+ if (expression.kind == "IntegerLiteral") return "integer"
121
+ if (expression.kind == "BooleanLiteral") return "boolean"
122
+ if (expression.kind == "StringLiteral") return "string"
123
+ if (expression.kind == "UnaryExpression" || expression.kind == "BinaryExpression") return expression.type
124
+ if (expression.kind != "CallExpression" && expression.kind != "IdentifierExpression") {
125
+ return unsupportedCapability("rust", "collection expression reached scalar emission", expression.location)
126
+ }
127
+ const type = expression.kind == "CallExpression" ? this.functions.get(expression.callee) : bindings.get(expression.name)
128
+
129
+ if (!type) throw new Error("Validated Rust expression lost its scalar type.")
130
+ return type
131
+ }
132
+
133
+ /**
134
+ * Emits fixed support, crate-root functions and the parameterless entry point.
135
+ * @param {SemanticModule} module - Validated module.
136
+ * @returns {void}
137
+ */
138
+ program(module) {
139
+ this.synthetic(rustRuntime, module, "", "Exact Rust scalar, print and overflow support")
140
+ module.functions.forEach((declaration, index) => {
141
+ const path = `/functions/${index}`
142
+
143
+ this.synthetic("\n", declaration, path)
144
+ this.mapped("fn", declaration, path)
145
+ this.synthetic(" ", declaration, path)
146
+ this.mapped(declaration.name, declaration, path, "name")
147
+ this.synthetic("(", declaration, path)
148
+ declaration.parameters.forEach((parameter, parameterIndex) => {
149
+ const parameterPath = `${path}/parameters/${parameterIndex}`
150
+
151
+ if (parameterIndex) this.synthetic(", ", parameter, parameterPath)
152
+ this.mapped(parameter.name, parameter, parameterPath, "name")
153
+ this.synthetic(": ", parameter, parameterPath)
154
+ this.mapped(emitScalarType("rust", parameter.type), parameter.type, `${parameterPath}/type`, "type")
155
+ })
156
+ this.synthetic(") -> ", declaration, path)
157
+ this.mapped(emitScalarType("rust", declaration.returnType), declaration.returnType, `${path}/returnType`, "type")
158
+ this.synthetic(" {\n", declaration, path)
159
+ this.block(declaration.body, `${path}/body`, " ", new Map(declaration.parameters.map(parameter => [
160
+ parameter.name, rustScalarType(parameter.type, parameter.location)
161
+ ])))
162
+ this.synthetic("}\n", declaration, path)
163
+ })
164
+ this.synthetic("\nfn main() {\n", module.entryPoint, "/entryPoint")
165
+ this.block(module.entryPoint.body, "/entryPoint/body", " ", new Map())
166
+ this.synthetic("}\n", module.entryPoint, "/entryPoint")
167
+ }
168
+
169
+ /**
170
+ * Emits statements in order with independent branch binding environments.
171
+ * @param {import("../semantic/types.js").Block} block - Semantic block.
172
+ * @param {string} path - Occurrence path.
173
+ * @param {string} indent - Current indentation.
174
+ * @param {Map<string, Scalar>} inherited - Visible lexical types.
175
+ * @param {number} [depth] - Exact generated CST block depth, root source file at zero.
176
+ * @returns {void}
177
+ */
178
+ block(block, path, indent, inherited, depth = 2) {
179
+ if (depth + 1 > 512) unsupportedCapability("rust", "generated Rust CST exceeds the 512-level traversal limit", block.location)
180
+ const bindings = new Map(inherited)
181
+
182
+ block.statements.forEach((statement, index) => {
183
+ this.statement(statement, `${path}/statements/${index}`, indent, bindings, depth)
184
+ if (statement.kind == "LocalDeclaration") bindings.set(statement.name, rustScalarType(statement.type, statement.location))
185
+ })
186
+ }
187
+
188
+ /**
189
+ * Emits one semantic statement, copying String values except for terminal owned returns.
190
+ * @param {import("../semantic/types.js").Statement} statement - Statement.
191
+ * @param {string} path - Occurrence path.
192
+ * @param {string} indent - Indentation.
193
+ * @param {Map<string, Scalar>} bindings - Visible types.
194
+ * @param {number} depth - Enclosing generated CST block depth.
195
+ * @returns {void}
196
+ */
197
+ statement(statement, path, indent, bindings, depth) {
198
+ this.synthetic(indent, statement, path)
199
+ if (statement.kind == "ExpressionStatement") throw new TypeError("Rust Task 005 expression statement reached emission.")
200
+ if (statement.kind == "LocalDeclaration") {
201
+ this.mapped(statement.mutable ? "let mut" : "let", statement, path)
202
+ this.synthetic(" ", statement, path)
203
+ this.mapped(statement.name, statement, path, "name")
204
+ this.synthetic(": ", statement, path)
205
+ this.mapped(emitScalarType("rust", statement.type), statement.type, `${path}/type`, "type")
206
+ this.synthetic(" ", statement, path)
207
+ this.mapped("=", statement, path, "operator")
208
+ this.synthetic(" ", statement, path)
209
+ this.expression(statement.initializer, `${path}/initializer`, bindings, true, depth + 2)
210
+ } else if (statement.kind == "AssignmentStatement") {
211
+ this.mapped(statement.target.name, statement.target, `${path}/target`, "name")
212
+ this.synthetic(" ", statement, path)
213
+ this.mapped("=", statement, path, "operator")
214
+ this.synthetic(" ", statement, path)
215
+ this.expression(statement.expression, `${path}/expression`, bindings, true, depth + 3)
216
+ } else if (statement.kind == "ReturnStatement") {
217
+ if (!statement.expression) throw new TypeError("Rust bare return reached emission.")
218
+ this.mapped("return", statement, path)
219
+ this.synthetic(" ", statement, path)
220
+ this.expression(statement.expression, `${path}/expression`, bindings, false, depth + 3)
221
+ } else if (statement.kind == "PrintStatement") {
222
+ this.mapped(`semantifold_print_${this.type(statement.expression, bindings)}`, statement, path)
223
+ this.synthetic("(", statement, path)
224
+ this.expression(statement.expression, `${path}/expression`, bindings, true, depth + 4)
225
+ this.synthetic(")", statement, path)
226
+ } else if (statement.kind == "IfStatement") {
227
+ this.mapped("if", statement, path)
228
+ this.synthetic(" ", statement, path)
229
+ this.expression(statement.condition, `${path}/condition`, bindings, true, depth + 3)
230
+ this.synthetic(" {\n", statement, path)
231
+ this.block(statement.consequent, `${path}/consequent`, indent + " ", bindings, depth + 3)
232
+ this.synthetic(indent + "}", statement, path)
233
+ if (statement.alternate) {
234
+ this.mapped(" else ", statement, path)
235
+ this.synthetic("{\n", statement, path)
236
+ this.block(statement.alternate, `${path}/alternate`, indent + " ", bindings, depth + 4)
237
+ this.synthetic(indent + "}", statement, path)
238
+ }
239
+ this.synthetic("\n", statement, path)
240
+ return
241
+ } else {
242
+ throw new TypeError("Unsupported Rust statement reached emission.")
243
+ }
244
+ this.synthetic(";\n", statement, path)
245
+ }
246
+
247
+ /**
248
+ * Emits ordinary Rust left-to-right and short-circuit expressions without temporary reordering.
249
+ * @param {Expression} expression - Expression occurrence.
250
+ * @param {string} path - Occurrence path.
251
+ * @param {Map<string, Scalar>} bindings - Lexical types.
252
+ * @param {boolean} [copy] - Whether an identifier crosses an owned value-copy boundary.
253
+ * @param {number} [depth] - Exact generated CST expression depth.
254
+ * @returns {void}
255
+ */
256
+ expression(expression, path, bindings, copy = true, depth = 0) {
257
+ const leafDepth = expression.kind == "StringLiteral" ? 3 : expression.kind == "IdentifierExpression" && copy && this.type(expression, bindings) == "string" ? 2 :
258
+ expression.kind == "BooleanLiteral" ? 1 : 0
259
+
260
+ if (depth + leafDepth > 512) unsupportedCapability("rust", "generated Rust CST exceeds the 512-level traversal limit", expression.location)
261
+ if (expression.kind == "IdentifierExpression") {
262
+ this.mapped(expression.name, expression, path, "name")
263
+ if (copy && this.type(expression, bindings) == "string") this.synthetic(".clone()", expression, path, "Owned String value copy")
264
+ } else if (expression.kind == "BooleanLiteral") this.mapped(String(expression.value), expression, path, "literal")
265
+ else if (expression.kind == "IntegerLiteral") {
266
+ this.mapped(String(expression.value), expression, path, "literal")
267
+ this.synthetic("i64", expression, path, "Exact signed-64-bit scalar suffix")
268
+ } else if (expression.kind == "StringLiteral") {
269
+ this.synthetic("String::from(", expression, path, "Owned UTF-8 String construction")
270
+ let literal = '"'
271
+
272
+ for (const character of expression.value) {
273
+ const codePoint = /** @type {number} */ (character.codePointAt(0))
274
+
275
+ if (character == '"') literal += '\\"'
276
+ else if (character == "\\") literal += "\\\\"
277
+ else if (codePoint < 32 || codePoint == 127 || codePoint == 0x2028 || codePoint == 0x2029) literal += `\\u{${codePoint.toString(16)}}`
278
+ else literal += character
279
+ }
280
+ this.mapped(literal + '"', expression, path, "literal")
281
+ this.synthetic(")", expression, path, "Owned UTF-8 String construction")
282
+ } else if (expression.kind == "CallExpression") {
283
+ this.mapped(expression.callee, expression, path, "callee")
284
+ this.synthetic("(", expression, path)
285
+ expression.arguments.forEach((argument, index) => {
286
+ if (index) this.synthetic(", ", expression, path)
287
+ this.expression(argument, `${path}/arguments/${index}`, bindings, true, depth + 2)
288
+ })
289
+ this.synthetic(")", expression, path)
290
+ } else if (expression.kind == "UnaryExpression") {
291
+ this.mapped(expression.operation == "IntegerNegate" ? "semantifold_integer_negate" : "!", expression, path, "operator")
292
+ this.synthetic("(", expression, path)
293
+ this.expression(expression.operand, `${path}/operand`, bindings, true, depth + 2)
294
+ this.synthetic(")", expression, path)
295
+ } else {
296
+ if (expression.kind != "BinaryExpression") {
297
+ return unsupportedCapability("rust", "collection expression reached scalar emission", expression.location)
298
+ }
299
+ const token = operators.get(expression.operation)
300
+
301
+ if (!token) throw new Error("Unsupported operation passed Rust validation.")
302
+ const helper = token.startsWith("semantifold_")
303
+ const comparison = expression.operation == "StringEqual" || expression.operation == "StringNotEqual"
304
+
305
+ if (helper) this.mapped(token, expression, path, "operator")
306
+ this.synthetic("(", expression, path)
307
+ this.expression(expression.left, `${path}/left`, bindings, !comparison, depth + 2)
308
+ if (helper) this.synthetic(", ", expression, path)
309
+ else {
310
+ this.synthetic(" ", expression, path)
311
+ this.mapped(token, expression, path, "operator")
312
+ this.synthetic(" ", expression, path)
313
+ }
314
+ if (expression.operation == "StringConcat") this.synthetic("&(", expression.right, `${path}/right`, "Borrowed String concatenation operand")
315
+ this.expression(expression.right, `${path}/right`, bindings, !comparison && expression.operation != "StringConcat",
316
+ depth + (expression.operation == "StringConcat" ? 4 : 2))
317
+ if (expression.operation == "StringConcat") this.synthetic(")", expression.right, `${path}/right`, "Borrowed String concatenation operand")
318
+ this.synthetic(")", expression, path)
319
+ }
320
+ }
321
+ }
322
+
323
+ /**
324
+ * Narrows a type after Rust collection capability rejection.
325
+ * @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
326
+ * @param {import("../semantic/types.js").SourceLocation} location - Owning location.
327
+ * @returns {Scalar} Scalar type.
328
+ */
329
+ function rustScalarType(type, location) {
330
+ if (type.kind != "TypeReference" || type.name == "void") {
331
+ return unsupportedCapability("rust", "collection or void type reached scalar emission", location)
332
+ }
333
+
334
+ return type.name
335
+ }
@@ -1,39 +1,88 @@
1
1
  // @ts-check
2
2
 
3
- /** @type {Readonly<Record<import("../semantic/types.js").SemanticLanguage, Readonly<Record<import("../semantic/types.js").SemanticTypeName, string>>>>} */
3
+ /** @type {Readonly<Record<import("../semantic/types.js").TextBackendLanguage, Readonly<Record<import("../semantic/types.js").FunctionReturnTypeName, string>>>>} */
4
4
  const targetScalarTypes = Object.freeze({
5
- cpp: Object.freeze({boolean: "bool", integer: "std::int64_t", string: "std::string"}),
6
- c: Object.freeze({boolean: "bool", integer: "int64_t", string: "SemantifoldString"}),
7
- csharp: Object.freeze({boolean: "bool", integer: "long", string: "string"}),
8
- go: Object.freeze({boolean: "bool", integer: "int64", string: "string"}),
9
- java: Object.freeze({boolean: "boolean", integer: "int", string: "String"}),
10
- javascript: Object.freeze({boolean: "boolean", integer: "number", string: "string"}),
11
- php: Object.freeze({boolean: "bool", integer: "int", string: "string"}),
12
- python: Object.freeze({boolean: "bool", integer: "int", string: "str"}),
13
- ruby: Object.freeze({boolean: "bool", integer: "Integer", string: "String"}),
14
- typescript: Object.freeze({boolean: "boolean", integer: "number", string: "string"})
5
+ dart: Object.freeze({boolean: "bool", integer: "int", string: "String", void: "void"}),
6
+ swift: Object.freeze({boolean: "Bool", integer: "Int64", string: "String", void: "Void"}),
7
+ rust: Object.freeze({boolean: "bool", integer: "i64", string: "String", void: "()"}),
8
+ cpp: Object.freeze({boolean: "bool", integer: "std::int64_t", string: "std::string", void: "void"}),
9
+ c: Object.freeze({boolean: "bool", integer: "int64_t", string: "SemantifoldString", void: "void"}),
10
+ csharp: Object.freeze({boolean: "bool", integer: "long", string: "string", void: "void"}),
11
+ go: Object.freeze({boolean: "bool", integer: "int64", string: "string", void: "void"}),
12
+ java: Object.freeze({boolean: "boolean", integer: "int", string: "String", void: "void"}),
13
+ kotlin: Object.freeze({boolean: "Boolean", integer: "Long", string: "String", void: "Unit"}),
14
+ javascript: Object.freeze({boolean: "boolean", integer: "number", string: "string", void: "void"}),
15
+ php: Object.freeze({boolean: "bool", integer: "int", string: "string", void: "void"}),
16
+ python: Object.freeze({boolean: "bool", integer: "int", string: "str", void: "None"}),
17
+ ruby: Object.freeze({boolean: "bool", integer: "Integer", string: "String", void: "void"}),
18
+ typescript: Object.freeze({boolean: "boolean", integer: "number", string: "string", void: "void"})
15
19
  })
16
20
 
17
21
  /**
18
- * Emits one target-language scalar type spelling.
19
- * @param {import("../semantic/types.js").SemanticLanguage} language - Target language.
20
- * @param {import("../semantic/types.js").TypeReference} type - Semantic scalar type.
22
+ * Emits one target-language scalar or function-return type spelling.
23
+ * @param {import("../semantic/types.js").TextBackendLanguage} language - Target language.
24
+ * @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
21
25
  * @returns {string} Target type spelling.
22
26
  */
23
27
  export function emitScalarType(language, type) {
24
- return targetScalarTypes[language][type.name]
28
+ return type.kind == "TypeReference" ? targetScalarTypes[language][type.name] : ""
29
+ }
30
+
31
+ /**
32
+ * Emits one recursively parameterized semantic type for the Task 006 cohort.
33
+ * @param {import("../semantic/types.js").TextBackendLanguage} language - Target language.
34
+ * @param {import("../semantic/types.js").SemanticFunctionReturnType} type - Semantic type.
35
+ * @param {boolean} [javaBoxed] - Whether Java scalar arguments require boxed spellings.
36
+ * @returns {string} Exact target spelling.
37
+ */
38
+ export function emitSemanticType(language, type, javaBoxed = false) {
39
+ if (type.kind == "RecordType" || type.kind == "ReferenceType") {
40
+ throw new TypeError("Nominal type emission requires declaration context.")
41
+ }
42
+ if (type.kind == "OwnedResourceType" || type.kind == "OwnedReferenceType") {
43
+ throw new TypeError("Owned type emission requires declaration context.")
44
+ }
45
+ if (type.kind == "TypeVariableReference") throw new TypeError("Type-variable emission requires declaration context.")
46
+ if (type.kind == "OptionalType") throw new TypeError("Optional type emission requires target-specific context.")
47
+ if (type.kind == "TypeReference") {
48
+ if (language == "java" && javaBoxed) {
49
+ return type.name == "integer" ? "Integer" : type.name == "boolean" ? "Boolean" : type.name == "string" ? "String" : "void"
50
+ }
51
+
52
+ return emitScalarType(language, type)
53
+ }
54
+
55
+ const element = type.kind == "ListType" ? type.elementType : type.valueType
56
+ const nested = emitSemanticType(language, element, language == "java")
57
+
58
+ if (type.kind == "ListType") {
59
+ if (language == "ruby") return `Array[${nested}]`
60
+ if (language == "php") return `list<${nested}>`
61
+ if (language == "javascript" || language == "typescript") return `ReadonlyArray<${nested}>`
62
+ if (language == "java") return `java.util.List<${nested}>`
63
+ } else {
64
+ if (language == "ruby") return `Hash[String,${nested}]`
65
+ if (language == "php") return `array<string,${nested}>`
66
+ if (language == "javascript" || language == "typescript") return `ReadonlyMap<string, ${nested}>`
67
+ if (language == "java") return `java.util.Map<String,${nested}>`
68
+ }
69
+
70
+ return ""
25
71
  }
26
72
 
27
73
  /**
28
74
  * Emits a safely escaped target-language string literal.
29
- * @param {import("../semantic/types.js").SemanticLanguage} language - Target language.
75
+ * @param {import("../semantic/types.js").TextBackendLanguage} language - Target language.
30
76
  * @param {string} value - Valid Unicode scalar string.
31
77
  * @returns {string} Target string literal.
32
78
  */
33
79
  export function emitStringLiteral(language, value) {
80
+ if (language == "dart") return emitDartString(value)
81
+ if (language == "swift") return emitSwiftString(value)
34
82
  if (language == "php") return emitPhpString(value)
35
83
  if (language == "ruby") return emitRubyString(value)
36
84
  if (language == "java") return emitJavaString(value)
85
+ if (language == "kotlin") return emitKotlinString(value)
37
86
 
38
87
  const literal = JSON.stringify(value)
39
88
 
@@ -44,6 +93,57 @@ export function emitStringLiteral(language, value) {
44
93
  return language == "csharp" ? escapedLineSeparators.replaceAll("\u0085", "\\u0085") : escapedLineSeparators
45
94
  }
46
95
 
96
+ /**
97
+ * Emits an ordinary noninterpolated Dart string.
98
+ * @param {string} value Valid Unicode scalar string.
99
+ * @returns {string} Dart string literal.
100
+ */
101
+ function emitDartString(value) {
102
+ let emitted = "\""
103
+
104
+ for (const character of value) {
105
+ const codePoint = /** @type {number} */ (character.codePointAt(0))
106
+
107
+ if (character == "\"") emitted += "\\\""
108
+ else if (character == "\\") emitted += "\\\\"
109
+ else if (character == "$") emitted += "\\$"
110
+ else if (character == "\n") emitted += "\\n"
111
+ else if (character == "\r") emitted += "\\r"
112
+ else if (character == "\t") emitted += "\\t"
113
+ else if (character == "\b") emitted += "\\b"
114
+ else if (character == "\f") emitted += "\\f"
115
+ else if (character == "\v") emitted += "\\v"
116
+ else if (codePoint < 32 || codePoint == 127 || codePoint == 0x85 || codePoint == 0x2028 || codePoint == 0x2029) {
117
+ emitted += `\\u{${codePoint.toString(16)}}`
118
+ } else emitted += character
119
+ }
120
+ return `${emitted}"`
121
+ }
122
+
123
+ /**
124
+ * Emits one noninterpolated Swift string over Unicode scalar values.
125
+ * @param {string} value - Valid Unicode scalar string.
126
+ * @returns {string} Swift string literal.
127
+ */
128
+ function emitSwiftString(value) {
129
+ let emitted = "\""
130
+
131
+ for (const character of value) {
132
+ const codePoint = /** @type {number} */ (character.codePointAt(0))
133
+
134
+ if (character == "\"") emitted += "\\\""
135
+ else if (character == "\\") emitted += "\\\\"
136
+ else if (character == "\n") emitted += "\\n"
137
+ else if (character == "\r") emitted += "\\r"
138
+ else if (character == "\t") emitted += "\\t"
139
+ else if (codePoint < 32 || codePoint == 127 || codePoint == 0x85 || codePoint == 0x2028 || codePoint == 0x2029) {
140
+ emitted += `\\u{${codePoint.toString(16)}}`
141
+ } else emitted += character
142
+ }
143
+
144
+ return `${emitted}"`
145
+ }
146
+
47
147
  /**
48
148
  * Emits a PHP double-quoted string while preventing interpolation.
49
149
  * @param {string} value - Valid Unicode scalar string.
@@ -125,3 +225,28 @@ function emitJavaString(value) {
125
225
 
126
226
  return `${emitted}"`
127
227
  }
228
+
229
+ /**
230
+ * Emits an ordinary noninterpolated Kotlin string over Unicode scalar values.
231
+ * @param {string} value - Valid Unicode scalar string.
232
+ * @returns {string} Kotlin string literal.
233
+ */
234
+ function emitKotlinString(value) {
235
+ let emitted = "\""
236
+
237
+ for (const character of value) {
238
+ const codePoint = /** @type {number} */ (character.codePointAt(0))
239
+
240
+ if (character == "\"") emitted += "\\\""
241
+ else if (character == "\\") emitted += "\\\\"
242
+ else if (character == "$") emitted += "\\$"
243
+ else if (character == "\b") emitted += "\\b"
244
+ else if (character == "\t") emitted += "\\t"
245
+ else if (character == "\n") emitted += "\\n"
246
+ else if (character == "\r") emitted += "\\r"
247
+ else if (codePoint < 32 || codePoint == 127) emitted += `\\u${codePoint.toString(16).padStart(4, "0")}`
248
+ else emitted += character
249
+ }
250
+
251
+ return `${emitted}"`
252
+ }