@devaloop/devalang 0.0.1-alpha.16-hotfix.3 → 0.0.1-alpha.18
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.
- package/.cargo/config.toml +2 -0
- package/.devalang +10 -10
- package/.github/workflows/ci.yml +0 -1
- package/Cargo.toml +18 -2
- package/README.md +82 -34
- package/docs/CHANGELOG.md +91 -0
- package/docs/ROADMAP.md +7 -4
- package/docs/TODO.md +1 -1
- package/examples/index.deva +55 -35
- package/examples/pattern.deva +5 -5
- package/out-tsc/bin/index.d.ts +2 -0
- package/out-tsc/core/functions/index.d.ts +37 -0
- package/out-tsc/core/functions/index.js +76 -0
- package/out-tsc/core/index.d.ts +6 -0
- package/out-tsc/core/index.js +22 -0
- package/out-tsc/core/types/index.d.ts +4 -0
- package/out-tsc/core/types/index.js +20 -0
- package/out-tsc/core/types/plugin.d.ts +18 -0
- package/out-tsc/core/types/plugin.js +2 -0
- package/out-tsc/core/types/result.d.ts +27 -0
- package/out-tsc/core/types/result.js +2 -0
- package/out-tsc/core/types/statement.d.ts +106 -0
- package/out-tsc/core/types/statement.js +2 -0
- package/out-tsc/core/types/value.d.ts +43 -0
- package/out-tsc/core/types/value.js +2 -0
- package/out-tsc/index.d.ts +7 -0
- package/out-tsc/index.js +41 -2
- package/out-tsc/pkg/devalang_core.d.ts +7 -0
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
- package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
- package/out-tsc/scripts/copy-wasm-dts.js +73 -0
- package/out-tsc/scripts/postinstall.d.ts +1 -0
- package/out-tsc/scripts/postinstall.js +33 -23
- package/out-tsc/scripts/version/bump.d.ts +1 -0
- package/out-tsc/scripts/version/fetch.d.ts +1 -0
- package/out-tsc/scripts/version/index.d.ts +1 -0
- package/out-tsc/scripts/version/sync.d.ts +1 -0
- package/package.json +16 -4
- package/project-version.json +3 -3
- package/rust/cli/bank/api.rs +122 -0
- package/rust/cli/bank/commands.rs +275 -0
- package/rust/cli/bank/mod.rs +29 -0
- package/rust/cli/build/commands.rs +107 -0
- package/rust/cli/build/mod.rs +2 -0
- package/rust/cli/build/process.rs +146 -0
- package/rust/cli/{check.rs → check/mod.rs} +18 -31
- package/rust/cli/discover/commands.rs +253 -0
- package/rust/cli/discover/config.rs +111 -0
- package/rust/cli/discover/fs.rs +19 -0
- package/rust/cli/discover/install.rs +103 -0
- package/rust/cli/discover/metadata.rs +48 -0
- package/rust/cli/discover/mod.rs +5 -0
- package/rust/cli/{init.rs → init/commands.rs} +88 -87
- package/rust/cli/init/mod.rs +1 -0
- package/rust/cli/install/addon.rs +126 -0
- package/rust/cli/install/bank.rs +53 -0
- package/rust/cli/{install.rs → install/commands.rs} +9 -9
- package/rust/{installer → cli/install}/mod.rs +2 -3
- package/rust/cli/install/plugin.rs +61 -0
- package/rust/cli/{login.rs → login/commands.rs} +8 -11
- package/rust/cli/login/mod.rs +1 -0
- package/rust/cli/mod.rs +2 -2
- package/rust/cli/{driver.rs → parser.rs} +7 -2
- package/rust/cli/play/commands.rs +324 -0
- package/rust/cli/play/io.rs +17 -0
- package/rust/cli/play/mod.rs +5 -0
- package/rust/cli/play/process.rs +150 -0
- package/rust/cli/play/realtime.rs +91 -0
- package/rust/cli/play/utils.rs +23 -0
- package/rust/cli/{telemetry.rs → telemetry/commands.rs} +4 -4
- package/rust/cli/telemetry/event_creator.rs +80 -0
- package/rust/cli/telemetry/mod.rs +3 -0
- package/rust/cli/telemetry/send.rs +51 -0
- package/rust/cli/{template.rs → template/commands.rs} +1 -1
- package/rust/cli/template/mod.rs +1 -0
- package/rust/cli/{update.rs → update/commands.rs} +6 -6
- package/rust/cli/update/mod.rs +1 -0
- package/rust/config/driver.rs +57 -72
- package/rust/config/mod.rs +1 -2
- package/rust/config/ops.rs +26 -0
- package/rust/config/settings.rs +40 -42
- package/rust/core/audio/engine/helpers.rs +158 -0
- package/rust/core/audio/engine/mod.rs +7 -0
- package/rust/core/audio/engine/sample.rs +359 -0
- package/rust/core/audio/engine/synth.rs +325 -0
- package/rust/core/audio/evaluator.rs +68 -27
- package/rust/core/audio/interpreter/arrow_call.rs +113 -33
- package/rust/core/audio/interpreter/call.rs +232 -56
- package/rust/core/audio/interpreter/condition.rs +3 -2
- package/rust/core/audio/interpreter/driver.rs +206 -151
- package/rust/core/audio/interpreter/let_.rs +1 -1
- package/rust/core/audio/interpreter/load.rs +2 -1
- package/rust/core/audio/interpreter/loop_.rs +7 -6
- package/rust/core/audio/interpreter/sleep.rs +2 -1
- package/rust/core/audio/interpreter/spawn.rs +186 -54
- package/rust/core/audio/interpreter/tempo.rs +31 -10
- package/rust/core/audio/interpreter/trigger.rs +2 -2
- package/rust/core/audio/loader/trigger.rs +4 -7
- package/rust/core/audio/player.rs +6 -0
- package/rust/core/audio/renderer.rs +5 -7
- package/rust/core/audio/special/env.rs +3 -1
- package/rust/core/audio/special/math.rs +26 -6
- package/rust/core/audio/special/modulator.rs +2 -2
- package/rust/core/builder/mod.rs +9 -3
- package/rust/core/debugger/lexer.rs +1 -1
- package/rust/core/debugger/mod.rs +6 -0
- package/rust/core/debugger/module.rs +4 -4
- package/rust/core/debugger/preprocessor.rs +1 -1
- package/rust/core/debugger/store.rs +2 -2
- package/rust/core/error/mod.rs +189 -0
- package/rust/core/lexer/driver.rs +61 -0
- package/rust/core/lexer/handler/arrow.rs +1 -1
- package/rust/core/lexer/handler/at.rs +1 -1
- package/rust/core/lexer/handler/brace.rs +2 -2
- package/rust/core/lexer/handler/colon.rs +1 -1
- package/rust/core/lexer/handler/comment.rs +1 -1
- package/rust/core/lexer/handler/dot.rs +1 -1
- package/rust/core/lexer/handler/driver.rs +1 -1
- package/rust/core/lexer/handler/identifier.rs +4 -3
- package/rust/core/lexer/handler/mod.rs +1 -2
- package/rust/core/lexer/handler/number.rs +1 -1
- package/rust/core/lexer/handler/operator.rs +1 -1
- package/rust/core/lexer/handler/parenthesis.rs +2 -2
- package/rust/core/lexer/handler/slash.rs +1 -1
- package/rust/core/lexer/handler/string.rs +1 -1
- package/rust/core/lexer/mod.rs +1 -52
- package/rust/core/lexer/token.rs +91 -97
- package/rust/core/mod.rs +0 -1
- package/rust/core/parser/driver.rs +78 -22
- package/rust/core/parser/handler/arrow_call.rs +28 -8
- package/rust/core/parser/handler/at.rs +55 -21
- package/rust/core/parser/handler/bank.rs +14 -4
- package/rust/core/parser/handler/condition.rs +6 -3
- package/rust/core/parser/handler/dot.rs +5 -3
- package/rust/core/parser/handler/identifier/automate.rs +13 -16
- package/rust/core/parser/handler/identifier/call.rs +4 -4
- package/rust/core/parser/handler/identifier/emit.rs +9 -5
- package/rust/core/parser/handler/identifier/function.rs +20 -7
- package/rust/core/parser/handler/identifier/group.rs +11 -7
- package/rust/core/parser/handler/identifier/let_.rs +24 -9
- package/rust/core/parser/handler/identifier/mod.rs +6 -5
- package/rust/core/parser/handler/identifier/on.rs +16 -7
- package/rust/core/parser/handler/identifier/print.rs +6 -9
- package/rust/core/parser/handler/identifier/sleep.rs +12 -5
- package/rust/core/parser/handler/identifier/spawn.rs +4 -4
- package/rust/core/parser/handler/identifier/synth.rs +79 -9
- package/rust/core/parser/handler/loop_.rs +38 -13
- package/rust/core/parser/handler/mod.rs +1 -0
- package/rust/core/parser/handler/pattern.rs +74 -0
- package/rust/core/parser/handler/tempo.rs +9 -5
- package/rust/core/parser/mod.rs +0 -1
- package/rust/core/parser/statement.rs +6 -137
- package/rust/core/plugin/loader.rs +41 -27
- package/rust/core/plugin/runner.rs +68 -17
- package/rust/core/preprocessor/loader.rs +181 -99
- package/rust/core/preprocessor/processor.rs +9 -9
- package/rust/core/preprocessor/resolver/bank.rs +6 -8
- package/rust/core/preprocessor/resolver/call.rs +47 -23
- package/rust/core/preprocessor/resolver/condition.rs +6 -8
- package/rust/core/preprocessor/resolver/driver.rs +28 -28
- package/rust/core/preprocessor/resolver/function.rs +6 -6
- package/rust/core/preprocessor/resolver/group.rs +6 -8
- package/rust/core/preprocessor/resolver/loop_.rs +8 -10
- package/rust/core/preprocessor/resolver/mod.rs +1 -0
- package/rust/core/preprocessor/resolver/pattern.rs +75 -0
- package/rust/core/preprocessor/resolver/spawn.rs +45 -22
- package/rust/core/preprocessor/resolver/synth.rs +6 -8
- package/rust/core/preprocessor/resolver/tempo.rs +6 -8
- package/rust/core/preprocessor/resolver/trigger.rs +22 -19
- package/rust/core/preprocessor/resolver/value.rs +99 -4
- package/rust/core/store/export.rs +28 -28
- package/rust/core/store/function.rs +6 -0
- package/rust/core/store/global.rs +7 -1
- package/rust/core/store/import.rs +28 -28
- package/rust/core/store/variable.rs +16 -2
- package/rust/core/utils/mod.rs +0 -1
- package/rust/lib.rs +102 -9
- package/rust/main.rs +159 -45
- package/rust/types/Cargo.toml +11 -0
- package/rust/types/src/addons.rs +55 -0
- package/rust/types/src/ast.rs +202 -0
- package/rust/types/src/config.rs +74 -0
- package/rust/types/src/lib.rs +12 -0
- package/rust/types/src/telemetry.rs +85 -0
- package/rust/utils/Cargo.toml +26 -0
- package/rust/utils/{error.rs → src/error.rs} +186 -200
- package/rust/utils/src/file.rs +94 -0
- package/rust/utils/src/first_usage.rs +97 -0
- package/rust/utils/{mod.rs → src/lib.rs} +1 -1
- package/rust/utils/{logger.rs → src/logger.rs} +17 -12
- package/rust/utils/src/path.rs +88 -0
- package/rust/utils/src/signature.rs +41 -0
- package/rust/utils/{spinner.rs → src/spinner.rs} +3 -5
- package/rust/utils/src/version.rs +27 -0
- package/rust/utils/{watcher.rs → src/watcher.rs} +13 -1
- package/rust/web/cdn.rs +34 -0
- package/templates/minimal/README.md +98 -54
- package/templates/welcome/README.md +98 -54
- package/templates/welcome/src/index.deva +56 -8
- package/templates/welcome/src/variables.deva +2 -4
- package/tests/rust/TODO.md +0 -0
- package/tests/typescript/index.spec.ts +136 -0
- package/tests/typescript/playhead.spec.ts +36 -0
- package/tests/typescript/render_e2e.spec.ts +77 -0
- package/tsconfig.json +1 -1
- package/typescript/core/functions/index.ts +83 -0
- package/typescript/core/index.ts +6 -0
- package/typescript/core/types/index.ts +4 -0
- package/typescript/core/types/plugin.ts +19 -0
- package/typescript/core/types/result.ts +29 -0
- package/typescript/core/types/statement.ts +47 -0
- package/typescript/core/types/value.ts +29 -0
- package/typescript/index.ts +7 -2
- package/typescript/pkg/devalang_core.d.ts +4 -0
- package/typescript/scripts/copy-wasm-dts.ts +41 -0
- package/rust/cli/bank.rs +0 -462
- package/rust/cli/build.rs +0 -252
- package/rust/cli/play.rs +0 -1123
- package/rust/common/cdn.rs +0 -5
- package/rust/config/loader.rs +0 -165
- package/rust/config/stats.rs +0 -257
- package/rust/core/audio/engine.rs +0 -696
- package/rust/core/shared/bank.rs +0 -21
- package/rust/core/shared/duration.rs +0 -9
- package/rust/core/shared/mod.rs +0 -3
- package/rust/core/shared/value.rs +0 -35
- package/rust/core/utils/validation.rs +0 -35
- package/rust/installer/addon.rs +0 -84
- package/rust/installer/bank.rs +0 -62
- package/rust/installer/plugin.rs +0 -54
- package/rust/installer/utils.rs +0 -56
- package/rust/utils/file.rs +0 -38
- package/rust/utils/first_usage.rs +0 -83
- package/rust/utils/signature.rs +0 -19
- package/rust/utils/telemetry.rs +0 -292
- package/rust/utils/version.rs +0 -15
- /package/rust/{common → web}/api.rs +0 -0
- /package/rust/{common → web}/mod.rs +0 -0
- /package/rust/{common → web}/sso.rs +0 -0
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
use crate::{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
shared::value::Value,
|
|
6
|
-
store::global::GlobalStore,
|
|
7
|
-
},
|
|
8
|
-
utils::logger::{LogLevel, Logger},
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::module::Module,
|
|
4
|
+
store::global::GlobalStore,
|
|
9
5
|
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::{LogLevel, Logger};
|
|
10
8
|
|
|
11
9
|
pub fn resolve_call(
|
|
12
10
|
stmt: &Statement,
|
|
@@ -44,25 +42,51 @@ pub fn resolve_call(
|
|
|
44
42
|
}
|
|
45
43
|
|
|
46
44
|
// Otherwise, check if it's a variable (e.g. group)
|
|
47
|
-
if let Some(
|
|
48
|
-
if let
|
|
49
|
-
if let
|
|
50
|
-
if let Value::
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
resolved_map.insert("body".to_string(), Value::Block(body.clone()));
|
|
45
|
+
if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
|
|
46
|
+
if let StatementKind::Group = stmt_box.kind {
|
|
47
|
+
if let Value::Map(map) = &stmt_box.value {
|
|
48
|
+
if let Some(Value::Block(body)) = map.get("body") {
|
|
49
|
+
let mut resolved_map = std::collections::HashMap::new();
|
|
50
|
+
resolved_map
|
|
51
|
+
.insert("identifier".to_string(), Value::String(name.clone()));
|
|
52
|
+
resolved_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
53
|
+
resolved_map.insert("body".to_string(), Value::Block(body.clone()));
|
|
57
54
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
55
|
+
return Statement {
|
|
56
|
+
kind: StatementKind::Call { name, args },
|
|
57
|
+
value: Value::Map(resolved_map),
|
|
58
|
+
..stmt.clone()
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Pattern case
|
|
64
|
+
if let StatementKind::Pattern { .. } = stmt_box.kind {
|
|
65
|
+
// pattern value may be a string or a map stored on the statement
|
|
66
|
+
let mut resolved_map = std::collections::HashMap::new();
|
|
67
|
+
resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
|
|
68
|
+
// pattern value
|
|
69
|
+
match &stmt_box.value {
|
|
70
|
+
Value::String(s) => {
|
|
71
|
+
resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
|
|
72
|
+
}
|
|
73
|
+
Value::Map(m) => {
|
|
74
|
+
if let Some(val) = m.get("pattern") {
|
|
75
|
+
resolved_map.insert("pattern".to_string(), val.clone());
|
|
76
|
+
}
|
|
77
|
+
if let Some(val) = m.get("target") {
|
|
78
|
+
resolved_map.insert("target".to_string(), val.clone());
|
|
63
79
|
}
|
|
64
80
|
}
|
|
81
|
+
_ => {}
|
|
65
82
|
}
|
|
83
|
+
resolved_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
84
|
+
|
|
85
|
+
return Statement {
|
|
86
|
+
kind: StatementKind::Call { name, args },
|
|
87
|
+
value: Value::Map(resolved_map),
|
|
88
|
+
..stmt.clone()
|
|
89
|
+
};
|
|
66
90
|
}
|
|
67
91
|
}
|
|
68
92
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
use crate::{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
shared::value::Value,
|
|
6
|
-
store::global::GlobalStore,
|
|
7
|
-
},
|
|
8
|
-
utils::logger::Logger,
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::{module::Module, resolver::driver::resolve_statement},
|
|
4
|
+
store::global::GlobalStore,
|
|
9
5
|
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::Logger;
|
|
10
8
|
|
|
11
9
|
pub fn resolve_condition(
|
|
12
10
|
stmt: &Statement,
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
use crate::{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
trigger::resolve_trigger,
|
|
12
|
-
},
|
|
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, pattern::resolve_pattern, let_::resolve_let,
|
|
9
|
+
loop_::resolve_loop, spawn::resolve_spawn, tempo::resolve_tempo,
|
|
10
|
+
trigger::resolve_trigger,
|
|
13
11
|
},
|
|
14
|
-
shared::value::Value,
|
|
15
|
-
store::global::GlobalStore,
|
|
16
12
|
},
|
|
17
|
-
|
|
13
|
+
store::global::GlobalStore,
|
|
18
14
|
};
|
|
15
|
+
use devalang_types::Value;
|
|
16
|
+
use devalang_utils::logger::Logger;
|
|
17
|
+
use devalang_utils::logger::LogLevel;
|
|
19
18
|
use std::collections::HashMap;
|
|
20
19
|
|
|
21
20
|
pub fn resolve_all_modules(module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
|
|
@@ -68,7 +67,8 @@ pub fn resolve_statement(
|
|
|
68
67
|
global_store,
|
|
69
68
|
),
|
|
70
69
|
StatementKind::If => resolve_condition(stmt, module, path, global_store),
|
|
71
|
-
|
|
70
|
+
StatementKind::Group => resolve_group(stmt, module, path, global_store),
|
|
71
|
+
StatementKind::Pattern { .. } => resolve_pattern(stmt, module, path, global_store),
|
|
72
72
|
StatementKind::Call { name, args } => {
|
|
73
73
|
resolve_call(stmt, name.clone(), args.clone(), module, path, global_store)
|
|
74
74
|
}
|
|
@@ -92,6 +92,7 @@ pub fn resolve_statement(
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
|
|
95
|
+
let logger = Logger::new();
|
|
95
96
|
match value {
|
|
96
97
|
Value::Identifier(name) => {
|
|
97
98
|
if let Some(original_val) = module.variable_table.get(name) {
|
|
@@ -109,7 +110,7 @@ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore)
|
|
|
109
110
|
Value::String(s) => Value::String(s.clone()),
|
|
110
111
|
|
|
111
112
|
Value::Beat(beat_str) => {
|
|
112
|
-
|
|
113
|
+
logger.log_message(LogLevel::Warning, &format!("[warn] '{:?}': unresolved beat '{}'", module.path, beat_str));
|
|
113
114
|
Value::Beat(beat_str.clone())
|
|
114
115
|
}
|
|
115
116
|
|
|
@@ -134,7 +135,7 @@ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore)
|
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
fn find_export_value(name: &str, global_store: &GlobalStore) -> Option<Value> {
|
|
137
|
-
for
|
|
138
|
+
for module in global_store.modules.values() {
|
|
138
139
|
if let Some(val) = module.export_table.get_export(name) {
|
|
139
140
|
return Some(val.clone());
|
|
140
141
|
}
|
|
@@ -143,6 +144,7 @@ fn find_export_value(name: &str, global_store: &GlobalStore) -> Option<Value> {
|
|
|
143
144
|
}
|
|
144
145
|
|
|
145
146
|
pub fn resolve_imports(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
|
|
147
|
+
let logger = Logger::new();
|
|
146
148
|
for (module_path, module) in global_store.clone().modules.iter_mut() {
|
|
147
149
|
for (name, source_path) in &module.import_table.imports {
|
|
148
150
|
match source_path {
|
|
@@ -151,21 +153,14 @@ pub fn resolve_imports(_module_loader: &ModuleLoader, global_store: &mut GlobalS
|
|
|
151
153
|
if let Some(value) = source_module.export_table.get_export(name) {
|
|
152
154
|
module.variable_table.set(name.clone(), value.clone());
|
|
153
155
|
} else {
|
|
154
|
-
|
|
155
|
-
"[warn] '{module_path}': '{name}' not found in exports of '{source_path}'"
|
|
156
|
-
);
|
|
156
|
+
logger.log_message(LogLevel::Warning, &format!("[warn] '{module_path}': '{name}' not found in exports of '{source_path}'"));
|
|
157
157
|
}
|
|
158
158
|
} else {
|
|
159
|
-
|
|
160
|
-
"[warn] '{module_path}': cannot find source module '{source_path}'"
|
|
161
|
-
);
|
|
159
|
+
logger.log_message(LogLevel::Warning, &format!("[warn] '{module_path}': cannot find source module '{source_path}'"));
|
|
162
160
|
}
|
|
163
161
|
}
|
|
164
162
|
_ => {
|
|
165
|
-
|
|
166
|
-
"[warn] '{module_path}': expected string for import source, found {:?}",
|
|
167
|
-
source_path
|
|
168
|
-
);
|
|
163
|
+
logger.log_message(LogLevel::Warning, &format!("[warn] '{module_path}': expected string for import source, found {:?}", source_path));
|
|
169
164
|
}
|
|
170
165
|
}
|
|
171
166
|
}
|
|
@@ -288,6 +283,11 @@ pub fn resolve_and_flatten_all_modules(
|
|
|
288
283
|
resolved.push(resolved_stmt);
|
|
289
284
|
}
|
|
290
285
|
|
|
286
|
+
StatementKind::Pattern { .. } => {
|
|
287
|
+
let resolved_stmt = resolve_pattern(&stmt, &module, &path, global_store);
|
|
288
|
+
resolved.push(resolved_stmt);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
291
|
StatementKind::Function {
|
|
292
292
|
name: _,
|
|
293
293
|
parameters: _,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
use crate::core::{
|
|
2
2
|
parser::statement::{Statement, StatementKind},
|
|
3
3
|
preprocessor::{module::Module, resolver::driver::resolve_statement},
|
|
4
|
-
shared::value::Value,
|
|
5
4
|
store::{function::FunctionDef, global::GlobalStore},
|
|
6
5
|
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
7
|
|
|
8
8
|
pub fn resolve_function(
|
|
9
9
|
stmt: &Statement,
|
|
@@ -17,7 +17,7 @@ pub fn resolve_function(
|
|
|
17
17
|
body,
|
|
18
18
|
} = &stmt.kind
|
|
19
19
|
{
|
|
20
|
-
let resolved_body = resolve_block_statements(body,
|
|
20
|
+
let resolved_body = resolve_block_statements(body, module, path, global_store);
|
|
21
21
|
|
|
22
22
|
global_store.functions.add_function(FunctionDef {
|
|
23
23
|
name: name.clone(),
|
|
@@ -35,7 +35,7 @@ pub fn resolve_function(
|
|
|
35
35
|
eprintln!("[resolve_statement] ❌ Module path not found: {path}");
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
Statement {
|
|
39
39
|
kind: StatementKind::Function {
|
|
40
40
|
name: name.clone(),
|
|
41
41
|
parameters: parameters.clone(),
|
|
@@ -43,15 +43,15 @@ pub fn resolve_function(
|
|
|
43
43
|
},
|
|
44
44
|
value: Value::Null,
|
|
45
45
|
..stmt.clone()
|
|
46
|
-
}
|
|
46
|
+
}
|
|
47
47
|
} else {
|
|
48
|
-
|
|
48
|
+
Statement {
|
|
49
49
|
kind: StatementKind::Error {
|
|
50
50
|
message: "Expected a function statement".to_string(),
|
|
51
51
|
},
|
|
52
52
|
value: Value::Null,
|
|
53
53
|
..stmt.clone()
|
|
54
|
-
}
|
|
54
|
+
}
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
use crate::{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
shared::value::Value,
|
|
6
|
-
store::global::GlobalStore,
|
|
7
|
-
},
|
|
8
|
-
utils::logger::{LogLevel, Logger},
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::{module::Module, resolver::driver::resolve_statement},
|
|
4
|
+
store::global::GlobalStore,
|
|
9
5
|
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::{LogLevel, Logger};
|
|
10
8
|
|
|
11
9
|
pub fn resolve_group(
|
|
12
10
|
stmt: &Statement,
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
use std::collections::HashMap;
|
|
2
2
|
|
|
3
|
-
use crate::{
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
resolver::{driver::resolve_statement, value::resolve_value},
|
|
9
|
-
},
|
|
10
|
-
shared::value::Value,
|
|
11
|
-
store::global::GlobalStore,
|
|
3
|
+
use crate::core::{
|
|
4
|
+
parser::statement::{Statement, StatementKind},
|
|
5
|
+
preprocessor::{
|
|
6
|
+
module::Module,
|
|
7
|
+
resolver::{driver::resolve_statement, value::resolve_value},
|
|
12
8
|
},
|
|
13
|
-
|
|
9
|
+
store::global::GlobalStore,
|
|
14
10
|
};
|
|
11
|
+
use devalang_types::Value;
|
|
12
|
+
use devalang_utils::logger::Logger;
|
|
15
13
|
|
|
16
14
|
pub fn resolve_loop(
|
|
17
15
|
stmt: &Statement,
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::{module::Module},
|
|
4
|
+
store::global::GlobalStore,
|
|
5
|
+
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::{LogLevel, Logger};
|
|
8
|
+
|
|
9
|
+
pub fn resolve_pattern(
|
|
10
|
+
stmt: &Statement,
|
|
11
|
+
module: &Module,
|
|
12
|
+
path: &str,
|
|
13
|
+
global_store: &mut GlobalStore,
|
|
14
|
+
) -> Statement {
|
|
15
|
+
let logger = Logger::new();
|
|
16
|
+
|
|
17
|
+
// Expecting pattern name stored on the Statement.kind; value may contain the string
|
|
18
|
+
if let StatementKind::Pattern { name, target } = &stmt.kind {
|
|
19
|
+
// Ensure name doesn't already exist
|
|
20
|
+
if global_store.variables.variables.contains_key(name) {
|
|
21
|
+
logger.log_error_with_stacktrace(&format!("Pattern identifier '{}' already exists", name), path);
|
|
22
|
+
return Statement {
|
|
23
|
+
kind: StatementKind::Error { message: format!("Pattern '{}' already exists", name) },
|
|
24
|
+
..stmt.clone()
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Resolve potential target and pattern string value
|
|
29
|
+
let resolved_value = resolve_value(&stmt.value, module, global_store);
|
|
30
|
+
|
|
31
|
+
// Build a map to store the pattern definition
|
|
32
|
+
let mut map = std::collections::HashMap::new();
|
|
33
|
+
map.insert("identifier".to_string(), Value::String(name.clone()));
|
|
34
|
+
if let Some(t) = target {
|
|
35
|
+
map.insert("target".to_string(), Value::String(t.clone()));
|
|
36
|
+
}
|
|
37
|
+
// Keep raw pattern in 'pattern' key
|
|
38
|
+
map.insert("pattern".to_string(), resolved_value.clone());
|
|
39
|
+
|
|
40
|
+
let resolved_stmt = Statement {
|
|
41
|
+
kind: StatementKind::Pattern {
|
|
42
|
+
name: name.clone(),
|
|
43
|
+
target: target.clone(),
|
|
44
|
+
},
|
|
45
|
+
value: resolved_value,
|
|
46
|
+
..stmt.clone()
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// Store into global variables as a Statement
|
|
50
|
+
global_store.variables.variables.insert(
|
|
51
|
+
name.clone(),
|
|
52
|
+
Value::Statement(Box::new(resolved_stmt.clone())),
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
return resolved_stmt;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
logger.log_message(LogLevel::Warning, "resolve_pattern called on non-pattern statement");
|
|
59
|
+
stmt.clone()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
|
|
63
|
+
// reuse driver::resolve_value logic; simple local resolution for pattern value
|
|
64
|
+
match value {
|
|
65
|
+
Value::String(s) => Value::String(s.clone()),
|
|
66
|
+
Value::Map(m) => {
|
|
67
|
+
let mut resolved = std::collections::HashMap::new();
|
|
68
|
+
for (k, v) in m {
|
|
69
|
+
resolved.insert(k.clone(), resolve_value(v, module, global_store));
|
|
70
|
+
}
|
|
71
|
+
Value::Map(resolved)
|
|
72
|
+
}
|
|
73
|
+
other => other.clone(),
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
use crate::{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
shared::value::Value,
|
|
6
|
-
store::global::GlobalStore,
|
|
7
|
-
},
|
|
8
|
-
utils::logger::{LogLevel, Logger},
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::module::Module,
|
|
4
|
+
store::global::GlobalStore,
|
|
9
5
|
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::{LogLevel, Logger};
|
|
10
8
|
|
|
11
9
|
pub fn resolve_spawn(
|
|
12
10
|
stmt: &Statement,
|
|
@@ -33,24 +31,49 @@ pub fn resolve_spawn(
|
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
// If it's a group stored in variables
|
|
36
|
-
if let Some(
|
|
37
|
-
if let
|
|
38
|
-
if let
|
|
39
|
-
if let Value::
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
resolved_map.insert("body".to_string(), Value::Block(body.clone()));
|
|
34
|
+
if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
|
|
35
|
+
if let StatementKind::Group = stmt_box.kind {
|
|
36
|
+
if let Value::Map(map) = &stmt_box.value {
|
|
37
|
+
if let Some(Value::Block(body)) = map.get("body") {
|
|
38
|
+
let mut resolved_map = std::collections::HashMap::new();
|
|
39
|
+
resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
|
|
40
|
+
resolved_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
41
|
+
resolved_map.insert("body".to_string(), Value::Block(body.clone()));
|
|
45
42
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
return Statement {
|
|
44
|
+
kind: StatementKind::Spawn { name, args },
|
|
45
|
+
value: Value::Map(resolved_map),
|
|
46
|
+
..stmt.clone()
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Pattern case (make spawn accept patterns stored as variables)
|
|
52
|
+
if let StatementKind::Pattern { .. } = stmt_box.kind {
|
|
53
|
+
let mut resolved_map = std::collections::HashMap::new();
|
|
54
|
+
resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
|
|
55
|
+
// pattern value may be a string or a map stored on the statement
|
|
56
|
+
match &stmt_box.value {
|
|
57
|
+
Value::String(s) => {
|
|
58
|
+
resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
|
|
59
|
+
}
|
|
60
|
+
Value::Map(m) => {
|
|
61
|
+
if let Some(val) = m.get("pattern") {
|
|
62
|
+
resolved_map.insert("pattern".to_string(), val.clone());
|
|
63
|
+
}
|
|
64
|
+
if let Some(val) = m.get("target") {
|
|
65
|
+
resolved_map.insert("target".to_string(), val.clone());
|
|
51
66
|
}
|
|
52
67
|
}
|
|
68
|
+
_ => {}
|
|
53
69
|
}
|
|
70
|
+
resolved_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
71
|
+
|
|
72
|
+
return Statement {
|
|
73
|
+
kind: StatementKind::Spawn { name, args },
|
|
74
|
+
value: Value::Map(resolved_map),
|
|
75
|
+
..stmt.clone()
|
|
76
|
+
};
|
|
54
77
|
}
|
|
55
78
|
}
|
|
56
79
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
use crate::{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
shared::value::Value,
|
|
6
|
-
store::global::GlobalStore,
|
|
7
|
-
},
|
|
8
|
-
utils::logger::{LogLevel, Logger},
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::{module::Module, resolver::driver::resolve_statement},
|
|
4
|
+
store::global::GlobalStore,
|
|
9
5
|
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::{LogLevel, Logger};
|
|
10
8
|
|
|
11
9
|
pub fn resolve_synth(
|
|
12
10
|
stmt: &Statement,
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
use crate::{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
shared::value::Value,
|
|
6
|
-
store::global::GlobalStore,
|
|
7
|
-
},
|
|
8
|
-
utils::logger::Logger,
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::module::Module,
|
|
4
|
+
store::global::GlobalStore,
|
|
9
5
|
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::Logger;
|
|
10
8
|
|
|
11
9
|
pub fn resolve_tempo(
|
|
12
10
|
stmt: &Statement,
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
use
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
parser::statement::{Statement, StatementKind},
|
|
6
|
-
preprocessor::module::Module,
|
|
7
|
-
shared::{duration::Duration, value::Value},
|
|
8
|
-
store::global::GlobalStore,
|
|
9
|
-
},
|
|
10
|
-
utils::logger::Logger,
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::module::Module,
|
|
4
|
+
store::global::GlobalStore,
|
|
11
5
|
};
|
|
6
|
+
use devalang_types::{Duration, Value};
|
|
7
|
+
use devalang_utils::logger::Logger;
|
|
8
|
+
use std::collections::HashMap;
|
|
12
9
|
|
|
13
10
|
pub fn resolve_trigger(
|
|
14
11
|
stmt: &Statement,
|
|
@@ -44,15 +41,21 @@ pub fn resolve_trigger(
|
|
|
44
41
|
// Params value resolution
|
|
45
42
|
let final_value = match &stmt.value {
|
|
46
43
|
Value::Identifier(ident) => {
|
|
47
|
-
|
|
44
|
+
logger.log_message(
|
|
45
|
+
devalang_utils::logger::LogLevel::Debug,
|
|
46
|
+
&format!("Resolving identifier: {}", ident),
|
|
47
|
+
);
|
|
48
48
|
|
|
49
|
-
resolve_identifier(ident, module, global_store)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
match resolve_identifier(ident, module, global_store) {
|
|
50
|
+
Some(v) => v,
|
|
51
|
+
None => {
|
|
52
|
+
logger.log_error_with_stacktrace(
|
|
53
|
+
&format!("'{path}': value identifier '{ident}' not found"),
|
|
54
|
+
&format!("{}:{}:{}", module.path, stmt.line, stmt.column),
|
|
55
|
+
);
|
|
56
|
+
Value::Null
|
|
57
|
+
}
|
|
58
|
+
}
|
|
56
59
|
}
|
|
57
60
|
Value::Map(map) => {
|
|
58
61
|
let mut resolved_map = HashMap::new();
|
|
@@ -88,7 +91,7 @@ fn resolve_identifier(ident: &str, module: &Module, global_store: &GlobalStore)
|
|
|
88
91
|
return Some(resolve_value(val, module, global_store));
|
|
89
92
|
}
|
|
90
93
|
|
|
91
|
-
for
|
|
94
|
+
for other_mod in global_store.modules.values() {
|
|
92
95
|
if let Some(val) = other_mod.variable_table.get(ident) {
|
|
93
96
|
return Some(resolve_value(val, other_mod, global_store));
|
|
94
97
|
}
|