@devaloop/devalang 0.0.1-alpha.9 → 0.0.1-beta.2

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 (322) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +6 -1
  3. package/.github/workflows/ci.yml +103 -0
  4. package/Cargo.toml +81 -48
  5. package/README.md +137 -154
  6. package/docs/CHANGELOG.md +428 -1
  7. package/docs/CONTRIBUTING.md +101 -0
  8. package/docs/ROADMAP.md +14 -7
  9. package/docs/TODO.md +16 -15
  10. package/examples/automation.deva +42 -0
  11. package/examples/bank.deva +7 -0
  12. package/examples/bus.deva +10 -0
  13. package/examples/duration.deva +9 -0
  14. package/examples/effect.deva +2 -0
  15. package/examples/events.deva +12 -0
  16. package/examples/filter.deva +11 -0
  17. package/examples/function.deva +15 -0
  18. package/examples/index.deva +57 -12
  19. package/examples/lfo.deva +9 -0
  20. package/examples/loop.deva +5 -12
  21. package/examples/pattern.deva +8 -0
  22. package/examples/plugin.deva +16 -0
  23. package/examples/synth.deva +11 -1
  24. package/examples/synth_types.deva +17 -0
  25. package/examples/variables.deva +1 -1
  26. package/out-tsc/bin/index.d.ts +2 -0
  27. package/out-tsc/bin/index.js +51 -7
  28. package/out-tsc/core/functions/index.d.ts +42 -0
  29. package/out-tsc/core/functions/index.js +87 -0
  30. package/out-tsc/core/index.d.ts +6 -0
  31. package/out-tsc/core/index.js +22 -0
  32. package/out-tsc/core/types/index.d.ts +4 -0
  33. package/out-tsc/core/types/index.js +20 -0
  34. package/out-tsc/core/types/plugin.d.ts +18 -0
  35. package/out-tsc/core/types/plugin.js +2 -0
  36. package/out-tsc/core/types/result.d.ts +27 -0
  37. package/out-tsc/core/types/result.js +2 -0
  38. package/out-tsc/core/types/statement.d.ts +106 -0
  39. package/out-tsc/core/types/statement.js +2 -0
  40. package/out-tsc/core/types/value.d.ts +43 -0
  41. package/out-tsc/core/types/value.js +2 -0
  42. package/out-tsc/index.d.ts +7 -0
  43. package/out-tsc/index.js +42 -1
  44. package/out-tsc/pkg/devalang_core.d.ts +15 -0
  45. package/out-tsc/pkg/devalang_core.js +65 -0
  46. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +34 -0
  47. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  48. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  49. package/out-tsc/scripts/postinstall.d.ts +1 -0
  50. package/out-tsc/scripts/postinstall.js +83 -0
  51. package/out-tsc/scripts/version/bump.d.ts +1 -0
  52. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  53. package/out-tsc/scripts/version/index.d.ts +1 -0
  54. package/out-tsc/scripts/version/sync.d.ts +1 -0
  55. package/package.json +28 -7
  56. package/project-version.json +4 -4
  57. package/rust/cli/bank/api.rs +122 -0
  58. package/rust/cli/bank/commands.rs +306 -0
  59. package/rust/cli/bank/mod.rs +29 -0
  60. package/rust/cli/build/commands.rs +153 -0
  61. package/rust/cli/build/mod.rs +2 -0
  62. package/rust/cli/build/process.rs +165 -0
  63. package/rust/cli/check/mod.rs +208 -0
  64. package/rust/cli/discover/commands.rs +253 -0
  65. package/rust/cli/discover/config.rs +111 -0
  66. package/rust/cli/discover/fs.rs +19 -0
  67. package/rust/cli/discover/install.rs +103 -0
  68. package/rust/cli/discover/metadata.rs +48 -0
  69. package/rust/cli/discover/mod.rs +5 -0
  70. package/rust/cli/{init.rs → init/commands.rs} +32 -23
  71. package/rust/cli/init/mod.rs +1 -0
  72. package/rust/cli/install/addon.rs +118 -0
  73. package/rust/cli/install/bank.rs +72 -0
  74. package/rust/cli/install/commands.rs +35 -0
  75. package/rust/cli/install/mod.rs +4 -0
  76. package/rust/cli/install/plugin.rs +80 -0
  77. package/rust/cli/login/commands.rs +124 -0
  78. package/rust/cli/login/mod.rs +1 -0
  79. package/rust/cli/mod.rs +9 -202
  80. package/rust/cli/parser.rs +359 -0
  81. package/rust/cli/play/commands.rs +375 -0
  82. package/rust/cli/play/io.rs +17 -0
  83. package/rust/cli/play/mod.rs +5 -0
  84. package/rust/cli/play/process.rs +159 -0
  85. package/rust/cli/play/realtime.rs +91 -0
  86. package/rust/cli/play/utils.rs +23 -0
  87. package/rust/cli/telemetry/commands.rs +22 -0
  88. package/rust/cli/telemetry/event_creator.rs +80 -0
  89. package/rust/cli/telemetry/mod.rs +3 -0
  90. package/rust/cli/telemetry/send.rs +51 -0
  91. package/rust/cli/{template.rs → template/commands.rs} +17 -5
  92. package/rust/cli/template/mod.rs +1 -0
  93. package/rust/cli/update/commands.rs +6 -0
  94. package/rust/cli/update/mod.rs +1 -0
  95. package/rust/config/driver.rs +112 -0
  96. package/rust/config/mod.rs +3 -16
  97. package/rust/config/ops.rs +26 -0
  98. package/rust/config/settings.rs +101 -0
  99. package/rust/core/audio/engine/driver.rs +220 -0
  100. package/rust/core/audio/engine/export.rs +169 -0
  101. package/rust/core/audio/engine/helpers.rs +178 -0
  102. package/rust/core/audio/engine/mod.rs +56 -0
  103. package/rust/core/audio/engine/notes/dsp.rs +85 -0
  104. package/rust/core/audio/engine/notes/mod.rs +44 -0
  105. package/rust/core/audio/engine/notes/params.rs +294 -0
  106. package/rust/core/audio/engine/sample/insert.rs +199 -0
  107. package/rust/core/audio/engine/sample/mod.rs +40 -0
  108. package/rust/core/audio/engine/sample/padding.rs +170 -0
  109. package/rust/core/audio/evaluator/condition.rs +61 -0
  110. package/rust/core/audio/evaluator/mod.rs +9 -0
  111. package/rust/core/audio/evaluator/numeric.rs +152 -0
  112. package/rust/core/audio/evaluator/rhs.rs +16 -0
  113. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  114. package/rust/core/audio/interpreter/driver.rs +574 -216
  115. package/rust/core/audio/interpreter/mod.rs +2 -12
  116. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
  117. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
  118. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
  119. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
  120. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  121. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  122. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  123. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  124. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  125. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  126. package/rust/core/audio/interpreter/statements/automate.rs +16 -0
  127. package/rust/core/audio/interpreter/statements/call.rs +295 -0
  128. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +72 -69
  129. package/rust/core/audio/interpreter/statements/function.rs +24 -0
  130. package/rust/core/audio/interpreter/statements/let_.rs +36 -0
  131. package/rust/core/audio/interpreter/statements/load.rs +17 -0
  132. package/rust/core/audio/interpreter/statements/loop_.rs +115 -0
  133. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  134. package/rust/core/audio/interpreter/statements/sleep.rs +28 -0
  135. package/rust/core/audio/interpreter/statements/spawn.rs +253 -0
  136. package/rust/core/audio/interpreter/statements/tempo.rs +40 -0
  137. package/rust/core/audio/interpreter/statements/trigger.rs +239 -0
  138. package/rust/core/audio/loader/mod.rs +1 -1
  139. package/rust/core/audio/loader/trigger.rs +98 -52
  140. package/rust/core/audio/mod.rs +2 -2
  141. package/rust/core/audio/player.rs +28 -12
  142. package/rust/core/audio/special/easing.rs +189 -0
  143. package/rust/core/audio/special/env.rs +45 -0
  144. package/rust/core/audio/special/math.rs +134 -0
  145. package/rust/core/audio/special/mod.rs +9 -0
  146. package/rust/core/audio/special/modulator.rs +143 -0
  147. package/rust/core/builder/mod.rs +129 -80
  148. package/rust/core/debugger/lexer.rs +4 -4
  149. package/rust/core/debugger/logs.rs +52 -0
  150. package/rust/core/debugger/mod.rs +11 -2
  151. package/rust/core/debugger/preprocessor.rs +4 -4
  152. package/rust/core/debugger/store.rs +38 -25
  153. package/rust/core/error/mod.rs +221 -12
  154. package/rust/core/lexer/driver.rs +59 -0
  155. package/rust/core/lexer/handler/arrow.rs +62 -11
  156. package/rust/core/lexer/handler/at.rs +5 -5
  157. package/rust/core/lexer/handler/brace.rs +11 -11
  158. package/rust/core/lexer/handler/colon.rs +5 -5
  159. package/rust/core/lexer/handler/comment.rs +3 -3
  160. package/rust/core/lexer/handler/dot.rs +6 -6
  161. package/rust/core/lexer/handler/driver.rs +143 -32
  162. package/rust/core/lexer/handler/identifier.rs +11 -5
  163. package/rust/core/lexer/handler/indent.rs +18 -4
  164. package/rust/core/lexer/handler/mod.rs +6 -5
  165. package/rust/core/lexer/handler/newline.rs +3 -3
  166. package/rust/core/lexer/handler/number.rs +5 -5
  167. package/rust/core/lexer/handler/operator.rs +5 -3
  168. package/rust/core/lexer/handler/parenthesis.rs +41 -0
  169. package/rust/core/lexer/handler/slash.rs +21 -0
  170. package/rust/core/lexer/handler/string.rs +3 -3
  171. package/rust/core/lexer/mod.rs +1 -49
  172. package/rust/core/lexer/token.rs +17 -12
  173. package/rust/core/mod.rs +9 -10
  174. package/rust/core/parser/driver/block.rs +111 -0
  175. package/rust/core/parser/driver/cursor.rs +82 -0
  176. package/rust/core/parser/driver/driver_impl.rs +139 -0
  177. package/rust/core/parser/driver/mod.rs +6 -0
  178. package/rust/core/parser/driver/parse_array.rs +120 -0
  179. package/rust/core/parser/driver/parse_map.rs +223 -0
  180. package/rust/core/parser/driver/parser.rs +160 -0
  181. package/rust/core/parser/handler/arrow_call.rs +277 -126
  182. package/rust/core/parser/handler/at.rs +142 -25
  183. package/rust/core/parser/handler/bank.rs +83 -20
  184. package/rust/core/parser/handler/condition.rs +14 -5
  185. package/rust/core/parser/handler/dot.rs +111 -75
  186. package/rust/core/parser/handler/identifier/automate.rs +254 -0
  187. package/rust/core/parser/handler/identifier/call.rs +74 -24
  188. package/rust/core/parser/handler/identifier/emit.rs +70 -0
  189. package/rust/core/parser/handler/identifier/function.rs +113 -0
  190. package/rust/core/parser/handler/identifier/group.rs +28 -14
  191. package/rust/core/parser/handler/identifier/let_.rs +61 -21
  192. package/rust/core/parser/handler/identifier/mod.rs +24 -20
  193. package/rust/core/parser/handler/identifier/on.rs +107 -0
  194. package/rust/core/parser/handler/identifier/print.rs +49 -0
  195. package/rust/core/parser/handler/identifier/sleep.rs +77 -14
  196. package/rust/core/parser/handler/identifier/spawn.rs +81 -31
  197. package/rust/core/parser/handler/identifier/synth.rs +102 -32
  198. package/rust/core/parser/handler/loop_.rs +144 -22
  199. package/rust/core/parser/handler/mod.rs +6 -5
  200. package/rust/core/parser/handler/pattern.rs +74 -0
  201. package/rust/core/parser/handler/tempo.rs +67 -9
  202. package/rust/core/parser/mod.rs +3 -4
  203. package/rust/core/parser/statement.rs +6 -92
  204. package/rust/core/plugin/loader.rs +137 -0
  205. package/rust/core/plugin/mod.rs +2 -0
  206. package/rust/core/plugin/runner/mod.rs +11 -0
  207. package/rust/core/plugin/runner/non_wasm.rs +297 -0
  208. package/rust/core/plugin/runner/wasm32.rs +43 -0
  209. package/rust/core/preprocessor/loader/inject.rs +278 -0
  210. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  211. package/rust/core/preprocessor/loader/mod.rs +235 -0
  212. package/rust/core/preprocessor/mod.rs +4 -4
  213. package/rust/core/preprocessor/module.rs +55 -50
  214. package/rust/core/preprocessor/processor/handlers.rs +107 -0
  215. package/rust/core/preprocessor/processor/mod.rs +1 -0
  216. package/rust/core/preprocessor/resolver/bank.rs +14 -12
  217. package/rust/core/preprocessor/resolver/call.rs +106 -105
  218. package/rust/core/preprocessor/resolver/condition.rs +13 -10
  219. package/rust/core/preprocessor/resolver/driver.rs +145 -48
  220. package/rust/core/preprocessor/resolver/function.rs +69 -0
  221. package/rust/core/preprocessor/resolver/group.rs +122 -61
  222. package/rust/core/preprocessor/resolver/let_.rs +13 -12
  223. package/rust/core/preprocessor/resolver/loop_.rs +240 -13
  224. package/rust/core/preprocessor/resolver/mod.rs +8 -6
  225. package/rust/core/preprocessor/resolver/pattern.rs +83 -0
  226. package/rust/core/preprocessor/resolver/spawn.rs +83 -42
  227. package/rust/core/preprocessor/resolver/synth.rs +15 -11
  228. package/rust/core/preprocessor/resolver/tempo.rs +13 -14
  229. package/rust/core/preprocessor/resolver/trigger.rs +32 -28
  230. package/rust/core/preprocessor/resolver/value.rs +111 -13
  231. package/rust/core/store/global.rs +57 -39
  232. package/rust/core/store/mod.rs +0 -3
  233. package/rust/lib.rs +323 -117
  234. package/rust/main.rs +388 -65
  235. package/rust/types/Cargo.toml +11 -0
  236. package/rust/types/src/addons.rs +55 -0
  237. package/rust/types/src/ast.rs +202 -0
  238. package/rust/types/src/config.rs +84 -0
  239. package/rust/types/src/lib.rs +15 -0
  240. package/rust/types/src/plugin.rs +20 -0
  241. package/rust/types/src/store.rs +139 -0
  242. package/rust/types/src/telemetry.rs +85 -0
  243. package/rust/utils/Cargo.toml +26 -0
  244. package/rust/utils/src/error.rs +186 -0
  245. package/rust/utils/src/file.rs +94 -0
  246. package/rust/utils/src/first_usage.rs +97 -0
  247. package/rust/utils/{mod.rs → src/lib.rs} +6 -3
  248. package/rust/utils/{logger.rs → src/logger.rs} +94 -17
  249. package/rust/utils/src/path.rs +129 -0
  250. package/rust/utils/src/signature.rs +41 -0
  251. package/rust/utils/{spinner.rs → src/spinner.rs} +7 -8
  252. package/rust/utils/src/version.rs +27 -0
  253. package/rust/utils/{watcher.rs → src/watcher.rs} +17 -4
  254. package/rust/web/api.rs +5 -0
  255. package/rust/web/cdn.rs +34 -0
  256. package/rust/web/mod.rs +3 -0
  257. package/rust/web/sso.rs +5 -0
  258. package/templates/minimal/README.md +143 -127
  259. package/templates/welcome/README.md +143 -127
  260. package/templates/welcome/src/index.deva +56 -8
  261. package/templates/welcome/src/variables.deva +2 -4
  262. package/tests/integration.rs +21 -0
  263. package/tests/rust/cli_check_build.rs +21 -0
  264. package/tests/rust/cli_help.rs +12 -0
  265. package/tests/rust/cli_template_list.rs +10 -0
  266. package/tests/rust/cli_version.rs +11 -0
  267. package/tests/typescript/index.spec.ts +136 -0
  268. package/tests/typescript/playhead.spec.ts +36 -0
  269. package/tests/typescript/render_e2e.spec.ts +77 -0
  270. package/tsconfig.json +12 -10
  271. package/typescript/bin/index.ts +19 -5
  272. package/typescript/core/functions/index.ts +94 -0
  273. package/typescript/core/index.ts +6 -0
  274. package/typescript/core/types/index.ts +4 -0
  275. package/typescript/core/types/plugin.ts +19 -0
  276. package/typescript/core/types/result.ts +29 -0
  277. package/typescript/core/types/statement.ts +47 -0
  278. package/typescript/core/types/value.ts +29 -0
  279. package/typescript/index.ts +8 -1
  280. package/typescript/pkg/devalang_core.d.ts +4 -0
  281. package/typescript/pkg/devalang_core.ts +65 -0
  282. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  283. package/typescript/scripts/postinstall.ts +85 -0
  284. package/typescript/scripts/version/bump.ts +0 -1
  285. package/typescript/scripts/version/index.ts +0 -1
  286. package/docs/COMMANDS.md +0 -85
  287. package/docs/CONFIG.md +0 -30
  288. package/docs/SYNTAX.md +0 -210
  289. package/out-tsc/bin/devalang.exe +0 -0
  290. package/out-tsc/scripts/postbuild.js +0 -11
  291. package/rust/cli/build.rs +0 -137
  292. package/rust/cli/check.rs +0 -117
  293. package/rust/cli/play.rs +0 -193
  294. package/rust/config/loader.rs +0 -13
  295. package/rust/core/audio/engine.rs +0 -203
  296. package/rust/core/audio/evaluator.rs +0 -31
  297. package/rust/core/audio/interpreter/arrow_call.rs +0 -129
  298. package/rust/core/audio/interpreter/call.rs +0 -64
  299. package/rust/core/audio/interpreter/let_.rs +0 -19
  300. package/rust/core/audio/interpreter/load.rs +0 -18
  301. package/rust/core/audio/interpreter/loop_.rs +0 -67
  302. package/rust/core/audio/interpreter/sleep.rs +0 -36
  303. package/rust/core/audio/interpreter/spawn.rs +0 -66
  304. package/rust/core/audio/interpreter/tempo.rs +0 -16
  305. package/rust/core/audio/interpreter/trigger.rs +0 -69
  306. package/rust/core/audio/renderer.rs +0 -54
  307. package/rust/core/parser/driver.rs +0 -331
  308. package/rust/core/preprocessor/loader.rs +0 -193
  309. package/rust/core/preprocessor/processor.rs +0 -76
  310. package/rust/core/shared/duration.rs +0 -8
  311. package/rust/core/shared/mod.rs +0 -2
  312. package/rust/core/shared/value.rs +0 -18
  313. package/rust/core/store/export.rs +0 -28
  314. package/rust/core/store/import.rs +0 -28
  315. package/rust/core/store/variable.rs +0 -28
  316. package/rust/core/utils/mod.rs +0 -2
  317. package/rust/core/utils/path.rs +0 -31
  318. package/rust/core/utils/validation.rs +0 -37
  319. package/rust/utils/file.rs +0 -35
  320. package/rust/utils/signature.rs +0 -17
  321. package/rust/utils/version.rs +0 -15
  322. package/typescript/scripts/postbuild.ts +0 -8
@@ -1,30 +1,24 @@
1
- use std::collections::HashMap;
2
- use crate::{
3
- core::{
4
- parser::statement::{ Statement, StatementKind },
5
- preprocessor::{
6
- loader::ModuleLoader,
7
- module::Module,
8
- resolver::{
9
- bank::resolve_bank,
10
- call::resolve_call,
11
- condition::resolve_condition,
12
- group::resolve_group,
13
- let_::resolve_let,
14
- loop_::resolve_loop,
15
- spawn::resolve_spawn,
16
- tempo::resolve_tempo,
17
- trigger::resolve_trigger,
18
- },
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{
4
+ loader::ModuleLoader,
5
+ module::Module,
6
+ resolver::{
7
+ bank::resolve_bank, call::resolve_call, condition::resolve_condition,
8
+ function::resolve_function, group::resolve_group, let_::resolve_let,
9
+ loop_::resolve_loop, pattern::resolve_pattern, spawn::resolve_spawn,
10
+ tempo::resolve_tempo, trigger::resolve_trigger,
19
11
  },
20
- shared::value::Value,
21
- store::global::GlobalStore,
22
12
  },
23
- utils::logger::Logger,
13
+ store::global::GlobalStore,
24
14
  };
15
+ use devalang_types::Value;
16
+ use devalang_utils::logger::LogLevel;
17
+ use devalang_utils::logger::Logger;
18
+ use std::collections::HashMap;
25
19
 
26
20
  pub fn resolve_all_modules(module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
27
- for module in global_store.clone().modules.values_mut() {
21
+ for _module in global_store.clone().modules.values_mut() {
28
22
  resolve_imports(module_loader, global_store);
29
23
  }
30
24
  }
@@ -33,16 +27,55 @@ pub fn resolve_statement(
33
27
  stmt: &Statement,
34
28
  module: &Module,
35
29
  path: &str,
36
- global_store: &mut GlobalStore
30
+ global_store: &mut GlobalStore,
37
31
  ) -> Statement {
38
32
  match &stmt.kind {
39
- StatementKind::Trigger { entity, duration } =>
40
- resolve_trigger(stmt, entity, &mut duration.clone(), module, path, global_store),
33
+ StatementKind::On { event, args, body } => {
34
+ let resolved_body: Vec<Statement> = body
35
+ .iter()
36
+ .map(|s| resolve_statement(s, module, path, global_store))
37
+ .collect();
38
+ Statement {
39
+ kind: StatementKind::On {
40
+ event: event.clone(),
41
+ args: args.clone(),
42
+ body: resolved_body,
43
+ },
44
+ value: resolve_value(&stmt.value, module, global_store),
45
+ ..stmt.clone()
46
+ }
47
+ }
48
+ StatementKind::Emit { event, payload: _ } => Statement {
49
+ kind: StatementKind::Emit {
50
+ event: event.clone(),
51
+ payload: Some(resolve_value(&stmt.value, module, global_store)),
52
+ },
53
+ value: resolve_value(&stmt.value, module, global_store),
54
+ ..stmt.clone()
55
+ },
56
+ StatementKind::Trigger {
57
+ entity,
58
+ duration,
59
+ effects,
60
+ } => resolve_trigger(
61
+ stmt,
62
+ entity,
63
+ &mut duration.clone(),
64
+ effects.clone(),
65
+ module,
66
+ path,
67
+ global_store,
68
+ ),
41
69
  StatementKind::If => resolve_condition(stmt, module, path, global_store),
42
70
  StatementKind::Group => resolve_group(stmt, module, path, global_store),
43
- StatementKind::Call => resolve_call(stmt, module, path, global_store),
44
- StatementKind::Spawn => resolve_spawn(stmt, module, path, global_store),
45
- StatementKind::Bank => resolve_bank(stmt, module, path, global_store),
71
+ StatementKind::Pattern { .. } => resolve_pattern(stmt, module, path, global_store),
72
+ StatementKind::Call { name, args } => {
73
+ resolve_call(stmt, name.clone(), args.clone(), module, path, global_store)
74
+ }
75
+ StatementKind::Spawn { name, args } => {
76
+ resolve_spawn(stmt, name.clone(), args.clone(), module, path, global_store)
77
+ }
78
+ StatementKind::Bank { .. } => resolve_bank(stmt, module, path, global_store),
46
79
  StatementKind::Tempo => resolve_tempo(stmt, module, path, global_store),
47
80
  StatementKind::Loop => resolve_loop(stmt, module, path, global_store),
48
81
  StatementKind::Let { name, .. } => resolve_let(stmt, name, module, path, global_store),
@@ -59,6 +92,7 @@ pub fn resolve_statement(
59
92
  }
60
93
 
61
94
  fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
95
+ let logger = Logger::new();
62
96
  match value {
63
97
  Value::Identifier(name) => {
64
98
  if let Some(original_val) = module.variable_table.get(name) {
@@ -69,8 +103,18 @@ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore)
69
103
  return resolve_value(&export_val, module, global_store);
70
104
  }
71
105
 
72
- eprintln!("⚠️ Unresolved identifier '{}'", name);
73
- Value::Null
106
+ // Leave unresolved identifiers as-is; they might be runtime-bound (e.g., foreach vars)
107
+ Value::Identifier(name.clone())
108
+ }
109
+
110
+ Value::String(s) => Value::String(s.clone()),
111
+
112
+ Value::Beat(beat_str) => {
113
+ logger.log_message(
114
+ LogLevel::Warning,
115
+ &format!("[warn] '{:?}': unresolved beat '{}'", module.path, beat_str),
116
+ );
117
+ Value::Beat(beat_str.clone())
74
118
  }
75
119
 
76
120
  Value::Map(map) => {
@@ -94,7 +138,7 @@ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore)
94
138
  }
95
139
 
96
140
  fn find_export_value(name: &str, global_store: &GlobalStore) -> Option<Value> {
97
- for (_path, module) in &global_store.modules {
141
+ for module in global_store.modules.values() {
98
142
  if let Some(val) = module.export_table.get_export(name) {
99
143
  return Some(val.clone());
100
144
  }
@@ -102,7 +146,8 @@ fn find_export_value(name: &str, global_store: &GlobalStore) -> Option<Value> {
102
146
  None
103
147
  }
104
148
 
105
- pub fn resolve_imports(module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
149
+ pub fn resolve_imports(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
150
+ let logger = Logger::new();
106
151
  for (module_path, module) in global_store.clone().modules.iter_mut() {
107
152
  for (name, source_path) in &module.import_table.imports {
108
153
  match source_path {
@@ -111,20 +156,24 @@ pub fn resolve_imports(module_loader: &ModuleLoader, global_store: &mut GlobalSt
111
156
  if let Some(value) = source_module.export_table.get_export(name) {
112
157
  module.variable_table.set(name.clone(), value.clone());
113
158
  } else {
114
- println!(
115
- "[warn] '{module_path}': '{name}' not found in exports of '{source_path}'"
116
- );
159
+ logger.log_message(LogLevel::Warning, &format!("[warn] '{module_path}': '{name}' not found in exports of '{source_path}'"));
117
160
  }
118
161
  } else {
119
- println!(
120
- "[warn] '{module_path}': cannot find source module '{source_path}'"
162
+ logger.log_message(
163
+ LogLevel::Warning,
164
+ &format!(
165
+ "[warn] '{module_path}': cannot find source module '{source_path}'"
166
+ ),
121
167
  );
122
168
  }
123
169
  }
124
170
  _ => {
125
- println!(
126
- "[warn] '{module_path}': expected string for import source, found {:?}",
127
- source_path
171
+ logger.log_message(
172
+ LogLevel::Warning,
173
+ &format!(
174
+ "[warn] '{module_path}': expected string for import source, found {:?}",
175
+ source_path
176
+ ),
128
177
  );
129
178
  }
130
179
  }
@@ -133,7 +182,7 @@ pub fn resolve_imports(module_loader: &ModuleLoader, global_store: &mut GlobalSt
133
182
  }
134
183
 
135
184
  pub fn resolve_and_flatten_all_modules(
136
- global_store: &mut GlobalStore
185
+ global_store: &mut GlobalStore,
137
186
  ) -> HashMap<String, Vec<Statement>> {
138
187
  let logger = Logger::new();
139
188
  let snapshot = global_store.clone();
@@ -149,21 +198,21 @@ pub fn resolve_and_flatten_all_modules(
149
198
  } else {
150
199
  logger.log_error_with_stacktrace(
151
200
  &format!("'{name}' not found in exports of '{source_path_str}'"),
152
- module_path
201
+ module_path,
153
202
  );
154
203
  }
155
204
  }
156
205
  None => {
157
206
  logger.log_error_with_stacktrace(
158
207
  &format!("Cannot find source module '{source_path_str}'"),
159
- module_path
208
+ module_path,
160
209
  );
161
210
  }
162
211
  }
163
212
  } else {
164
213
  logger.log_error_with_stacktrace(
165
214
  &format!("Expected string for import source, found {:?}", source_path),
166
- module_path
215
+ module_path,
167
216
  );
168
217
  }
169
218
  }
@@ -175,17 +224,27 @@ pub fn resolve_and_flatten_all_modules(
175
224
  let mut resolved = Vec::new();
176
225
 
177
226
  for stmt in &module.statements {
178
- let mut stmt = stmt.clone();
227
+ let stmt = stmt.clone();
179
228
 
180
229
  match &stmt.kind {
181
- StatementKind::Trigger { entity, duration } => {
230
+ StatementKind::Let { name } => {
231
+ let resolved_stmt = resolve_let(&stmt, name, &module, &path, global_store);
232
+ resolved.push(resolved_stmt);
233
+ }
234
+
235
+ StatementKind::Trigger {
236
+ entity,
237
+ duration,
238
+ effects,
239
+ } => {
182
240
  let resolved_stmt = resolve_trigger(
183
241
  &stmt,
184
242
  entity.as_str(),
185
243
  &mut duration.clone(),
244
+ effects.clone(),
186
245
  &module,
187
246
  &path,
188
- global_store
247
+ global_store,
189
248
  );
190
249
  resolved.push(resolved_stmt);
191
250
  }
@@ -195,7 +254,7 @@ pub fn resolve_and_flatten_all_modules(
195
254
  resolved.push(resolved_stmt);
196
255
  }
197
256
 
198
- StatementKind::Bank => {
257
+ StatementKind::Bank { .. } => {
199
258
  let resolved_stmt = resolve_bank(&stmt, &module, &path, global_store);
200
259
  resolved.push(resolved_stmt);
201
260
  }
@@ -209,11 +268,49 @@ pub fn resolve_and_flatten_all_modules(
209
268
  resolved.push(stmt.clone());
210
269
  }
211
270
 
271
+ StatementKind::Call { name, args } => {
272
+ let resolved_stmt = resolve_call(
273
+ &stmt,
274
+ name.clone(),
275
+ args.clone(),
276
+ &module,
277
+ &path,
278
+ global_store,
279
+ );
280
+ resolved.push(resolved_stmt);
281
+ }
282
+
283
+ StatementKind::Spawn { name, args } => {
284
+ let resolved_stmt = resolve_spawn(
285
+ &stmt,
286
+ name.clone(),
287
+ args.clone(),
288
+ &module,
289
+ &path,
290
+ global_store,
291
+ );
292
+ resolved.push(resolved_stmt);
293
+ }
294
+
212
295
  StatementKind::Group => {
213
296
  let resolved_stmt = resolve_group(&stmt, &module, &path, global_store);
214
297
  resolved.push(resolved_stmt);
215
298
  }
216
299
 
300
+ StatementKind::Pattern { .. } => {
301
+ let resolved_stmt = resolve_pattern(&stmt, &module, &path, global_store);
302
+ resolved.push(resolved_stmt);
303
+ }
304
+
305
+ StatementKind::Function {
306
+ name: _,
307
+ parameters: _,
308
+ body: _,
309
+ } => {
310
+ let resolved_function = resolve_function(&stmt, &module, &path, global_store);
311
+ resolved.push(resolved_function);
312
+ }
313
+
217
314
  _ => {
218
315
  resolved.push(stmt);
219
316
  }
@@ -0,0 +1,69 @@
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{module::Module, resolver::driver::resolve_statement},
4
+ store::global::GlobalStore,
5
+ };
6
+ use devalang_types::{FunctionDef, Value};
7
+
8
+ pub fn resolve_function(
9
+ stmt: &Statement,
10
+ module: &Module,
11
+ path: &str,
12
+ global_store: &mut GlobalStore,
13
+ ) -> Statement {
14
+ if let StatementKind::Function {
15
+ name,
16
+ parameters,
17
+ body,
18
+ } = &stmt.kind
19
+ {
20
+ let resolved_body = resolve_block_statements(body, module, path, global_store);
21
+
22
+ global_store.functions.add_function(FunctionDef {
23
+ name: name.clone(),
24
+ parameters: parameters.clone(),
25
+ body: resolved_body.clone(),
26
+ });
27
+
28
+ if let Some(current_mod) = global_store.modules.get_mut(path) {
29
+ current_mod.function_table.add_function(FunctionDef {
30
+ name: name.clone(),
31
+ parameters: parameters.clone(),
32
+ body: resolved_body.clone(),
33
+ });
34
+ } else {
35
+ eprintln!("[resolve_statement] ❌ Module path not found: {path}");
36
+ }
37
+
38
+ Statement {
39
+ kind: StatementKind::Function {
40
+ name: name.clone(),
41
+ parameters: parameters.clone(),
42
+ body: resolved_body,
43
+ },
44
+ value: Value::Null,
45
+ ..stmt.clone()
46
+ }
47
+ } else {
48
+ Statement {
49
+ kind: StatementKind::Error {
50
+ message: "Expected a function statement".to_string(),
51
+ },
52
+ value: Value::Null,
53
+ ..stmt.clone()
54
+ }
55
+ }
56
+ }
57
+
58
+ fn resolve_block_statements(
59
+ body: &[Statement],
60
+ module: &Module,
61
+ path: &str,
62
+ global_store: &mut GlobalStore,
63
+ ) -> Vec<Statement> {
64
+ body.iter()
65
+ .map(|stmt| resolve_statement(stmt, module, path, global_store))
66
+ .collect()
67
+ }
68
+
69
+ // (removed unused helper type_error)
@@ -1,61 +1,122 @@
1
- use std::collections::HashMap;
2
-
3
- use crate::{
4
- core::{
5
- parser::statement::{ Statement, StatementKind },
6
- preprocessor::{ module::Module, resolver::driver::resolve_statement },
7
- shared::value::Value,
8
- store::{ global::GlobalStore, variable::VariableTable },
9
- },
10
- utils::logger::{ LogLevel, Logger },
11
- };
12
-
13
- pub fn resolve_group(
14
- stmt: &Statement,
15
- module: &Module,
16
- path: &str,
17
- global_store: &mut GlobalStore
18
- ) -> Statement {
19
- let logger = Logger::new();
20
-
21
- let Value::Map(group_map) = &stmt.value else {
22
- return type_error(&logger, module, stmt, "Expected a map in group statement".to_string());
23
- };
24
-
25
- let mut resolved_map = group_map.clone();
26
-
27
- if let Some(Value::Block(body)) = group_map.get("body") {
28
- let resolved_body = resolve_block_statements(body, module, path, global_store);
29
- resolved_map.insert("body".to_string(), Value::Block(resolved_body));
30
- } else {
31
- logger.log_message(LogLevel::Warning, "group without a body");
32
- }
33
-
34
- Statement {
35
- kind: StatementKind::Group,
36
- value: Value::Map(resolved_map),
37
- ..stmt.clone()
38
- }
39
- }
40
-
41
- fn resolve_block_statements(
42
- body: &[Statement],
43
- module: &Module,
44
- path: &str,
45
- global_store: &mut GlobalStore
46
- ) -> Vec<Statement> {
47
- body.iter()
48
- .map(|stmt| resolve_statement(stmt, module, path, global_store))
49
- .collect()
50
- }
51
-
52
- fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
53
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
54
- logger.log_error_with_stacktrace(&message, &stacktrace);
55
-
56
- Statement {
57
- kind: StatementKind::Error { message },
58
- value: Value::Null,
59
- ..stmt.clone()
60
- }
61
- }
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{module::Module, resolver::driver::resolve_statement},
4
+ store::global::GlobalStore,
5
+ };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
8
+
9
+ pub fn resolve_group(
10
+ stmt: &Statement,
11
+ module: &Module,
12
+ path: &str,
13
+ global_store: &mut GlobalStore,
14
+ ) -> Statement {
15
+ let logger = Logger::new();
16
+
17
+ // Extract identifier from several allowed shapes (map.identifier, bare string, number -> to_string)
18
+ let identifier = match extract_group_identifier(stmt, &logger, module) {
19
+ Ok(id) => id,
20
+ Err(err_stmt) => return err_stmt,
21
+ };
22
+
23
+ // group_map: if the value is a map we clone it, otherwise create an empty map to hold body
24
+ let group_map = match &stmt.value {
25
+ Value::Map(m) => m.clone(),
26
+ _ => std::collections::HashMap::new(),
27
+ };
28
+
29
+ // Ensure the identifier does not already exist
30
+ if global_store.variables.variables.contains_key(&identifier) {
31
+ return type_error(
32
+ &logger,
33
+ module,
34
+ stmt,
35
+ format!("Group identifier '{}' already exists", identifier),
36
+ );
37
+ }
38
+
39
+ // Resolve statements in the body
40
+ let mut resolved_map = group_map.clone();
41
+ if let Some(Value::Block(body)) = group_map.get("body") {
42
+ let resolved_body = resolve_block_statements(body, module, path, global_store);
43
+ resolved_map.insert("body".to_string(), Value::Block(resolved_body));
44
+ } else {
45
+ logger.log_message(LogLevel::Warning, "Group without a body");
46
+ }
47
+
48
+ // Build a complete Statement for the group
49
+ let resolved_group_stmt = Statement {
50
+ kind: StatementKind::Group,
51
+ value: Value::Map(resolved_map.clone()),
52
+ ..stmt.clone()
53
+ };
54
+
55
+ // Store the Statement directly in the global variable_table
56
+ global_store.variables.variables.insert(
57
+ identifier.clone(),
58
+ Value::Statement(Box::new(resolved_group_stmt.clone())),
59
+ );
60
+
61
+ resolved_group_stmt
62
+ }
63
+
64
+ fn resolve_block_statements(
65
+ body: &[Statement],
66
+ module: &Module,
67
+ path: &str,
68
+ global_store: &mut GlobalStore,
69
+ ) -> Vec<Statement> {
70
+ body.iter()
71
+ .map(|stmt| resolve_statement(stmt, module, path, global_store))
72
+ .collect()
73
+ }
74
+
75
+ fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
76
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
77
+ logger.log_error_with_stacktrace(&message, &stacktrace);
78
+
79
+ Statement {
80
+ kind: StatementKind::Error { message },
81
+ value: Value::Null,
82
+ ..stmt.clone()
83
+ }
84
+ }
85
+
86
+ // Helper to extract a group identifier from multiple Value forms
87
+ fn extract_group_identifier(
88
+ stmt: &Statement,
89
+ logger: &Logger,
90
+ module: &Module,
91
+ ) -> Result<String, Statement> {
92
+ match &stmt.value {
93
+ Value::Map(map) => match map.get("identifier") {
94
+ Some(Value::String(s)) => Ok(s.clone()),
95
+ Some(Value::Identifier(s)) => Ok(s.clone()),
96
+ Some(Value::Number(n)) => Ok(n.to_string()),
97
+ Some(other) => Err(type_error(
98
+ logger,
99
+ module,
100
+ stmt,
101
+ format!("Unsupported type for 'identifier': {:?}", other),
102
+ )),
103
+ None => Err(type_error(
104
+ logger,
105
+ module,
106
+ stmt,
107
+ "Group statement must have an 'identifier' field".to_string(),
108
+ )),
109
+ },
110
+ Value::String(s) => Ok(s.clone()),
111
+ Value::Identifier(s) => Ok(s.clone()),
112
+ other => Err(type_error(
113
+ logger,
114
+ module,
115
+ stmt,
116
+ format!(
117
+ "Expected a map or string for group statement, found {:?}",
118
+ other
119
+ ),
120
+ )),
121
+ }
122
+ }
@@ -1,25 +1,26 @@
1
- use crate::
2
- core::{
3
- parser::statement:: Statement ,
4
- preprocessor::{
5
- module::Module,
6
- resolver:: value::resolve_value ,
7
- },
8
- store:: global::GlobalStore ,
9
- }
10
- ;
1
+ use crate::core::{
2
+ parser::statement::Statement,
3
+ preprocessor::{module::Module, resolver::value::resolve_value},
4
+ store::global::GlobalStore,
5
+ };
11
6
 
12
7
  pub fn resolve_let(
13
8
  stmt: &Statement,
14
9
  name: &str,
15
10
  module: &Module,
16
11
  path: &str,
17
- global_store: &mut GlobalStore
12
+ global_store: &mut GlobalStore,
18
13
  ) -> Statement {
19
14
  let resolved_value = resolve_value(&stmt.value, module, global_store);
20
15
 
16
+ global_store
17
+ .variables
18
+ .set(name.to_string(), resolved_value.clone());
19
+
21
20
  if let Some(current_mod) = global_store.modules.get_mut(path) {
22
- current_mod.variable_table.set(name.to_string(), resolved_value.clone());
21
+ current_mod
22
+ .variable_table
23
+ .set(name.to_string(), resolved_value.clone());
23
24
  } else {
24
25
  eprintln!("[resolve_statement] ❌ Module path not found: {path}");
25
26
  }