@devaloop/devalang 0.0.1-beta.2 → 0.0.1-beta.3
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.toml +84 -81
- package/README.md +3 -2
- package/docs/CHANGELOG.md +41 -0
- package/docs/ROADMAP.md +3 -3
- package/examples/chain.deva +19 -0
- package/examples/plugin.deva +10 -10
- package/examples/routing.deva +23 -0
- package/out-tsc/bin/project-version.json +6 -0
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +8 -8
- package/out-tsc/scripts/version/copy-to-binary.d.ts +1 -0
- package/out-tsc/scripts/version/copy-to-binary.js +79 -0
- package/package.json +23 -10
- package/project-version.json +3 -3
- package/rust/bindings/Cargo.toml +9 -0
- package/rust/bindings/src/lib.rs +86 -0
- package/rust/cli/addon/commands.rs +35 -0
- package/rust/cli/addon/download.rs +234 -0
- package/rust/cli/addon/install.rs +33 -0
- package/rust/cli/addon/list.rs +224 -0
- package/rust/cli/addon/metadata.rs +124 -0
- package/rust/cli/addon/mod.rs +8 -0
- package/rust/cli/addon/remove.rs +271 -0
- package/rust/cli/addon/update.rs +305 -0
- package/rust/cli/{install/addon.rs → addon/utils.rs} +109 -118
- package/rust/cli/build/commands.rs +153 -153
- package/rust/cli/build/process.rs +165 -165
- package/rust/cli/check/mod.rs +208 -208
- package/rust/cli/discover/commands.rs +275 -253
- package/rust/cli/discover/config.rs +109 -111
- package/rust/cli/discover/fs.rs +19 -19
- package/rust/cli/discover/install.rs +214 -103
- package/rust/cli/discover/metadata.rs +48 -48
- package/rust/cli/discover/mod.rs +5 -5
- package/rust/cli/me/commands.rs +52 -0
- package/rust/cli/me/mod.rs +1 -0
- package/rust/cli/mod.rs +12 -12
- package/rust/cli/parser.rs +30 -69
- package/rust/cli/play/commands.rs +375 -375
- package/rust/cli/play/process.rs +159 -159
- package/rust/core/audio/engine/driver.rs +19 -2
- package/rust/core/audio/engine/export.rs +169 -169
- package/rust/core/audio/engine/mod.rs +56 -56
- package/rust/core/audio/engine/notes/dsp.rs +88 -85
- package/rust/core/audio/engine/notes/mod.rs +53 -44
- package/rust/core/audio/engine/notes/params.rs +294 -294
- package/rust/core/audio/engine/sample/insert.rs +148 -47
- package/rust/core/audio/engine/sample/mod.rs +40 -40
- package/rust/core/audio/engine/sample/padding.rs +170 -170
- package/rust/core/audio/evaluator/condition.rs +61 -61
- package/rust/core/audio/evaluator/numeric.rs +152 -152
- package/rust/core/audio/evaluator/rhs.rs +16 -16
- package/rust/core/audio/evaluator/string_expr.rs +94 -94
- package/rust/core/audio/interpreter/driver.rs +574 -574
- package/rust/core/audio/interpreter/mod.rs +2 -2
- package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +9 -5
- package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +398 -384
- package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +323 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +1 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +66 -11
- package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -3
- package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -192
- package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -24
- package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -116
- package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -97
- package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -100
- package/rust/core/audio/interpreter/statements/automate.rs +16 -16
- package/rust/core/audio/interpreter/statements/call.rs +31 -1
- package/rust/core/audio/interpreter/statements/condition.rs +72 -72
- package/rust/core/audio/interpreter/statements/function.rs +24 -24
- package/rust/core/audio/interpreter/statements/let_.rs +36 -36
- package/rust/core/audio/interpreter/statements/load.rs +17 -17
- package/rust/core/audio/interpreter/statements/loop_.rs +115 -115
- package/rust/core/audio/interpreter/statements/spawn.rs +51 -2
- package/rust/core/audio/interpreter/statements/trigger.rs +242 -239
- package/rust/core/audio/loader/trigger.rs +98 -98
- package/rust/core/audio/player.rs +70 -70
- package/rust/core/audio/special/mod.rs +9 -9
- package/rust/core/builder/mod.rs +129 -129
- package/rust/core/debugger/lexer.rs +27 -27
- package/rust/core/debugger/logs.rs +52 -52
- package/rust/core/debugger/preprocessor.rs +27 -27
- package/rust/core/debugger/store.rs +38 -38
- package/rust/core/lexer/driver.rs +59 -59
- package/rust/core/lexer/handler/arrow.rs +82 -82
- package/rust/core/lexer/handler/at.rs +21 -21
- package/rust/core/lexer/handler/brace.rs +41 -41
- package/rust/core/lexer/handler/colon.rs +21 -21
- package/rust/core/lexer/handler/comment.rs +30 -30
- package/rust/core/lexer/handler/dot.rs +21 -21
- package/rust/core/lexer/handler/driver.rs +337 -337
- package/rust/core/lexer/handler/identifier.rs +47 -47
- package/rust/core/lexer/handler/indent.rs +66 -66
- package/rust/core/lexer/handler/mod.rs +15 -15
- package/rust/core/lexer/handler/newline.rs +23 -23
- package/rust/core/lexer/handler/number.rs +31 -31
- package/rust/core/lexer/handler/operator.rs +46 -46
- package/rust/core/lexer/handler/parenthesis.rs +41 -41
- package/rust/core/lexer/handler/slash.rs +21 -21
- package/rust/core/lexer/handler/string.rs +63 -63
- package/rust/core/lexer/mod.rs +3 -3
- package/rust/core/mod.rs +9 -9
- package/rust/core/parser/driver/block.rs +111 -111
- package/rust/core/parser/driver/cursor.rs +82 -82
- package/rust/core/parser/driver/driver_impl.rs +21 -1
- package/rust/core/parser/driver/mod.rs +6 -6
- package/rust/core/parser/driver/parse_array.rs +120 -120
- package/rust/core/parser/driver/parse_map.rs +247 -223
- package/rust/core/parser/driver/parser.rs +160 -160
- package/rust/core/parser/handler/arrow_call.rs +65 -14
- package/rust/core/parser/handler/identifier/synth.rs +171 -135
- package/rust/core/parser/handler/mod.rs +9 -9
- package/rust/core/parser/handler/pattern.rs +24 -1
- package/rust/core/plugin/loader.rs +137 -137
- package/rust/core/plugin/mod.rs +2 -2
- package/rust/core/plugin/runner/non_wasm.rs +481 -297
- package/rust/core/plugin/runner/wasm32.rs +1 -0
- package/rust/core/preprocessor/loader/inject.rs +313 -278
- package/rust/core/preprocessor/loader/loader_helpers.rs +110 -110
- package/rust/core/preprocessor/loader/mod.rs +235 -235
- package/rust/core/preprocessor/module.rs +55 -55
- package/rust/core/preprocessor/processor/handlers.rs +107 -107
- package/rust/core/preprocessor/resolver/bank.rs +49 -49
- package/rust/core/preprocessor/resolver/call.rs +124 -124
- package/rust/core/preprocessor/resolver/condition.rs +95 -95
- package/rust/core/preprocessor/resolver/driver.rs +324 -324
- package/rust/core/preprocessor/resolver/function.rs +69 -69
- package/rust/core/preprocessor/resolver/group.rs +122 -122
- package/rust/core/preprocessor/resolver/let_.rs +32 -32
- package/rust/core/preprocessor/resolver/loop_.rs +318 -318
- package/rust/core/preprocessor/resolver/mod.rs +16 -16
- package/rust/core/preprocessor/resolver/pattern.rs +95 -83
- package/rust/core/preprocessor/resolver/spawn.rs +99 -99
- package/rust/core/preprocessor/resolver/synth.rs +54 -54
- package/rust/core/preprocessor/resolver/tempo.rs +48 -48
- package/rust/core/preprocessor/resolver/trigger.rs +116 -116
- package/rust/core/preprocessor/resolver/value.rs +176 -176
- package/rust/core/store/global.rs +57 -57
- package/rust/lib.rs +323 -323
- package/rust/macros/Cargo.toml +14 -0
- package/rust/macros/src/lib.rs +52 -0
- package/rust/main.rs +311 -142
- package/rust/types/Cargo.toml +1 -1
- package/rust/types/src/addons.rs +3 -1
- package/rust/types/src/config.rs +1 -3
- package/rust/utils/Cargo.toml +5 -2
- package/rust/utils/src/file.rs +397 -14
- package/rust/utils/src/path.rs +31 -2
- package/rust/utils/src/version.rs +38 -7
- package/rust/web/auth.rs +5 -0
- package/rust/web/forge.rs +5 -0
- package/rust/web/mod.rs +5 -3
- package/typescript/scripts/version/copy-to-binary.ts +82 -0
- package/rust/cli/bank/api.rs +0 -122
- package/rust/cli/bank/commands.rs +0 -306
- package/rust/cli/bank/mod.rs +0 -29
- package/rust/cli/install/bank.rs +0 -72
- package/rust/cli/install/commands.rs +0 -35
- package/rust/cli/install/mod.rs +0 -4
- package/rust/cli/install/plugin.rs +0 -80
|
@@ -1,69 +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
|
+
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,122 +1,122 @@
|
|
|
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
|
+
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,32 +1,32 @@
|
|
|
1
|
-
use crate::core::{
|
|
2
|
-
parser::statement::Statement,
|
|
3
|
-
preprocessor::{module::Module, resolver::value::resolve_value},
|
|
4
|
-
store::global::GlobalStore,
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
pub fn resolve_let(
|
|
8
|
-
stmt: &Statement,
|
|
9
|
-
name: &str,
|
|
10
|
-
module: &Module,
|
|
11
|
-
path: &str,
|
|
12
|
-
global_store: &mut GlobalStore,
|
|
13
|
-
) -> Statement {
|
|
14
|
-
let resolved_value = resolve_value(&stmt.value, module, global_store);
|
|
15
|
-
|
|
16
|
-
global_store
|
|
17
|
-
.variables
|
|
18
|
-
.set(name.to_string(), resolved_value.clone());
|
|
19
|
-
|
|
20
|
-
if let Some(current_mod) = global_store.modules.get_mut(path) {
|
|
21
|
-
current_mod
|
|
22
|
-
.variable_table
|
|
23
|
-
.set(name.to_string(), resolved_value.clone());
|
|
24
|
-
} else {
|
|
25
|
-
eprintln!("[resolve_statement] ❌ Module path not found: {path}");
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
Statement {
|
|
29
|
-
value: resolved_value,
|
|
30
|
-
..stmt.clone()
|
|
31
|
-
}
|
|
32
|
-
}
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::Statement,
|
|
3
|
+
preprocessor::{module::Module, resolver::value::resolve_value},
|
|
4
|
+
store::global::GlobalStore,
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
pub fn resolve_let(
|
|
8
|
+
stmt: &Statement,
|
|
9
|
+
name: &str,
|
|
10
|
+
module: &Module,
|
|
11
|
+
path: &str,
|
|
12
|
+
global_store: &mut GlobalStore,
|
|
13
|
+
) -> Statement {
|
|
14
|
+
let resolved_value = resolve_value(&stmt.value, module, global_store);
|
|
15
|
+
|
|
16
|
+
global_store
|
|
17
|
+
.variables
|
|
18
|
+
.set(name.to_string(), resolved_value.clone());
|
|
19
|
+
|
|
20
|
+
if let Some(current_mod) = global_store.modules.get_mut(path) {
|
|
21
|
+
current_mod
|
|
22
|
+
.variable_table
|
|
23
|
+
.set(name.to_string(), resolved_value.clone());
|
|
24
|
+
} else {
|
|
25
|
+
eprintln!("[resolve_statement] ❌ Module path not found: {path}");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
Statement {
|
|
29
|
+
value: resolved_value,
|
|
30
|
+
..stmt.clone()
|
|
31
|
+
}
|
|
32
|
+
}
|